코알못

[kubernetes] ReplicaSet 실습 - pod 수 조정, 롤백 본문

ETC

[kubernetes] ReplicaSet 실습 - pod 수 조정, 롤백

코린이s 2023. 5. 20. 18:09
728x90

이번 실습 시간에는 1) Pod 수 조정하는 실습과 2) 롤백하는 실습을 진행해보도록 한다.

1) Pod 수 조정하는 실습

우선 replicaset 생성할 수 있는 파일을 만든다.

# replicaset-v3.yaml

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

아래와 같이 적용하고 확인해보면 label app 이 붙은 pod 가 하나 뜬것을 볼 수 있다.

$ kubectl apply -f replicaset-v3.yaml
replicaset.apps/myapp created
$ kubectl get pod --show-labels
NAME          READY   STATUS    RESTARTS   AGE   LABELS
myapp-kcfm8   1/1     Running   0          56s   app=my-app

 

이제 설정 중에 label env 를 추가 해보자! 

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

수정 사항을 클러스터에 배포 하고

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

확인해보면 이전 실습과 같이 이미 떠있는 파드의 경우 설정이 반영되지 않고 떠있는것을 볼 수 있다.

$ kubectl get pod --show-labels
NAME          READY   STATUS    RESTARTS   AGE     LABELS
myapp-kcfm8   1/1     Running   0          2m30s   app=my-app

 

이제 replicas 를 1개 > 3개로 변경하여 scale 명령어를 통해 변경 하도록 한다.

$ kubectl scale rs myapp --replicas=3
replicaset.apps/myapp scaled

파드를 확인해보면 새로운 파드 두개가 생성 되었으며 새로 생성된 파드만 변경사항이 적용 되었다!

$ kubectl get pod --show-labels
NAME          READY   STATUS    RESTARTS   AGE     LABELS
myapp-598cm   1/1     Running   0          32s     app=my-app,env=prod
myapp-kcfm8   1/1     Running   0          2m30s   app=my-app
myapp-lmrlb   1/1     Running   0          32s     app=my-app,env=prod

다시 scale 을 통해 파드 수를 3개 > 1개로 수정하며

$ kubectl scale rs myapp --replicas=1
replicaset.apps/myapp scaled

나중에 생성된 파드가 제거 되는것을 볼 수 있다.

$ kubectl get pod --show-labels
NAME          READY   STATUS    RESTARTS   AGE     LABELS
myapp-kcfm8   1/1     Running   0          3m53s   app=my-app

scale을 통해 이번에는 파드를 0개로 만든다!

확인해보면 파드는 제거되고 replicaset은 남아 있는것을 볼 수 있다.

이처럼 replicaset 은 유지하고 파드를 제거 할 수도있다.

$ kubectl scale rs myapp --replicas=0
replicaset.apps/myapp scaled
$ kubectl get pod --show-labels
No resources found in default namespace.
$ kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
myapp   0         0         0       4m59s

이제 실습을 완료 하였으니 해당 오브젝트를 모두 제거한다.

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

2) 롤백하는 실습

다음 실습은 장애가 발생했을때 ReplicaSet을 통해 롤백하는 방법을 알아보자!

두가지 방법을 생각할 수 있다.

1. label 을 이용한 방법

- 롤백할 이미지 버전으로 yaml 파일을 수정한다.

- 기존 파드의 라벨을 변경하여 ReplicaSet 관리 범주에서 벗어나도록 한다.

- 기존 파드가 관리 범주에 벗어나 현재 파드 수가 0개로 감지 되므로 새 버전 파드가 생성된다.

2. scale 을 이용한 방법

- 롤백할 이미지 버전으로 yaml 파일을 수정한다.

- scale 0으로 수정하여 기존 버전을 모두 제거한다.

- scale 을 이용하여 pod 수를 정의 하여 새 버전으로 파드를 띄운다.

2번은 이전시간에 scale 사용 방법에 대해서 알아보았기에 이번 시간에서는 1번만 진행해보도록 한다!

아래와 같이 replicaset 파일을 생성하며 이미지는 5번 호출하면 오류를 리턴하는 이미지 파일이다.

# replicaset-v4.yaml

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

아래와 같이 클러스터에 적용 하고 파드를 보면 정상적으로 3개가 생성 되었다.

