코알못

[kubernetes] ReplicaSet 실습 - pod 종료, template 수정 본문

ETC

[kubernetes] ReplicaSet 실습 - pod 종료, template 수정

코린이s 2023. 5. 20. 14:48
728x90

이번 시간에는 1) pod를 임의로 종료 하였을시 어떻게 ReplicaSet이 동작하는지 확인 하는 실습과 2) template를 수정하는 실습을 진행해보도록 한다!

1) pod를 임의로 종료 하였을시 어떻게 ReplicaSet이 동작하는지 확인 하는 실습

우선 ReplicaSet으로 Pod 를 생성한다! 

아래와 같이 yaml 파일을 작성하고

# replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: blue-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: blue-app
  template:
    metadata:
      labels:
        app: blue-app
    spec:
      containers:
      - name: blue-app
        image: yoonjeong/blue-app:1.0
        ports:
        - containerPort: 8080
        env:
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"

클러스터에 적용 한다!

$ kubectl apply -f replicaset.yaml
replicaset.apps/blue-replicaset created

정상적으로 생성 되었는지 확인하면 정상임을 알 수 있다.

$ kubectl get rs blue-replicaset
NAME              DESIRED   CURRENT   READY   AGE
blue-replicaset   3         3         3       52s

파드를 -w(watch 모드)로 보면서 확인 하도록 하며 해당 옵션을 사용하면 실시간으로 상태를 확인 할 수 있다.

$ kubectl get pod -w
NAME                    READY   STATUS    RESTARTS   AGE
blue-replicaset-jzhdl   1/1     Running   0          71s
blue-replicaset-tqmqn   1/1     Running   0          71s
blue-replicaset-wqpmc   1/1     Running   0          71s

파드 하나를 삭제해보자!

$ kubectl delete pod blue-replicaset-jzhdl
pod "blue-replicaset-jzhdl" deleted

파드 상태를 보면 삭제한 'jzhdl' 파드가 종료 되는 동시에 'hsn2f' 파드가 생성 되는것을 볼 수 있다.

$ kubectl get pod -w
NAME                    READY   STATUS    RESTARTS   AGE
blue-replicaset-jzhdl   1/1     Running   0          71s
blue-replicaset-tqmqn   1/1     Running   0          71s
blue-replicaset-wqpmc   1/1     Running   0          71s
blue-replicaset-jzhdl   1/1     Terminating   0          107s
blue-replicaset-hsn2f   0/1     Pending       0          0s
blue-replicaset-hsn2f   0/1     Pending       0          0s
blue-replicaset-hsn2f   0/1     ContainerCreating   0          0s
blue-replicaset-jzhdl   0/1     Terminating         0          108s
blue-replicaset-jzhdl   0/1     Terminating         0          108s
blue-replicaset-jzhdl   0/1     Terminating         0          108s
blue-replicaset-hsn2f   1/1     Running             0          10s

replicaSet 동작을 상세하게 보기위해 describe 명령어를 사용하며

Events 부분에서 'hsn2f'가 Replicaset에 의해 생성된 것임을 알 수 있다.

$ kubectl describe rs blue-replicaset
Name:         blue-replicaset
Namespace:    default
Selector:     app=blue-app
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=blue-app
  Containers:
   blue-app:
    Image:      yoonjeong/blue-app:1.0
    Port:       8080/TCP
    Host Port:  0/TCP
    Limits:
      cpu:     50m
      memory:  64Mi
    Environment:
      NODE_NAME:   (v1:spec.nodeName)
      NAMESPACE:   (v1:metadata.namespace)
      POD_IP:      (v1:status.podIP)
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  3m44s  replicaset-controller  Created pod: blue-replicaset-wqpmc
  Normal  SuccessfulCreate  3m44s  replicaset-controller  Created pod: blue-replicaset-jzhdl
  Normal  SuccessfulCreate  3m44s  replicaset-controller  Created pod: blue-replicaset-tqmqn
  Normal  SuccessfulCreate  117s   replicaset-controller  Created pod: blue-replicaset-hsn2f

이제 replicaSet 을 삭제해보자!

$ kubectl delete rs blue-replicaset
replicaset.apps "blue-replicaset" deleted

