[Retry, k8s] 03. 워크로드 API - 레플리카셋/레플리케이션 컨트롤러

Date:     Updated:

카테고리:

태그:

[Retry, k8s] 03. 워크로드 API - 레플리카셋/레플리케이션 컨트롤러



🔔 레플리카셋/레플리케이션 컨트롤러

레플리카셋/레플리케이션 컨트롤러는 파드의 레프리카를 생성하고 지정한 파드 수를 유지하는 리소스이다. (레플리카셋이 생성하는 파드는 “레플리카셋 이름-임의의 문자열”으로 명명된다.)


📜 레플리카셋 생성

cat <<EOF > sample-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16
EOF
# 리플리카셋 확인
$ kubectl get replicasets -o wide
NAME        DESIRED   CURRENT   READY   AGE   CONTAINERS        IMAGES       SELECTOR
sample-rs   3         3         3       17s   nginx-container   nginx:1.16   app=sample-app

# 레플리카셋이 파드 관리에 사용하는 레이블을 지정하여 파드 목록 표시
$ kubectl get pod -l app=sample-app -o wide
NAME              READY   STATUS    RESTARTS   AGE     IP          NODE         NOMINATED NODE   READINESS GATES
sample-rs-24rgb   1/1     Running   0          3m10s   10.44.0.3   k8s-node01   <none>           <none>
sample-rs-lkqk5   1/1     Running   0          3m10s   10.44.0.2   k8s-node01   <none>           <none>
sample-rs-slw6w   1/1     Running   0          3m10s   10.36.0.3   k8s-node02   <none>           <none>


📜 파드 정지와 자동화된 복구

레플리카셋에서는 노드나 파드에 장애가 발생했을 때 지정한 파드 수를 유지하기 위해 다른 노드에서 파드를 기동시켜 주기 때문에 장애 시에도 많은 영향을 받지 않는다.

$ kubectl get pod -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP          NODE         NOMINATED NODE   READINESS GATES
sample-rs-7bsjk   1/1     Running   0          15s   10.44.0.2   k8s-node01   <none>           <none>
sample-rs-8nc9h   1/1     Running   0          15s   10.36.0.1   k8s-node02   <none>           <none>
sample-rs-wrtm5   1/1     Running   0          15s   10.44.0.1   k8s-node01   <none>           <none>

# 레플리카셋에 의해 관리되는 파드들 모두 삭제
$ kubectl delete pod --all
pod "sample-rs-7bsjk" deleted
pod "sample-rs-8nc9h" deleted
pod "sample-rs-wrtm5" deleted

# 다시 생성된 것을 확인
$ kubectl get pod -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP          NODE         NOMINATED NODE   READINESS GATES
sample-rs-5cj4p   1/1     Running   0          3s    10.36.0.2   k8s-node02   <none>           <none>
sample-rs-jwf5z   1/1     Running   0          3s    10.44.0.1   k8s-node01   <none>           <none>
sample-rs-qm8k7   1/1     Running   0          3s    10.36.0.1   k8s-node02   <none>           <none>

# 레플리카셋 상세 정보, 레플리카셋의 파드 수 증감 이력 확인할 수 있음
$ kubectl describe replicaset sample-rs
Name:         sample-rs
Namespace:    default
Selector:     app=sample-app
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=sample-app
  Containers:

<~ 생략 ~>


📜 레플리카셋과 레이블

레플리카셋은 파드를 모니터링하여 파드 수를 조정하는데, 모니터링은 특정 레이블을 가진 파드 수를 계산하는 형태로 이루어 진다. (레플리카 수가 부족한/많은 경우 매니페스트에 기술한 spec.template로 파드를 생성/삭제한다.)

# 레플리카셋의 셀렉터와 파드의 레이블이 일치하지 않을 경우, 에러가 발생하여 생성할 수 없게됨
cat <<EOF > sample-rs-fail.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-rs-fail
spec:
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app-fail
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16
EOF

$ kubectl apply -f sample-rs-fail.yaml
The ReplicaSet "sample-rs-fail" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"sample-app-fail"}: `selector` does not match template `labels`
# 레플리카셋의 셀렉터와 일치하는 레이블을 가진 파드를 따로 생성했을 경우, 초과된 레플리카 수를 감지하여 삭제한다.
cat <<EOF > cat sample-rs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-rs-pod
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.16
EOF

$ kubectl apply -f sample-rs.yaml

$ kubectl apply -f sample-rs-pod.yaml

$ kubectl get pods -L app
NAME              READY   STATUS        RESTARTS   AGE   APP
sample-rs-5cj4p   1/1     Running       0          19m   sample-app
sample-rs-jwf5z   1/1     Running       0          19m   sample-app
sample-rs-pod     1/1     Terminating   0          2s    sample-app
sample-rs-qm8k7   1/1     Running       0          19m   sample-app


📜 레플리카셋과 스케일링

(a) 수정한 매니페스트로 kubectl apply 명령을 수행

$ sed -i -e 's|replicas: 3|replicas: 4|' sample-rs.yaml

$ kubectl apply -f sample-rs.yaml
replicaset.apps/sample-rs configured

$ kubectl get replicasets
NAME        DESIRED   CURRENT   READY   AGE
sample-rs   4         4         4       32m

(b) kubectl scale 명령을 사용하는 경우

$ kubectl scale replicaset sample-rs --replicas 5
replicaset.apps/sample-rs scaled

$ kubectl get replicasets
NAME        DESIRED   CURRENT   READY   AGE
sample-rs   5         5         5       34m


KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기