본문 바로가기
서버인프라/kubernetes

[제 4강] ReplicaSet

by techwold ted 2022. 12. 21.

목적은 주어진 시간에 실행되는 안정적인 복제본 포드 세트를 유지하는 것입니다. 이와 같이, 동일한 포드의 지정된 수의 가용성을 보장하기 위해 사용 됩니다.

 

복제본 세트의 작동 방식

ReplicaSet는 원하는 수에 도달하기 위해 필요에 따라 포드를 만들고 삭제함으로써 목적을 달성합니다. 복제 세트는 새 포드를 만들어야 할 때 해당 포드 템플릿을 사용합니다.

상세한 사항은 아래 링크에서 확인 하시길 바라며 테스트를 진행해 보겠습니다.

우선 아래와 같은 이름으로 yaml파일 하나를 만듭니다.

vi test-replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: web-front
        image: nginx:1.18
kubectl create -f test-replicaset.yaml

아래와 같이 3개가 실행 된 모습을 확인 할 수 있습니다. 여기서 frontend-kvq57 의 이름을 가진 pod하나를 삭제하려 한다면 어떤 반응이 생기는지 확인해 보겠습니다.

kubectl delete pods frontend-kvq57

yaml파일에서 설정한 것 처럼 replicas를 3개를 유지하기위해 항상 컨트롤러가 바라보고 있다가 다시 재 생성 해버립니다.

아래와 같이 AGE 17s 으로 삭제 후 다시 실행 된 것을 알 수 있습니다.

root@master:~# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   3         3         3       3m32s

위와 같이 replica의 상태를 확인 하실 수 있습니다. 그리고 아래와 같이 입력하시면 replica의 상태를 상세히 확인 할 수 있습니다.

root@master:~# kubectl describe rs/frontend
Name:         frontend
Namespace:    default
Selector:     tier=frontend
Labels:       app=guestbook
              tier=frontend
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  tier=frontend
  Containers:
   web-front:
    Image:        nginx:1.18
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  4m53s  replicaset-controller  Created pod: frontend-kvq57
  Normal  SuccessfulCreate  4m53s  replicaset-controller  Created pod: frontend-g64d2
  Normal  SuccessfulCreate  4m53s  replicaset-controller  Created pod: frontend-j8rvd
  Normal  SuccessfulCreate  2m48s  replicaset-controller  Created pod: frontend-xfv27

여기서 주요 기능 중 scale라는 기능이 있습니다. 우리가 scale 조절 할 수 있는 것이죠 아래와같이 명령을 입력하면 

kubectl scale rs frontend  --replicas=2

pod가 2개로 변한 것을 확인 하실 수 있습니다. 그럼 replica상태를 확인해 보겠습니다.

root@master:~# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   2         2         2       13m

 

위에 보신대로 원하는 pod와 현재의 pod 그리고 준비상태의 pod 역시 2로 되어 있습니다. replicaset을 삭제하려면 scale를 0으로 바꾸면 될까요??

0으로 변경했더니 다음과 같습니다. 마치 다 삭제 된것처럼 보이죠^^? 하지만 아래와 같이 확인해 보면 frontend라는 replicas Name이 그대로 인 것을 알 수 있습니다. 여기서 만약 다시 scale을 1로 변경하거나 하면 다시 생성이 되겠죠.

root@master:~# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
frontend   0         0         0       37m

그럼 완전히 삭제해 보겠습니다.

root@master:~# kubectl delete rs frontend
replicaset.apps "frontend" deleted
root@master:~# kubectl get rs
No resources found in default namespace.

삭제된 모습을 보실 수 있습니다. 

댓글