1 분 소요

ReplicaSet

yaml 구성

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: echo-rs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: echo
      tier: app
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1

ReplicaSet 생성

# ReplicaSet 생성
$ kubectl apply -f echo-rs.yml

# 리소스 확인
$ kubectl get po,rs
NAME                READY   STATUS    RESTARTS   AGE
pod/echo-rs-tcdwj   1/1     Running   0          61s

NAME                      DESIRED   CURRENT   READY   AGE
replicaset.apps/echo-rs   1         1         1       61s

replicaset

ReplicaSet은 label을 체크해서 원하는 수의 Pod이 없으면 새로운 Pod을 생성합니다. 이를 설정으로 표현하면 다음과 같습니다.

정의 설명
spec.selector label 체크 조건
spec.replicas 원하는 Pod의 개수
spec.template 생성할 Pod의 명세

ReplicaSet 동작 원리

  1. ReplicaSet Controller는 ReplicaSet조건을 감시하면서 현재 상태와 원하는 상태가 다른 것을 체크
  2. ReplicaSet Controller가 원하는 상태가 되도록 Pod을 생성하거나 제거
  3. Scheduler는 API서버를 감시하면서 할당되지 않은unassigned Pod이 있는지 체크
  4. Scheduler는 할당되지 않은 새로운 Pod을 감지하고 적절한 노드node에 배치
  5. 이후 노드는 기존대로 동작

ReplicaSet은 ReplicaSet Controller가 관리하고 Pod의 할당은 여전히 Scheduler가 관리합니다.

Scale Out

yaml 파일의 replicas를 다수로 설정해 주면 수에 맞게 Pod를 복제할 수 있습니다.

# echo-rs-scaled.yml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: echo-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo
      tier: app
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
$ kubectl apply -f echo-rs-scaled.yml
# 또는
$ kubectl scale rs echo-rs --replicas=3
# 또는
$ kubectl edit rs echo-rs

# Pod 확인
$ kubectl get pod,rs

기존의 생성된 Pod 외에 2개가 추가로 생성됨.

NAME                READY   STATUS    RESTARTS   AGE
pod/echo-rs-h4q86   1/1     Running   0          11m
pod/echo-rs-4wk6t   1/1     Running   0          2m30s
pod/echo-rs-nkgf2   1/1     Running   0          2m30s

NAME                      DESIRED   CURRENT   READY   AGE
replicaset.apps/echo-rs   3         3         3       11m

# DESIRED : 설정한 replicas 수
# CURRENT : 현재 replicas 수
# READY : 현재 replicas 중 이용 가능한 replicas 수

ReplicaSet을 삭제하면 Pod도 함께 삭제된다.

$ kubectl delete rs echo-rs

pod는 삭제하지 않고 ReplicaSet만 삭제하려면

$ kubectl delete rs echo-rs --cascade=false

다만, ReplicaSet에 의해 통제되지 않는 단독 Pod로 남게된다.

Replication Controller

replicaSet과 거의 같은 개념으로 사용된다.

다만 ReplicaSet이 더 풍부한 selector를 가지고 있다.

Replication Controller는 label을 통해 replica를 관리한다.

아래는 예시 파일

apiVersion: apps/v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3
  selector:
    app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.14
# replicas 변경시

$ kubectl scale rc echo-rs --replicas=3
# rc=replication controller
또는
$ kubectl edit rc echo-rs
# vim editor를 통해 수정

다만, replicas controller는 replicas 개수만 충족 한다면 정상으로 동작하기 때문에,

image의 version 정보를 바꾸더라도 바뀌지 않고, 이전 version의 pod가 그대로 동작함.

pod를 종료한 후 재시작 하면 바뀐 version의 pod로 재시작됌.

ReplicationController vs ReplicaSet

ReplicaSet은 다양한 Selector를 지원

RelicationController
spec:
  replicas: 3
  selector: # label과 version만 support함
    app: webui 
    version: "2.1"
...
ReplicaSet
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
    matchExpressions:
    - {key: version, opratior: In, value:["2.1", "2.2"] }
    # option
    - {key: version, tier, environment ...
    - {opatior: In = key와 value를 지정하여 일치하는 Pod만 연결
                NotIn = key는 일치 value는 일치하지 않는 Pod에 연결
                Exists = key에 맞는 label의 pod를 연결
                DoesNotExist = key와 다른 label의 pod를 연결

컨트롤러의 종류

컨트롤러

댓글남기기