파드를 운영하다 보면 컨테이너에 새로운 기능을 추가하거나 치명적인 버그가 발생해 버전을 업데이트해야 할 때가 있다. 또는 업데이트하는 도중 문제가 발생해 다시 기존 버전으로 복구해야 하는 일도 발생한다. 이런 경우 어떻게 처리하는지 확인해 본다.
kubectl apply -f ~/_Book_k8sInfra/ch3/3.2.10/rollout-nginx.yaml --record
--record 옵션은 매우 중요한 옵션으로, 배포한 정보의 히스토리를 기록한다.
kubectl rollout history deployment rollout-nginx
kubectl get pods \
-o=custom-columns=Name:.metadata.name,IP:.status.podIP,STATUS:.status.phase,NODE:.spec.nodeName
curl -I --silent 172.16.132.12 | grep Server
kubectl set image deployment \
rollout-nginx nginx=nginx:1.16.0 --record
파드들의 이름과 IP가 변경됐다.
파드는 언제라도 지우고 다시 만들 수 있다. 따라서 파드에 속한 nginx 컨테이너를 업데이트하는 가장 쉬운 방법은 파드를 관리하는 replicas의 수를 줄이고 늘려 파드를 새로 생성하는 것이다. 이때 시스템의 영향을 최소화하기 위해 replicas에 속한 파드를 모두 한 번에 지우는 것이 아니라 파드를 하나씩 순차적으로 지우고 생성한다. 이때 파드 수가 많으면 하나씩이 아니라 다수의 파드가 업데이트된다. 업데이트 기본값은 전체의 1/4이며, 최소값은 1개이다.
kubectl rollout status deployment rollout-nginx
kubectl set image deployment \
rollout-nginx nginx=nginx:1.17.23 --record
kubectl rollout status deployment rollout-nginx
kubectl describe deployment rollout-nginx
확인결과 replicas가 새로 생성되는 과정에서 멈춰 있다. 이유는 1.17.23 버전의 nginx 컨테이너가 없기 때문이다. 따라서 replicas가 생성을 시도했으나 컨테이너 이미지를 찾을 수 없어서 디플로이먼트가 배포되지 않는다. 실제로 배포할때 이런 실수 할 가능성이 충분히 있으므로 업데이트 할 때 rollout을 사용하고 --record로 기록하는 것이다.
kubectl rollout undo deployment rollout-nginx
revision 2가 삭제되고 revision 4가 추가된 것을 확인할 수 있다. 현재 상태를 revision 2로 되돌렸기 때문에 revision 2는 삭제되고 가장 최근 상태는 revision 4가 된다.
바로 전 상태가 아니라 특정 시점으로 돌아가고 싶을때는 --to-revision 옵션을 사용한다.
kubectl rollout undo deployment rollout-nginx --to-revision=1
처음 상태로 정상적으로 복구된 것을 확인할 수 있다.