지속적 업데이트 수행

이 페이지에서는 Google Kubernetes Engine에서 애플리케이션을 위한 지속적 업데이트를 수행하는 방법을 설명합니다.

개요

지속적 업데이트를 수행하면 클러스터에서 이미지, 구성, 라벨, 주석, 작업 부하의 리소스 제한/요청을 업데이트할 수 있습니다. 지속적 업데이트는 리소스 포드를 새 항목으로 점진적으로 대체하며, 이러한 리소스 포드는 사용 가능한 리소스로 노드에 예약됩니다. 지속적 업데이트는 다운타임 없이 작업 부하를 업데이트하도록 디자인되었습니다.

다음 객체는 Kubernetes 작업 부하를 나타냅니다. 해당 포드 템플릿을 업데이트하여 이러한 작업 부하에서 지속적 업데이트를 트리거할 수 있습니다.

  • DaemonSets
  • Deployments
  • StatefulSets

이러한 각 객체에는 객체 매니페스트의 spec: template 필드로 표시된 포드 템플릿이 포함됩니다. 포드 템플릿 필드에는 컨트롤러가 원하는 상태 또는 동작을 실현하기 위해 만드는 포드 사양이 포함됩니다. 객체의 spec: template을 업데이트하여 업데이트 출시를 트리거합니다.

포드 템플릿에는 다음 필드가 포함되어 있습니다.

포드 템플릿에 대해 자세히 알아보려면 PodTemplateSpec 문서를 참조하세요.

포드 템플릿 외부에서 리소스를 확장하거나 필드를 업데이트하면 출시가 트리거되지 않습니다.

시작하기 전에

이 작업을 준비하려면 다음 단계를 수행하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 지역 클러스터를 사용하는 경우 기본 컴퓨팅 지역을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

애플리케이션 업데이트

다음 섹션에서는 Google Cloud Platform 콘솔 또는 kubectl을 사용하여 애플리케이션을 업데이트하는 방법을 설명합니다.

kubectl set

kubectl set를 사용하여 객체의 image, resources(CPU 및 메모리와 같은 컴퓨팅 리소스) 또는 selector 필드를 변경할 수 있습니다.

예를 들어 배포를 nginx 버전 1.7.9에서 1.9.1로 업데이트하려면 다음 명령어를 실행합니다.

kubectl set image deployment nginx nginx=nginx:1.9.1

kubectl set image 명령어는 배포 포드의 nginx 이미지를 한 번에 하나씩 업데이트합니다.

또 다른 예로, 배포의 리소스 요청 및 제한을 설정하려면 다음을 사용하세요.

kubectl set resources deployment nginx --limits cpu=200m,memory=512Mi --requests cpu=100m,memory=256Mi

또는 배포의 리소스 요청을 삭제하려면 다음을 사용하세요.

kubectl set resources deployment nginx --limits cpu=0,memory=0 --requests cpu=0,memory=0

kubectl apply

kubectl apply를 사용하면 신규 또는 업데이트된 매니페스트 파일을 적용하여 객체를 업데이트할 수 있습니다.

새로운 매니페스트 파일을 적용하려면 다음 명령어를 실행하세요.

kubectl apply -f [MANIFEST]

여기서 [MANIFEST]는 업데이트된 매니페스트 파일입니다.

콘솔

애플리케이션의 라이브 구성을 편집하려면 다음 단계를 수행하세요.

  1. GCP 콘솔에서 Google Kubernetes Engine 작업 부하 메뉴로 이동합니다.

    작업 부하 메뉴로 이동

  2. 원하는 작업 부하를 선택합니다.

  3. 수정을 클릭합니다.

  4. 편집기를 사용해서 객체 라벨 또는 포드 템플릿을 원하는 대로 변경합니다.

  5. 저장을 클릭합니다.

업데이트 출시 관리

kubectl rollout을 사용하면 출시가 일시 중지될 때 이를 조사하고, 출시를 재개하고, 업데이트를 롤백하고, 객체의 출시 기록을 확인할 수 있습니다.

kubectl rollout status로 출시 조사

kubectl rollout status 명령어를 사용하여 출시 상태를 조사할 수 있습니다.