$kubectl apply -f replicaset-v4.yaml
replicaset.apps/myapp-replicaset created
$ kubectl get pod -L app
NAME                     READY   STATUS    RESTARTS   AGE   APP
myapp-replicaset-4fgt9   1/1     Running   0          17s   my-app
myapp-replicaset-h5c6x   1/1     Running   0          17s   my-app
myapp-replicaset-j9468   1/1     Running   0          17s   my-app

포트 포워딩을 걸어두고

$ kubectl port-forward rs/myapp-replicaset 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

컨테이너를 5번 호출하면 아래와 같이 오류 메세지 crashed 를 볼 수 있다.

$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9

$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9

$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9

$ curl localhost:8080
Welcome to Version 2!
===== Host Info =====
HostIP: 10.100.3.17
HostName: myapp-replicaset-4fgt9

$ curl localhost:8080
"Crashed! Please fix me."

이제 롤백할 이미지로 변경하며 파일을 변경하여 apply 해도 되지만 아래와 같이 명령어를 통해서도 가능하다.

kubectl set image rs/[ReplicaSet name] [container name]=[image]

실제로 클러스터에 호출하여 이미지를 변경하며 ReplicaSet 정보를 보면 정상적으로 이미지가 변경 된것을 확인 할 수 있다.

$ kubectl set image rs/myapp-replicaset my-app=yoonjeong/my-app:1.0
replicaset.apps/myapp-replicaset image updated
$ kubectl get rs myapp-replicaset -o wide
NAME               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
myapp-replicaset   3         3         3       7m16s   my-app       my-app:1.0   app=my-app

그 기존 파드의 라벨을 변경하여 replicaset의 관리 범주에서 벗어나게 할 것이며

그 전에 현재 관리 범주 안에 있는지 확인 하면 정상적으로 소유자인 ReplicaSet name 이 나온다. 

$ kubectl get pod myapp-replicaset-4fgt9 -o jsonpath="{.metadata.ownerReferences[0].name}"
myapp-replicaset%

이제 하나의 떠있는 파드의 lable을 변경 한다.

$ kubectl label pod myapp-replicaset-4fgt9 app=tb-be-fixed --overwrite
pod/myapp-replicaset-4fgt9 labeled

관리 범주에서 벗어났는지 명령어 호출해보면 안나오는것을 보아 정상적으로 벗어 남을 확인 할 수 있다.

$ kubectl get pod myapp-replicaset-4fgt9 -o jsonpath="{.metadata.ownerReferences[0].name}"

이제 나머지 파드로 라벨을 수정하여 모든 파드를 제외 시킨다.

$ kubectl label pod myapp-replicaset-h5c6x app=tb-be-fixed --overwrite
pod/myapp-replicaset-h5c6x labeled
$ kubectl label pod myapp-replicaset-j9468 app=tb-be-fixed --overwrite
pod/myapp-replicaset-j9468 labeled

이제 파드 정보를 모두 보면 기존 3개의 파드는 라벨이 변경되어 관리 범주에 벗어나 현재 파드수가 0개로 인식되며

새로운 이미지가 적용된 파드가 3개 생성된것을 볼 수 있다.

$ kubectl get pod --show-labels
NAME                     READY   STATUS    RESTARTS   AGE   LABELS
myapp-replicaset-4fgt9   1/1     Running   0          13m   app=tb-be-fixed
myapp-replicaset-frmt4   1/1     Running   0          15s   app=my-app
myapp-replicaset-h5c6x   1/1     Running   0          13m   app=tb-be-fixed
myapp-replicaset-hkdlb   1/1     Running   0          15s   app=my-app
myapp-replicaset-j9468   1/1     Running   0          13m   app=tb-be-fixed
myapp-replicaset-tw2fj   1/1     Running   0          15s   app=my-app

포트 포워딩을 하여 정상적으로 호출 되는지 보면

$ kubectl port-forward rs/myapp-replicaset 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

아래와 같이 버전 1로 정상 호출 되는것을 볼 수 있다.

$ curl localhost:8080
Welcome to Version 1!

===== Host Info =====
HostIP: 10.100.2.14
HostName: myapp-replicaset-frmt4

이제 실습이 완료 되었으니 오브젝트 모두 제거한다.

$ kubectl delete rs/myapp-replicaset
replicaset.apps "myapp-replicaset" deleted
$ kubectl delete pod --all
pod "myapp-replicaset-4fgt9" deleted
pod "myapp-replicaset-h5c6x" deleted
pod "myapp-replicaset-j9468" deleted

정상적으로 제거 된것을 볼 수 있다.

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

끝!

728x90
Comments