삭제하게 되면 ReplicaSet이 관리하고 있는 pod도 삭제 되며 ReplicaSet도 정상적으로 제거 됐음을 알 수 있다.

$ kubectl get pod
No resources found in default namespace.
$ kubectl get rs
No resources found in default namespace.

만약 ReplicaSet 오브젝트만 삭제하고 Pod를 남겨 둘 수 있을까?

정답은 Yes 로 실습을 통해 알아보자!

아래와 같이 ReplicaSet 을 다시 생성하고

$ kubectl apply -f replicaset.yaml
replicaset.apps/blue-replicaset created

파드와 ReplicaSet을 확인하면 정상적으로 생성 됨을 확인할 수 있다.

% kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
blue-replicaset-42z5p   1/1     Running   0          19s
blue-replicaset-8mf5g   1/1     Running   0          19s
blue-replicaset-pklsv   1/1     Running   0          19s
$ kubectl get rs
NAME              DESIRED   CURRENT   READY   AGE
blue-replicaset   3         3         3       3m32s

해당 파드가 replicaSet에 의해 관리 되고 있는지 확인 하는 방법이 있는데 아래와 같이 jsonpath 또는 yaml 형식으로 확인 가능하다.

우선 yaml 로 보면 metadata.ownerReference[0].name을 보면 소유자가 blue-replicaset 임을 알 수 있다.

$ kubectl get pod blue-replicaset-42z5p -o yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2023-05-20T06:24:48Z"
  generateName: blue-replicaset-
  labels:
    app: blue-app
  name: blue-replicaset-42z5p
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: blue-replicaset
..

jsonpath로 본다고 하면 yaml에서 확인했던 경로를 정의하여 특정값을 볼 수도 있으며 해당 파드의 소유자는 blue-replicaset 으로 ReplicaSet에 의해 관리됨을 알 수 있다.

$ kubectl get pod blue-replicaset-42z5p -o jsonpath="{.metadata.ownerReferences[0].name}"
blue-replicaset

이제 파드는 유지하고 ReplicaSet 오브젝트만 삭제한다!

--cascase 옵션을 이용하면 되며 'orphan'(고아) 값을 주면 파드가 고아가 되어 소유자인 ReplicaSet 만 삭제 된다.

$ kubectl delete rs blue-replicaset --cascade=orphan
replicaset.apps "blue-replicaset" deleted

아래와 같이 확인하면 ReplicaSet 만 삭제되고 파드는 유지됨을 알 수 있다.

$ kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
blue-replicaset-42z5p   1/1     Running   0          4m7s
blue-replicaset-8mf5g   1/1     Running   0          4m7s
blue-replicaset-pklsv   1/1     Running   0          4m7s
$ kubectl get rs
No resources found in default namespace.

파드의 소유자를 다시 확인하면 값이 나오지 않으며 이를 통해 어떠한 ReplicaSet에도 관리 되고 있지 않는 다는것을 확인 할 수 있다.

$ kubectl get pod blue-replicaset-42z5p -o jsonpath="{.metadata.ownerReferences[0].name}"

 

이제 다음 실습은 Pod를 죽이지 않고 yaml 파일을 수정하여 Pod 수를 조정해보도록 하자!

ReplicaSet 생성 하는 yaml 파일의 replica 수를 3개 > 2개로 변경한다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: blue-replicaset
spec:
  replicas: 2

클러스터에 적용한다.

$ kubectl apply -f replicaset.yaml
replicaset.apps/blue-replicaset created

파드를 확인하면 기존에 띄워져 있던 파드가 사라지고 2개만 띄워져 있음을 알 수 있다.

$ kubectl get pod
NAME                    READY   STATUS    RESTARTS   AGE
blue-replicaset-8mf5g   1/1     Running   0          7m30s
blue-replicaset-pklsv   1/1     Running   0          7m30s

상세 정보를 보면 삭제된 파드 이벤트만 보이는데 이유는

이미 파드가 고아로 3개 남겨져 있는 상태에서 ReplicaSet 을 띄웠으니 파드를 생성하지 않았으므로 이벤트 발생하지 않았고

여기서 ReplicaSet Pod 수가 2개이므로 하나의 파드를 삭제하는 이벤트만 발생한 것이다.

