Replica Set 뜯어보기

타미·2023년 4월 4일
0

Hello Kubernetes

목록 보기
4/5
post-thumbnail

Replica Set이란?

파드 인스턴스 개수를 유지하는 쿠버네티스 컨트롤러

+) Deployment (권장): Replica Set을 관리

Replica Set 실행하기

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset
        image: nginx
        ports:
        - containerPort: 80
  replicas: 3
  selector:
    matchLabels:
      app: nginx-replicaset
> kubectl get replicaset,pods
NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-replicaset       3         3         3       8s

NAME                             READY   STATUS             RESTARTS        AGE
pod/nginx-replicaset-ftzx2       1/1     Running            0               8s
pod/nginx-replicaset-j7pdf       1/1     Running            0               8s
pod/nginx-replicaset-kr9zr       1/1     Running            0               8s

파드 인스턴스 3개를 생성한 것을 볼 수 있다.

Replica Set Status - CURRENT, REDAY

  • DESIRED : (Replica set에서 관리) 목표로 하는 파드의 개수
  • CURRENT: 생성된 파드의 개수
  • READY: 사용할 수 있는 준비가 된 파드의 개수
    • CURRENT >= REDAY
    • CURRENT가 존재하는 이유는, 파드를 생성하고 있는 중인 것을 Replica Set이 인지하지 못할 경우, 파드를 추가로 만들 수 있기 때문

example 1

kubectl get replicaset,pods
NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-replicaset       3         3         2       7s

NAME                             READY   STATUS              RESTARTS        AGE
pod/nginx-replicaset-ftzx2       0/1     ContainerCreating   0               7s
pod/nginx-replicaset-j7pdf       1/1     Running             0               7s
pod/nginx-replicaset-kr9zr       1/1     Running             0               7s
  • CURRENT 3
    • ContainerCreating 1
    • Running 2
  • REDAY 2
    • Running 2

pod를 만들고 있을 때(ContainerCreating)엔 REDAY 상태에서 제외됨!

example 2

kubectl get replicaset,pods
NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-replicaset       3         3         0       14s

NAME                             READY   STATUS             RESTARTS      AGE
pod/nginx-replicaset-cpj8h       0/1     ErrImagePull       0             14s
pod/nginx-replicaset-dtvtr       0/1     ErrImagePull       0             14s
pod/nginx-replicaset-qqhjz       0/1     ErrImagePull       0             14s
  • CURRENT 3
    • ErrImagePull 3
  • REDAY 0

이미지 이름이 이상해서 파드가 정상적으로 실행중이지 않을 경우 (ErrImagePull), REDAY 상태에서 제외됨
ReplicaSet은 파드가 삭제되었을 때, 지정된 개수를 맞추기 위해서 다시 생성한다. 어떤 이유(어플리케이션 문제)로 컨테이너가 Crash하거나 Image를 다운 받지 못하거나 할 때에 재시도하려면 pod 설정을 수정하면 된다.
spec.template.spec.containers.imagePullPolicy 이나 livenessProbe restartPolicy 등을 이용해서 재시도할 수 있다.

Replica Set Update하기

Replica Set에서 replicas 값을 변경하면 파드의 개수를 조정한다.
하지만, 컨테이너 정보를 수정하는 게 즉각 반영되지 않는다.

example

1. replica set 생성

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: nginx-replicaset
        image: nginx
        ports:
        - containerPort: 80
  • nginx-replicaset (spec.containser.image:nginx)
    • nginx-replicaset-dlqwz
    • nginx-replicaset-kpp8n
    • nginx-replicaset-p2tfz

2. 컨테이너 정보 변경해도, 기존 파드가 바뀌지 않는다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-replicaset
spec:
  template:
    metadata:
      name: nginx-replicaset
      labels:
        app: nginx-replicaset
    spec:
      containers:
      - name: busybox # 갱신
        image: busybox #갱신
        ports:
        - containerPort: 80
> kubectl describe rs nginx-replicaset
Name:         nginx-replicaset
...
Pod Template:
  Labels:  app=nginx-replicaset
  Containers:
   busybox:
    Image:        busybox #변경됨
    
# Image를 바꿨음에도 새로 파드를 삭제했다는 이벤트 이력을 볼 수 없다.
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  34s   replicaset-controller  Created pod: nginx-replicaset-kpp8n
  Normal  SuccessfulCreate  34s   replicaset-controller  Created pod: nginx-replicaset-dlqwz
  Normal  SuccessfulCreate  34s   replicaset-controller  Created pod: nginx-replicaset-p2tfz
  • replica set 정보를 조회하면 갱신된 것을 볼 수 있다.
  • 하지만 파드는 아까 만든 파드 그대로임 (새로 생성되지 않음)
    • nginx-replicaset-dlqwz (ngix image)
    • nginx-replicaset-kpp8n (ngix image)
    • nginx-replicaset-p2tfz (ngix image)

3. 파드를 삭제하면, 새로운 컨테이너 정보로 생성된다.

> kubectl delete pod nginx-replicaset-p2tfz 
pod "nginx-replicaset-p2tfz" deleted

>  kubectl get pods -o wide                  
NAME                         READY   STATUS              RESTARTS       AGE   IP           NODE       NOMINATED NODE   READINESS GATES
nginx-replicaset-dlqwz       1/1     Running             0              52s   172.17.0.8   minikube   <none>           <none>
nginx-replicaset-kpp8n       1/1     Running             0              52s   172.17.0.6   minikube   <none>           <none>
nginx-replicaset-pjxzx       0/1     ContainerCreating   0              3s    <none>       minikube   <none>           <none>
  • 마지막 파드 nginx-replicaset-pjxzx 새로 생성되고 있음
  • 조회하면 replica set에 새로 수정한 image 정보인 것을 확인할 수 있다.
kubectl describe pod nginx-replicaset-pjxzx    
...
Containers:
  busybox:
    Image:          busybox
...
profile
IT's 호기심 천국

0개의 댓글

관련 채용 정보