클라우드 엔지니어는 기능이 자주 추가되는 중요한 애플리케이션을 유지보수하는 작업을 담당합니다. 사용자 영향 및 애플리케이션 다운타임을 최소화하면서 새로운 기능과 업데이트를 출시해야 합니다. 애플리케이션은 컨테이너화되어 Kubernetes에 배포됩니다. 일부 경우에는 사용자 수요 변화에 따라 수직 확장 및 축소가 필요합니다. 또한 인터넷에서 애플리케이션으로 전송되는 트래픽을 제어해야 합니다. 애플리케이션을 유지보수 및 업데이트할 때 고려할 사항은 다음과 같습니다.
클러스터의 배포 매니페스트를 어떻게 만들까요?
배포에서 포드 수를 수동으로 확장하려면 어떻게 해야 할까요?
애플리케이션에 대한 인바운드 트래픽을 제어하는 서비스를 만들려면 어떻게 해야 할까요?
사용자 중단을 최소화하여 업데이트를 출시하려면 어떻게 해야 할까요?
전체 출시를 완료하기 전 새 기능을 테스트하기 위해 카나리아 배포를 수행하려면 어떻게 해야 할까?
Azure Kubernetes Service(AKS) 사용에 익숙한 클라우드 전문가는 YAML 매니페스트 파일을 사용하여 AKS에서 Kubernetes 배포를 실행한 경험이 있을 것입니다. DevOps 파이프라인을 사용해서 애플리케이션 코드와 컨테이너를 Kubernetes 클러스터에 제공했을 가능성이 높습니다.
수요에 따라 포드 수를 확장하려면 매니페스트 파일을 수동으로 변경하거나 kubectl 명령어를 사용하면 됩니다. 애플리케이션에 대한 인바운드 트래픽을 제어하기 위해서는 DevOps 파이프라인에서 부하 분산기 배포 계획을 작성하고 실행합니다. 컨테이너 이미지를 업데이트해야 할 경우에는 DevOps 파이프라인을 실행하여 컨테이너 이미지를 제공하고 kubectl 명령어를 사용해서 배포 출시를 트리거합니다.
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 4m
작업 3. 배포 출시 및 배포 롤백 트리거하기
배포의 출시는 배포의 포드 템플릿(.spec.template)이 변경된 경우에만 트리거됩니다(예: 템플릿의 라벨 또는 컨테이너 이미지가 업데이트된 경우). 배포 확장과 같은 다른 업데이트는 출시를 트리거하지 않습니다.
이 작업에서는 배포 출시를 트리거한 다음 배포 롤백을 트리거합니다.
배포 출시 트리거
배포의 nginx 버전을 업데이트하려면 다음 명령어를 실행합니다.
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.9.1 --record
그러면 배포의 컨테이너 이미지가 nginx v1.9.1로 업데이트됩니다.
출시 상태를 보려면 다음 명령어를 실행합니다.
kubectl rollout status deployment.v1.apps/nginx-deployment
출력은 다음 예와 같이 표시됩니다.
출력:
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 1 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 2 out of 3 new replicas updated...
Waiting for rollout to finish: 1 old replicas pending termination...
Waiting for rollout to finish: 1 old replicas pending termination...
deployment "nginx-deployment" successfully rolled out
변경된 것을 확인하려면 배포 목록을 가져옵니다.
kubectl get deployments
출력은 다음 예와 같이 표시됩니다.
출력:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 6m
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
배포의 nginx 버전 업데이트
배포의 출시 기록을 봅니다.
kubectl rollout history deployment nginx-deployment
이전 작업에서 배포한 nginx 서비스의 매니페스트에서는 라벨 선택기를 사용하여 app: nginx 라벨이 있는 포드를 타겟팅합니다. 일반 배포와 새 카나리아 배포에는 모두 app: nginx 라벨이 있습니다. 인바운드 연결은 서비스에 의해 일반 및 카나리아 배포 포드 모두에 배포됩니다. 카나리아 배포에는 일반 배포보다 복제본(포드) 수가 적으므로 일반 배포보다 적은 수의 사용자가 사용할 수 있습니다.
구성 파일을 기반으로 카나리아 배포를 만듭니다.
kubectl apply -f nginx-canary.yaml
배포가 완료되면 nginx 및 nginx-canary 배포가 모두 있는지 확인합니다.
kubectl get deployments
외부 LoadBalancer 서비스 IP에 연결된 브라우저 탭으로 다시 전환하고 페이지를 새로고침합니다. 표준 Welcome to nginx 페이지가 계속 표시됩니다.
외부 LoadBalancer 서비스 IP에 연결된 브라우저 탭으로 다시 전환하고 페이지를 새로고침합니다. 서비스가 트래픽을 카나리아 배포로 자동 분산하고 있음을 보여주는 표준 Welcome to nginx 페이지가 계속 표시됩니다.
내 진행 상황 확인하기를 클릭하여 목표를 확인합니다.
카나리아 배포 만들기
세션 어피니티
실습에서 사용되는 서비스 구성은 단일 클라이언트의 모든 요청이 항상 동일한 포드에 연결되도록 보장하지 않습니다. 각 요청은 개별적으로 처리되며 일반 nginx 배포 또는 nginx-canary 배포에 연결할 수 있습니다.
카나리아 릴리스의 기능이 크게 변경된 경우 다른 버전 간 전환으로 인해 문제가 발생할 수 있습니다. 이를 방지하려면 클라이언트의 첫 번째 요청이 모든 후속 연결에 사용할 포드를 결정하도록 서비스 사양에서 sessionAffinity 필드를 ClientIP로 설정하면 됩니다.