$ kubectl describe rs blue-replicaset
Name:         blue-replicaset
Namespace:    default
Selector:     app=blue-app
Labels:       <none>
Annotations:  <none>
Replicas:     2 current / 2 desired
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=blue-app
  Containers:
   blue-app:
    Image:      yoonjeong/blue-app:1.0
    Port:       8080/TCP
    Host Port:  0/TCP
    Limits:
      cpu:     50m
      memory:  64Mi
    Environment:
      NODE_NAME:   (v1:spec.nodeName)
      NAMESPACE:   (v1:metadata.namespace)
      POD_IP:      (v1:status.podIP)
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulDelete  41s   replicaset-controller  Deleted pod: blue-replicaset-42z5p

이제 실습을 완료 하였으니 모든 오브젝트를 삭제 하도록 한다.

$ kubectl delete rs blue-replicaset
replicaset.apps "blue-replicaset" deleted
$ kubectl get pod
No resources found in default namespace.
$ kubectl get rs
No resources found in default namespace.

 

이제 두번째 실습을 진행해본다!

이를 통해 알고자 하는것은 기존에 배포된 파드에 대해서는 변경사항이 적용되지 않으며 새로 생성된 파드에 대해서만 변경 사항이 적용된다는점이다.

2) template를 수정하는 실습

우선 RelpicaSet 을 먼저 생성한다.

# replicaset-v2.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-replicaset
spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 2
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: yoonjeong/my-app:1.0
        ports:
        - containerPort: 8080
        resources:
          limits:
            memory: "64Mi"
            cpu: "50m"

클러스터에 적용하고 확인 하면 정상적으로 파드가 생성 되었음을 알 수 있다.

$ kubectl apply -f replicaset-v2.yaml
replicaset.apps/myapp-replicaset created
$ kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
myapp-replicaset-d2cnk   0/1     ContainerCreating   0          5s
myapp-replicaset-rrslc   0/1     ContainerCreating   0          5s
$ kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
myapp-replicaset-d2cnk   1/1     Running   0          24s
myapp-replicaset-rrslc   1/1     Running   0          24s

 

이제 파드 설정을 수정 해보도록 하자!

아래와 같이 spec.template.labels에 env 라벨을 추가한다.

#  replicaset-v2.yaml

spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 2
  template:
    metadata:
      labels:
        app: my-app
        env: prod

추가 한 부분을 적용하기 위해 apply 명령어를 입력한다.

$ kubectl apply -f replicaset-v2.yaml
replicaset.apps/myapp-replicaset configured

파드를 보면 라벨의 변화가 없으며 이는 이미 생성된 파드에 대해서 변경 사항이 적용되지 않음을 의미한다.

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
myapp-replicaset-d2cnk   1/1     Running   0          3m12s   app=my-app
myapp-replicaset-rrslc   1/1     Running   0          3m12s   app=my-app

우리는 새로 파드를 생성하기 위해 기존에 떠있던 파드를 제거한다.

$ kubectl delete pod myapp-replicaset-d2cnk
pod "myapp-replicaset-d2cnk" deleted

ReplicaSet 이벤트 정보를 보면 새로운 '6g2gt' 파드를 생성한것을 볼 수 있다.

$ kubectl describe rs myapp-replicaset
Name:         myapp-replicaset
Namespace:    default
Selector:     app=my-app
Labels:       <none>
Annotations:  <none>
Replicas:     2 current / 2 desired
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=my-app
           env=prod
  Containers:
   my-app:
    Image:      yoonjeong/my-app:1.0
    Port:       8080/TCP
    Host Port:  0/TCP
    Limits:
      cpu:        50m
      memory:     64Mi
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  5m28s  replicaset-controller  Created pod: myapp-replicaset-rrslc
  Normal  SuccessfulCreate  5m28s  replicaset-controller  Created pod: myapp-replicaset-d2cnk
  Normal  SuccessfulCreate  114s   replicaset-controller  Created pod: myapp-replicaset-6g2gt

새로 생성된 파드에 대해 변경 사항이 적용됐는지 라벨을 확인하면 env 라벨이 추가된 파드가 생성 되었음을 알 수 있다.

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
myapp-replicaset-6g2gt   1/1     Running   0          68s     app=my-app,env=prod
myapp-replicaset-rrslc   1/1     Running   0          4m42s   app=my-app

끝!

728x90
Comments