Deployment의 역할: Deployment는 ReplicaSet을 관리하며, 궁극적으로 Pod를 제어한다. Deployment를 생성하면 그 아래에 ReplicaSet이 생성되고 이 ReplicaSet이 지정된 수의 Pod를 유지한다. 따라서 Deployment와 ReplicaSet 모두 최종적으로 Pod를 생성하고 관리하는 역할을 한다
Deployment 사용 이유: ReplicaSet이 제공하지 않는 추가적인 기능을 지원하기 때문에 대부분의 경우 ReplicaSet 대신 Deployment를 사용하게 된다
Revision (버전 관리): Deployment의 가장 중요한 특징 중 하나는 ReplicaSet 자원을 버전 별로 관리할 수 있다는 것이다. Deployment의 spec.template 부분 (즉, Pod 템플릿)의 내용이 변경될 때마다 새로운 ReplicaSet을 생성하여 버전을 관리한다. 예를 들어, Nginx 이미지 버전을 1.0에서 2.0으로 변경하고 kubectl apply를 실행하면, Deployment는 새로운 ReplicaSet을 만들고 이전 버전의 ReplicaSet은 유지하면서 Pod를 갱신한다
무중단 배포: Deployment의 기본 배포 전략은 롤링 업데이트이다. 이는 서비스 중단 없이 애플리케이션 버전을 갱신하는 무중단 배포 방식이다
동적 방식: 새로운 버전의 Pod를 먼저 생성하고 완전히 준비될 때까지 기다린다. 새로운 Pod가 성공적으로 실행되면, 기존 버전의 Pod를 순차적으로 종료시킨다. 이 과정을 통해 사용자 입장에서는 서비스 중단 없이 새로운 버전의 서비스를 이용할 수 있다
Nginx Pod의 빠른 교체: Nginx와 같이 가벼운 Pod의 경우, 새로운 Pod가 매우 빠르게 준비되기 때문에 기존 Pod가 종료되는 과정이 눈에 띄지 않을 수 있다. Spring 컨테이너와 같이 시작 시간이 더 오래 걸리는 애플리케이션에서는 롤링 업데이트 과정을 더 명확하게 관찰할 수 있다
롤백 (Rollback)기능
과거 버전으로 복원: Deployment는 Revision 관리를 통해 쉽게 과거 버전으로 롤백할 수 있는 기능을 제공한다. 새로운 버전 배포 후 문제가 발생했을 경우, 이전 안정적인 버전으로 신속하게 되돌릴 수 있다
명령어: kubectl rollout undo deployment <deployment-name> -n <namespace> 명령어를 사용하여 직전 Revision으로 롤백할 수 있다. 특정 Revision으로 돌아가고 싶다면 to-revision 옵션을 사용할 수 있다
latest 태그 이미지 관리 및 kubectl rollout restart 활용
latest 태그의 문제점: latest 태그는 항상 최신 이미지를 가리키지만, Deployment의 spec.template내 image 필드에 nginx (즉, nginx:latest와 동일)와 같이 태그를 명시하지 않고 사용하거나, 태그 자체가 변경되지 않으면 Kubernetes는 Pod 템플릿의 내용이 변경되지 않았다고 판단하여 새로운 ReplicaSet을 생성하지 않는다.
Pod 갱싱 필요성: 이 경우, Docker Registry에 latest 태그의 이미지는 갱신되었더라도, Kubernetes 클러스터의 Pod는 여전히 이전 버전의 latest 이미지를 사용하게 되어 버전 불일치 문제가 발생할 수 있다
kubectl rollout restart 활용: Deployment의 spec.template 내용 변경 없이 새로운 ReplicaSet을 강제로 생성하고 Pod를 갱신해야 할 때 kubectl rollout restart 명령어를 사용한다. 이 명령어는 Deployment의 템플릿 내용이 변경되지 않았더라도 강제로 새로운 Revision을 만들고 이에 따라 새로운 Pod를 생성하여 최신 latest 이미지를 Pull 받도록 한다
실무 활용: 실무에서는 이미지 태그를 v1.0, v2.0 등 명확하게 지정하는 것이 일반적이지만, latest 태그를 사용하거나 다른 이유로 Pod 템플릿 내용 변경 없이 Pod를 갱신해야 할 경우 kubectl rollout restart가 유용하게 사용된다.
실습 명령어 요약
Deployment 및 Service 생성
kubectl apply -f nginx_deployment.yml
ReplicaSet 확인
kubectl get replicaset -n hyeok
Deployment 확인
kubectl get deployment -n hyeok
Pod 확인
kubectl get pod -n hyeok
Nginx 버전 변경 후 apply
yaml의 Nginx Image 버전 변경
image: nginx:1.21.6 -> nginx:1.22.1 # 버전 변경
kubectl apply -f nginx_deployment.yml
configured 로그가 찍혀있다. 설종 변경 되었음을 의미한다
ReplicaSet 확인
kubectl get replicaset -n hyeok
기존 ReplicaSet의 desired current ready는 없어지고(0으로 변경) 새로운 ReplicaSet의 desired current ready는 변경(2)되었다