웹사이트 검색

Kubernetes의 롤링 업데이트 및 롤백


이 페이지에서

  1. 전제 조건
  2. 무엇을 할 것인가?\n
  3. 롤링 업데이트 및 롤백
  4. 결론

배포 사용의 이점 중 하나는 롤링 업데이트를 수행하고 롤링 업데이트 전략을 생성하는 기능입니다. 롤링 업데이트를 통해 포드 구성을 점진적으로 업데이트할 수 있습니다.

업데이트 전략(k8s rollingupdate, k8s 업데이트 전략)은 롤링 업데이트를 구성하는 가장 중요한 옵션입니다. 배포 정의에서 spec.strategy.type에는 두 가지 가능한 값이 있습니다.

  • RollingUpdate: 새 포드가 점진적으로 추가되고 기존 포드가 점진적으로 종료됩니다.
  • 재생성: 새 포드가 추가되기 전에 이전 포드가 모두 한 번에 종료됩니다.\n

RollingUpdate를 사용하여 배포를 업데이트하는 동안 2가지 옵션이 더 있습니다.

  • maxSurge: 업데이트 중에 원하는 팟 수 이상으로 생성할 수 있는 팟 수입니다.\n
  • maxUnavailable: 업데이트 프로세스 중에 사용할 수 없는 포드 수입니다.\n

배포 롤링 업데이트를 사용하여 배포에 사용되는 이미지를 업그레이드할 수 있습니다. 배포 상태(kubectl 롤아웃 상태)가 저장되어 이전 배포 버전으로 롤백할 수 있습니다.

전제 조건

  1. 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
    Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.\n

어떻게 할까요?

  1. 지속적인 업데이트 및 롤백

롤링 업데이트 및 롤백

배포 포드 템플릿을 사용하여 Nginx용 배포 정의 파일을 생성합니다. 여기서는 Nginx 버전을 "nginx:1.14.2"로 지정했습니다.

vim my-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rolling-update-demo
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

기존 포드를 확인하고 배포를 생성해 보겠습니다.

kubectl get pods
kubectl create -f my-deployment.yml

방금 생성한 배포의 세부 정보를 가져옵니다. 이 배포는 4개의 포드를 생성하고 복제 세트에 의해 제어됩니다.

kubectl get deployments
kubectl get pods
kubectl  get replicaset

위의 스크린샷에서 복제 세트 1개와 복제 세트에 의해 제어되는 포드 4개가 있는 배포 1개가 있음을 알 수 있습니다.

이제 Nginx 버전을 "nginx:1.14.2"에서 "nginx:1.61.1"로 변경해 보겠습니다.

vim my-deployment.yml

배포에 변경 사항을 적용하고 pod, replicaset 및 배포에 대한 세부정보를 가져옵니다.

kubectl apply -f my-deployment.yml
kubectl get pods
kubectl get deployments
kubectl get replicaset

위의 스크린샷에서 새 복제 세트가 생성되었고 그 아래에 4개의 팟(Pod)이 있음을 볼 수 있습니다. 그러나 포드가 0개인 이전 복제 세트가 여전히 표시됩니다.

이제 Nginx 버전을 다시 변경하지만 이번에는 잘못된 Nginx 버전을 제공하면 잘못된 버전에 대한 Nginx 이미지가 존재하지 않으므로 배포에 실패합니다.

vim my-deployment.yml

배포에 변경 사항을 적용해 보겠습니다.

kubectl apply -f my-deployment.yml
kubectl get pods
kubectl get deployments

이제 복제본 세부 정보를 가져오도록 하겠습니다.

kubectl get replicaset

위의 스크린샷에서 새 포드가 "ErrImagePull" 오류와 함께 실패하는 것을 볼 수 있습니다. 버전 "ngin:1.1.1"에 대한 Nginx 이미지가 없기 때문에 팟(Pod)이 실패합니다.

이제 이전 작업 이미지로 돌아가려면 롤아웃 상태가 양호하지 않으면 이전 버전으로 롤백할 수 있습니다.

롤백하려면 먼저 다음 명령을 사용하여 배포의 배포 롤아웃 롤아웃 기록을 가져올 수 있습니다.

kubectl rollout history deployments rolling-update-demo

이제 "--revision=2"와 함께 다음 명령을 사용하여 "--revision=2"에 있는 배포의 세부정보를 확인할 수 있습니다.

kubectl rollout history deployments rolling-update-demo --revision=2

위의 스크린샷에서 실패한 Nginx 버전 "ngin:1.1.1"로 배포를 업데이트하기 전에 작동하던 Nginx 이미지 버전 "nginx:1.16.1"이 개정판-2에 있음을 확인할 수 있습니다.

이제 배포를 현재 실패한 배포 이전의 마지막 버전으로 롤백하겠습니다.

kubectl get deployments
kubectl rollout undo deployment rolling-update-demo
kubectl get pods
kubectl get replicaset

위의 스크린샷에서 최신 배포를 되돌렸으며 이제 마지막 업데이트 이전에 작동했던 배포 개정이 있음을 알 수 있습니다.

배포에 대해 자세히 알아보려면 다음 명령을 사용하여 설명할 수 있습니다.

kubectl get deployments
kubectl describe deployment rolling-update-demo

결론

이 도움말에서는 배포를 만들고 업데이트하는 단계를 확인했습니다. 어떤 이유로 인해 배포가 실패할 경우 배포를 롤백하는 방법을 확인했습니다. 여기에서 실패한 배포에 대해 표시된 오류는 "ErrImagePull"입니다. 배포에서 최신 업데이트를 유지하지 않으려는 경우 배포가 롤백할 수 있는 개정판을 유지하는 방법을 살펴보았습니다.