예를 들어 다음 명령어를 실행하여 nginx 배포 출시를 조사할 수 있습니다.

kubectl rollout status deployment nginx

출력은 다음과 비슷합니다.

Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx" successfully rolled out

출시가 성공한 후 kubectl get deployment nginx를 실행하여 모든 포드가 실행 중인지 확인합니다. 출력은 다음과 비슷합니다.

NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx              3         3         3            3           36s

출시 일시 중지 및 재개

kubectl rollout pause를 사용하면 출시를 일시 중지할 수 있습니다.

예를 들어 nginx 배포 출시를 일시 중지하려면 다음 명령어를 실행하세요.

kubectl rollout pause deployment nginx

재개하려면 다음 명령어를 실행하세요.

kubectl rollout resume deployment nginx

kubectl rollout history로 출시 기록 보기

kubectl rollout history를 사용하면 객체의 출시 기록을 볼 수 있습니다.

예를 들어 nginx 배포의 출시 기록을 보려면 다음 명령어를 실행하세요.

kubectl rollout history deployment nginx

세 번째 개정판 기록을 보려면 다음 명령어를 실행하세요.

kubectl rollout history deployment nginx --revision 3

kubectl rollout undo로 업데이트 롤백

kubectl rollout undo 명령어를 사용하여 객체 출시를 롤백할 수 있습니다.

예를 들어 nginx 배포의 이전 버전으로 롤백하려면 다음 명령어를 실행하세요.

kubectl rollout undo deployments nginx

또는 다른 예로 배포의 세 번째 개정판으로 롤백하려면 다음 명령어를 실행하세요.

kubectl rollout undo deployment nginx --to-revision 3

StatefulSets 및 DaemonSets 고려 사항

Kubernetes 1.7 이후의 StatefulSets와 Kubernetes 1.6 이후의 DaemonSets에서는 컨테이너, 라벨, 리소스 요청/제한, 포드 주석에 대한 자동화된 지속적 업데이트를 구성하고 사용 중지하기 위한 업데이트 전략이 사용됩니다. 업데이트 전략은 updateStrategy 필드를 사용하여 구성됩니다.

updateStrategy 필드에는 OnDelete 또는 RollingUpdate 값을 사용할 수 있습니다.

OnDeleteupdateStrategy가 지정되지 않은 경우의 기본 동작입니다. OnDelete는 컨트롤러가 해당 포드를 자동으로 업데이트하지 못하도록 방지합니다. 변경 사항을 반영해서 컨트롤러가 새 포드를 만들도록 하려면 포드를 수동으로 삭제해야 합니다. OnDelete는 포드를 수동으로 업데이트하려는 경우에 유용합니다.

RollingUpdate는 StatefulSet에서 포드의 자동화된 지속적 업데이트를 구현합니다. RollingUpdate는 컨트롤러가 한 번에 하나씩 각 포드를 삭제하고 다시 만들도록 합니다. 업데이트된 포드가 실행되고 준비될 때까지 기다린 후 다음 항목을 업데이트합니다.

StatefulSet 컨트롤러는 StatefulSet 보장을 적용하면서 모든 포드를 역순으로 업데이트합니다.

RollingUpdate 전략 사용

RollingUpdate 전략을 사용하면 StatefulSet 또는 DaemonSet에서 모든 포드를 자동으로 업데이트할 수 있습니다.

예를 들어 web StatefulSet를 패치하여 RollingUpdate 전략을 적용하려면 다음 명령어를 실행하세요.

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"rollingUpdate"}}}'

그런 후 StatefulSet의 spec.template을 변경합니다. 예를 들어 kubectl set를 사용하여 컨테이너 이미지를 변경할 수 있습니다. 다음 예에서 web StatefulSet는 해당 nginx 컨테이너가 nginx-slim:0.7 이미지를 실행하도록 설정됩니다.

kubectl set image statefulset web nginx=nginx-slim:0.7

nginx 컨테이너를 실행하는 StatefulSet의 포드가 업데이트되는지 확인하려면 다음 명령어를 실행하세요.

kubectl get pods -l app=nginx -w

출력은 다음과 비슷합니다.

NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          7m
web-1     1/1       Running   0          7m
web-2     1/1       Running   0          8m
web-2     1/1       Terminating   0         8m
web-2     1/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Pending   0         0s
web-2     0/1       Pending   0         0s
web-2     0/1       ContainerCreating   0         0s
web-2     1/1       Running   0         19s
web-1     1/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Pending   0         0s
web-1     0/1       Pending   0         0s
web-1     0/1       ContainerCreating   0         0s
web-1     1/1       Running   0         6s
web-0     1/1       Terminating   0         7m
web-0     1/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Pending   0         0s
web-0     0/1       Pending   0         0s
web-0     0/1       ContainerCreating   0         0s
web-0     1/1       Running   0         10s

StatefulSet의 포드는 역순으로 업데이트됩니다. StatefulSet 컨트롤러는 각 포드를 종료하고, 포드가 Running 및 Ready로 전환될 때까지 기다린 후 다음 포드를 업데이트합니다.

RollingUpdate 파티션 나누기

partition 매개변수를 StatefulSet의 RollingUpdate 필드로 지정할 수 있습니다.

partition을 지정하면 순서 값이 partition 값보다 크거나 같은 모든 포드가 업데이트됩니다. 순서 값이 partition 값보다 작은 모든 포드는 업데이트되지 않으며, 삭제된 경우에도, 이전 버전으로 다시 생성됩니다.

partition 값이 replicas 수보다 크면 업데이트가 해당 포드로 전파되지 않습니다. 파티션 나누기는 업데이트를 스테이징하거나, 카나리아를 출시하거나, 단계별 출시를 수행하는 경우에 유용합니다.

예를 들어 web StatefulSet를 파티션으로 나누려면 다음 명령어를 실행하세요.

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'

그러면 순서 값이 3보다 크거나 같은 포드가 업데이트됩니다.

DaemonSet의 maxUnavailable 매개변수

DaemonSet의 선택적인 maxUnavailable 매개변수는 해당 rollingUpdate 필드의 하위 항목입니다.

maxUnavailable은 업데이트 중 제공되지 않을 수 있는 DaemonSet 포드의 최대 개수를 결정합니다. 생략된 경우, 기본값은 1입니다. 이 값은 0일 수 없습니다. 이 값은 절대값 또는 백분율일 수 있습니다.

OnDelete 전략으로 업데이트

StatefulSet 또는 DaemonSet를 수동으로 업데이트하려는 경우 컨트롤러가 OnDelete 전략을 사용하도록 지시하는 updateStrategy 필드를 생략할 수 있습니다.

OnDelete 전략을 사용하는 컨트롤러를 업데이트하려면 해당 포드 템플릿을 변경한 후 포드를 수동으로 삭제해야 합니다.

예를 들어 nginx-slim:0.7 이미지를 사용하도록 web StatefulSet를 설정할 수 있습니다.

kubectl set image statefulset web nginx=nginx-slim:0.7

그런 후 첫 번째 web 포드를 삭제하기 위해 다음 명령어를 실행합니다.

kubectl delete pod web-0

StatefulSet로 포드가 다시 생성되고 Running 및 Ready로 전환되는 것을 보려면 다음 명령어를 실행하세요.

kubectl get pod web-0 -w

이 명령어의 출력은 다음과 비슷합니다.

NAME      READY     STATUS               RESTARTS   AGE
web-0     1/1       Running              0          54s
web-0     1/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Pending              0         0s
web-0     0/1       Pending              0         0s
web-0     0/1       ContainerCreating    0         0s
web-0     1/1       Running              0         3s

작업 업데이트

작업 구성을 업데이트하면 새로운 작업 및 해당 포드가 새로운 구성으로 실행됩니다. 작업을 업데이트한 후에는 필요에 따라 이전 작업 및 해당 포드를 수동으로 삭제해야 합니다.

작업 및 모든 해당 포드를 삭제하려면 다음 명령어를 실행하세요.

kubectl delete job my-job

작업을 삭제하지만 포드는 실행 상태로 두려면 --cascade false 플래그를 지정합니다.

kubectl delete job my-job --cascade false

또한 kubectl describe deployment nginx를 실행하여 배포에 대해 더 많은 정보를 확인할 수 있습니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine