본문 바로가기
CICD

[Kubernetes] Replication Controller, ReplicaSet(Controller)

by 장중앙 2022. 1. 7.

Kubernetes Controller

서비스를 관리하고 운영하는데 도움을 줌

  • Auto Healing
    • Node 또는 Node 위의 Pod에 이상이 발생할 경우 Kubernetes에서 장애를 인지, 다른 Node에 새로운 Pod 생성
  • Auto Scaling
    • 리소스가 Limit상태일때 인지하고 Pod를 추가하여 부하를 분산(안정적인 상태 유지 가능)
  • Software Update
    •  여러 Pod에 대해 버전 업그레이드 경우, Controller로 한번에 쉽게 가능하며 Rollback기능 지원
  • Job
    • 일시적인 작업이 필요한 경우, Controller가 새로운 Pod를 만들어 필요한 경우에만 작업을 수행하고 Pod를 삭제

 

Replication Controller이란

쿠버네티스 초기부터 있었던 컨트롤러

Pod를 관라하며, 개수가 항상 일정하게 유지

 

ReplicaSet이란

기존의 Replication Controller가 한층 발전된 컨트롤러

Replication Controller와 거의 동일한 역할을 하며, 추가로 집합 기반의 Selector를 지원

버전관리 기능을 지원하지 않기 때문에 버전관리를 위해서는 Deployment를 함께 사용해야 함

 

 

Replication Controller, ReplicaSet의 주요기능

1. Template

  • Controller와 Pod는 Label과 Selector로 연결가능
  • Controller를 만들 때, 연결할 Pod의 내용을 Template에 기입
  • 이러한 Template를 이용해 Pod가 죽었을 때, 재생성이 가능
    • 이러한 기능을 통해 버전 업그레이드가 가능함 

Template yaml 작성 예시

 

 

2. Replicas

  • 설정한 Replicas만큼 Pod의 수를 유지
    • 설정한 수가 만족되게끔 재생성(Scale Out)
  • 이를 이용해서 Pod와 Replicas를 Controller만 이용하여 한번에 생성 가능

 

3. Selector

  • Replication Controller에 없으며, ReplicaSet에만 있는 기능
  • 기존의 Selector에 두가지 추가적인 속성 존재
    1. matchLabels
      • 해당 Label을 가진 Pod를 컨트롤 할 것을 명시하는 것
    2. matchExpressions
      • Key, Value의 디테일한 컨트롤 가능
      • 만들어진 오브젝트를 연결하기 때문에 잘 사용하지는 않음
      • matchExpressions의 4가지 속성
        • Exists : 정한 Key의 값을 가진 Pod를 연결
        • DoesNotExists : 정한 Key의 값을 제외한 Pod를 연결
        • In : Key, Values를 지정하여 포함하는 값이 있는 Pod를 연결
        • NotIn : Key, Values를 지정하여 포함하지 않는 값이 있는 Pod를 연결

ReplicaSet - Selector yaml 작성 예시


ReplicaSet 실습

1. Template 실습

Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  labels:
    type: web
spec:
  containers:
  - name: container
    image: kubetm/app:v1
  terminationGracePeriodSeconds: 0

생성된 Pod를 Template로 ReplicaSet생성

  - Pod 삭제시 기본적으로 30초 후에 삭제되게끔 되어 있기 때문에 이러한 텀을 없애기 위해 terminationGracePeriodSeconds: 0으로 설정

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 1
  selector:
    matchLabels:
      type: web
  template:
    metadata:
      name: pod1
      labels:
        type: web
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 0

 

ReplicaSet의 Pod 수를 2로 수정 -> 해당 ReplicaSet의 Pod가 추가됨


2. Controller 업데이트 실습(Replication Controller -> ReplicaSet)

Replication Controller를 이용하여 컨트롤러와 2개의 Pod 생성

apiVersion: v1
kind: ReplicationController
metadata:
  name: replication1
spec:
  replicas: 2
  selector:
    cascade: "false"
  template:
    metadata:
      labels:
        cascade: "false"
    spec:
      containers:
      - name: container
        image: kubetm/app:v1

 

Pod를 유지하면서, Controller를 삭제(Console에서 명령 실행)

kubectl delete replicationcontrollers <replication Controller Name> --cascade=false

Replication Contoller는 삭제되었지만, Pod는 유지되는 것을 확인

 

ReplicaSet 생성

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica2
spec:
  replicas: 2
  selector:
    matchLabels:
      cascade: "false"
  template:
    metadata:
      labels:
        cascade: "false"
    spec:
      containers:
      - name: container
        image: kubetm/app:v1

 

기존의 Pod가 새로 생성한 ReplicaSet에 연결된 것을 확인

    - 단,  연결까지 시간이 소요


3. Selector 실습

ReplicaSet 생성

    - Selector의 Label과 Template의 Label에 포함되지 않을 경우 Error 발생

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replica1
spec:
  replicas: 1
  selector:
    matchLabels:
      type: web
      ver: v1
    matchExpressions:
    - {key: type, operator: In, values: [web]}
    - {key: ver, operator: Exists}
  template:
    metadata:
      labels:
        type: web
        ver: v1
        location: dev
    spec:
      containers:
      - name: container
        image: kubetm/app:v1
      terminationGracePeriodSeconds: 0

생성된 ReplicaSet과 Pod 확인

 

 

댓글