쿠버네티스/도커(파드 업데이트, 복구하기)

맹민재·2022년 10월 15일
0

파드를 운영하다 보면 컨테이너에 새로운 기능을 추가하거나 치명적인 버그가 발생해 버전을 업데이트해야 할 때가 있다. 또는 업데이트하는 도중 문제가 발생해 다시 기존 버전으로 복구해야 하는 일도 발생한다. 이런 경우 어떻게 처리하는지 확인해 본다.


파드 업데이트하기

1. 컨테이너 버전 업데이트를 테스트하기 위한 파드 배포

kubectl apply -f ~/_Book_k8sInfra/ch3/3.2.10/rollout-nginx.yaml --record

--record 옵션은 매우 중요한 옵션으로, 배포한 정보의 히스토리를 기록한다.

2. record 옵션으로 기록된 히스토리는 rollout history 명령을 실행해 확인할 수 있다

kubectl rollout history deployment rollout-nginx

3. 배포한 파드 정보 확인

kubectl get pods \
-o=custom-columns=Name:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName

4. 배포된 파드에 속해 있는 nginx 컨테이너 버전을 curl -I(헤더 정보만 보여주는 옵션)명령으로 확인

curl -I --silent 172.16.132.12 | grep Server

5. set image 명령으로 파드의 nginx 컨테이너 버전을 1.16.0으로 업데이트한다. (--record로 실행한 명령 기록)

kubectl set image deployment \
rollout-nginx nginx=nginx:1.16.0 --record

6. 업데이트한 후에 파드의 상태 확인

파드들의 이름과 IP가 변경됐다.

파드는 언제라도 지우고 다시 만들 수 있다. 따라서 파드에 속한 nginx 컨테이너를 업데이트하는 가장 쉬운 방법은 파드를 관리하는 replicas의 수를 줄이고 늘려 파드를 새로 생성하는 것이다. 이때 시스템의 영향을 최소화하기 위해 replicas에 속한 파드를 모두 한 번에 지우는 것이 아니라 파드를 하나씩 순차적으로 지우고 생성한다. 이때 파드 수가 많으면 하나씩이 아니라 다수의 파드가 업데이트된다. 업데이트 기본값은 전체의 1/4이며, 최소값은 1개이다.

7. Deployment의 상태 확인

kubectl rollout status deployment rollout-nginx

8. rollout history 명령을 실행해 rollout-nginx에 적용된 명령들을 확인

9. curl -I 명령으로 업데이트가 제대로 이루어졌는지 확인


업데이트 실패 시 파드 복구하기

1. set image 명령으로 nginx 컨테이너 버전을 의도(1.17.2)와 다르게 1.17.23으로 입력

kubectl set image deployment \
rollout-nginx nginx=nginx:1.17.23 --record

2. 파드가 삭제되지 않고 pending(대기 중) 상태에서 넘어가지 않는다.

3. rollout status를 실행해 어떤 문제인지 확인

kubectl rollout status deployment rollout-nginx

4. describe 명령으로 문제점 자세히 살펴보기

kubectl describe deployment rollout-nginx

확인결과 replicas가 새로 생성되는 과정에서 멈춰 있다. 이유는 1.17.23 버전의 nginx 컨테이너가 없기 때문이다. 따라서 replicas가 생성을 시도했으나 컨테이너 이미지를 찾을 수 없어서 디플로이먼트가 배포되지 않는다. 실제로 배포할때 이런 실수 할 가능성이 충분히 있으므로 업데이트 할 때 rollout을 사용하고 --record로 기록하는 것이다.

5. 정상적인 상태로 복구하기 위해 rollout history 확인

6. rollout undo로 명령 실행을 취소해 전 단계 상태로 복구

kubectl rollout undo deployment rollout-nginx

7. 파드 상태 확인

8. rollout history로 실행된 명령을 확인

revision 2가 삭제되고 revision 4가 추가된 것을 확인할 수 있다. 현재 상태를 revision 2로 되돌렸기 때문에 revision 2는 삭제되고 가장 최근 상태는 revision 4가 된다.


특정 시점으로 파드 복구하기

바로 전 상태가 아니라 특정 시점으로 돌아가고 싶을때는 --to-revision 옵션을 사용한다.

1. 처음 상태인 revision 1로 돌아간다.

kubectl rollout undo deployment rollout-nginx --to-revision=1

2. 새로 생성된 파드들의 IP 확인

3. curl -I로 nginx 컨테이너 버전 확인

처음 상태로 정상적으로 복구된 것을 확인할 수 있다.

profile
ㄱH ㅂrㄹ ㅈr

0개의 댓글