순차적 업데이트 수행

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

개요

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

다음 객체는 Kubernetes 워크로드를 나타냅니다. 해당 Pod 템플릿을 업데이트하여 이러한 워크로드에서 순차적 업데이트를 트리거할 수 있습니다.

  • DaemonSets
  • Deployments
  • StatefulSets

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

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

Pod 템플릿에 대한 자세한 내용은 PodTemplateSpec 문서를 참조하세요.

리소스 확장 또는 Pod 템플릿 외부의 필드 업데이트 시에는 롤아웃이 트리거되지 않습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

다음 방법 중 하나를 사용하여 기본 gcloud 설정을 진행합니다.

  • gcloud init를 사용하여 기본값 설정 과정을 진행합니다.
  • gcloud config를 사용하여 프로젝트 ID, 영역, 리전을 개별적으로 설정합니다.

gcloud init 사용

  1. gcloud init를 실행하고 다음 안내를 따르세요.

    gcloud init

    원격 서버에서 SSH를 사용하는 경우 --console-only 플래그를 사용하여 다음 명령어로 브라우저를 실행하지 못하게 할 수 있습니다.

    gcloud init --console-only
  2. 안내를 따라 gcloud에서 Google Cloud 계정을 사용하도록 승인합니다.
  3. 새 구성을 만들거나 기존 구성을 선택합니다.
  4. Google Cloud 프로젝트를 선택합니다.
  5. 기본 Compute Engine 영역을 선택합니다.

gcloud config 사용

  • 기본 프로젝트 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 Console 또는 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 명령어는 배포 Pod의 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]는 업데이트된 매니페스트 파일입니다.

Console

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

  1. Cloud Console에서 Google Kubernetes Engine 워크로드 메뉴로 이동합니다.

    워크로드 메뉴로 이동

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

  3. 수정을 클릭합니다.

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

  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를 실행하여 모든 Pod가 실행 중인지 확인합니다. 출력은 다음과 비슷합니다.

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에서는 컨테이너, 라벨, 리소스 요청/제한, Pod 주석에 대한 자동화된 순차적 업데이트를 구성하고 사용 중지하기 위한 업데이트 전략을 사용합니다. 업데이트 전략은 spec.updateStrategy 필드를 사용하여 구성됩니다.

spec.updateStrategy.type 필드는 OnDelete 또는 RollingUpdate를 값으로 허용합니다.

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

RollingUpdate는 StatefulSet에서 Pod의 자동화된 순차적 업데이트를 구현합니다. RollingUpdate는 컨트롤러가 각 Pod를 한 번에 하나씩 삭제하고 다시 만들도록 합니다. 업데이트된 Pod가 실행되고 준비될 때까지 기다렸다가 이전 버전을 업데이트합니다.

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

RollingUpdate 전략 사용

RollingUpdate 전략을 사용하여 StatefulSet 또는 DaemonSet의 모든 Pod를 자동으로 업데이트할 수 있습니다.

예를 들어 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의 Pod가 업데이트되고 있는지 확인하려면 다음 명령어를 실행합니다.

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의 Pod는 역순으로 업데이트됩니다. StatefulSet 컨트롤러는 각 Pod를 종료하고, Pod가 Running 및 Ready로 전환될 때까지 기다린 후에 다음 Pod를 업데이트합니다.

RollingUpdate 파티션 나누기

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

partition을 지정하면 순서 값이 partition 값보다 크거나 같은 모든 Pod가 업데이트됩니다. 순서 값이 partition 값보다 작은 모든 Pod는 업데이트되지 않으며, 이러한 Pod는 삭제되더라도 이전 버전에서 다시 생성됩니다.

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

예를 들어 web StatefulSet의 파티션을 나누려면 다음 명령어를 실행합니다.

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

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

DaemonSet의 maxUnavailable 매개변수

DaemonSet의 선택적 maxUnavailable 매개변수는 rollingUpdate 필드의 하위 요소입니다.

maxUnavailable은 업데이트 중에 사용할 수 없는 DaemonSet Pod의 최대 개수를 결정합니다. 이 값이 생략된 경우 기본값은 1입니다. 이 값은 0일 수 없습니다. 이 값은 절댓값 또는 백분율일 수 있습니다.

OnDelete 전략을 사용하여 업데이트

StatefulSet 또는 DaemonSet을 수동으로 업데이트하려면 컨트롤러에 OnDelete 전략을 사용하도록 지시하는 spec.updateStrategy 필드를 생략합니다.

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

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

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

그런 다음 첫 번째 web Pod를 삭제하려면 다음 명령어를 실행합니다.

kubectl delete pod web-0

Pod가 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

작업 업데이트

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

작업 및 모든 해당 pod를 삭제하려면 다음 명령어를 실행합니다.

kubectl delete job my-job

작업을 삭제하되 Pod를 계속 실행하려면 --cascade=false 플래그를 지정합니다.

kubectl delete job my-job --cascade=false

kubectl describe deployment nginx를 실행하여 배포에 대한 추가 정보를 얻을 수도 있습니다.

다음 단계