다른 머신 유형에 작업 부하 이전

이 가이드에서는 애플리케이션에 다운타임을 일으키지 않고도 GKE 클러스터에서 실행되는 작업 부하를 새로운 노드 집합으로 이전하는 방법을 보여줍니다. 이러한 이전은 머신 유형이 다른 노드에 작업 부하를 이전하려는 경우에 유용할 수 있습니다.

배경

노드 풀은 머신 유형(CPU 및 메모리) 승인 범위를 포함하여 모두 동일한 구성을 갖는 머신의 하위 집합입니다. 노드 풀은 클러스터 내의 노드 하위 집합을 나타냅니다. 컨테이너 클러스터는 하나 이상의 노드 풀을 포함할 수 있습니다.

Compute Engine 클러스터의 머신 프로필을 변경해야 할 경우, 새 노드 풀을 만들고 작업 부하를 새 노드 풀로 이전할 수 있습니다.

다운타임 없이 작업 부하를 이전하려면 다음 작업이 필요합니다.

  • 기존 노드 풀을 예약 불가능으로 표시합니다.
  • 기존 노드 풀에서 실행되는 작업 부하를 배출합니다.
  • 기존 노드 풀을 삭제합니다.

GKE 클러스터의 클러스터 조정 시스템인 Kubernetes는 기존 노드 풀을 배출하면서 삭제된 포드를 새로운 노드 풀로 자동으로 다시 예약합니다.

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. Google Cloud Platform 콘솔에서 Kubernetes Engine 페이지로 이동합니다.
  2. 프로젝트를 만들거나 선택합니다.
  3. API 및 관련 서비스가 사용 설정될 때까지 기다립니다. 몇 분 정도 걸릴 수 있습니다.
  4. Google Cloud Platform 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

이 가이드에 사용된 다음 명령줄 도구를 설치합니다.

  • gcloud는 Kubernetes Engine 클러스터를 만들고 삭제하기 위해 사용됩니다. gcloudGoogle Cloud SDK에 포함되어 있습니다.
  • kubectl은 Kubernetes Engine에서 사용되는 클러스터 조정 시스템인 Kubernetes를 관리하기 위해 사용됩니다. gcloud를 사용하여 kubectl을 설치할 수 있습니다.
    gcloud components install kubectl

gcloud 명령줄 도구의 기본값 설정

gcloud 명령줄 도구에서 프로젝트 IDCompute Engine 영역 옵션을 입력하는 시간을 절약하기 위해 기본값을 설정할 수 있습니다.
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

1단계: GKE 클러스터 만들기

첫 번째 단계는 애플리케이션 작업 부하를 실행하도록 컨테이너 클러스터를 만드는 것입니다. 다음 명령어는 기본 머신 유형(n1-standard-1) 노드 5개가 포함된 새 클러스터를 생성합니다.

gcloud container clusters create migration-tutorial --num-nodes=5

2단계: 복제된 애플리케이션 배포 실행

다음 명령어는 샘플 웹 애플리케이션 컨테이너 이미지의 6 복제본 배포를 만듭니다.

kubectl run web --image=gcr.io/google-samples/hello-app:1.0 \
  --replicas=6 --limits='cpu=100m,memory=80Mi'

다음을 실행하여 시작된 포드 목록을 검색할 수 있습니다.

kubectl get pods
출력:
NAME                   READY     STATUS    RESTARTS   AGE
web-2212180648-80q72   1/1       Running   0          10m
web-2212180648-jwj0j   1/1       Running   0          10m
web-2212180648-pf67q   1/1       Running   0          10m
web-2212180648-pqz73   1/1       Running   0          10m
web-2212180648-rrd3b   1/1       Running   0          10m
web-2212180648-v3b18   1/1       Running   0          10m

3단계: 대형 머신 유형의 노드 풀 만들기

기본적으로 GKE는 모든 새 클러스터에 대해 default-pool이라는 노드 풀을 만듭니다.

gcloud container node-pools list --cluster migration-tutorial
출력:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.5.7

다른 머신 유형 또는 다른 인증 범위와 같은 다른 구성의 인스턴스를 사용하기 위해서는 새로운 노드 풀을 만들어야 합니다.

다음 명령어는 larger-pool이라는 새로운 노드 풀을 만듭니다. 이 노드 풀에는 n1-highmem-2 머신 유형의 높은 메모리 인스턴스가 5개 있습니다.

gcloud container node-pools create larger-pool --cluster=migration-tutorial \
  --machine-type=n1-highmem-2 --num-nodes=5

컨테이너 클러스터에 이제 2개의 노드 풀이 포함됩니다.

gcloud container node-pools list --cluster migration-tutorial
출력:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.5.7
larger-pool   n1-highmem-2   100           1.5.7

GKE 클러스터에 추가된 새 노드 풀 인스턴스를 볼 수 있습니다.

kubectl get nodes
출력:
NAME                                                STATUS    AGE       VERSION
gke-migration-tutorial-default-pool-56e3af9a-059q   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-0ng4   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-k6jm   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-lkrv   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-p9j4   Ready     40m       v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-2rhk    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-4bb2    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-7fl0    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-cx9q    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-hs6p    Ready     4m        v1.5.7

4단계: 작업 부하 이전

새 노드 풀을 만든 후, 아직 작업 부하는 default-pool에서 실행됩니다. Kubernetes는 포드가 실행 중이고 사용 가능한 상태일 때 포드를 다시 예약하지 않습니다.

다음 명령어를 실행하여 포드가 실행 중인 노드를 확인합니다(NODE 열 확인).

kubectl get pods -o=wide
출력:
NAME                          READY     STATUS    IP         NODE
web-2212180648-80q72          1/1       Running   10.8.3.4   gke-migration-tutorial-default-pool-56e3af9a-k6jm
web-2212180648-jwj0j          1/1       Running   10.8.2.5   gke-migration-tutorial-default-pool-56e3af9a-0ng4
web-2212180648-pf67q          1/1       Running   10.8.4.4   gke-migration-tutorial-default-pool-56e3af9a-lkrv
web-2212180648-pqz73          1/1       Running   10.8.2.6   gke-migration-tutorial-default-pool-56e3af9a-0ng4
web-2212180648-rrd3b          1/1       Running   10.8.4.3   gke-migration-tutorial-default-pool-56e3af9a-lkrv
web-2212180648-v3b18          1/1       Running   10.8.1.4   gke-migration-tutorial-default-pool-56e3af9a-p9j4

이러한 포드를 새로운 노드 풀로 이전하기 위해서는 다음 단계를 수행해야 합니다.

  1. 기존 노드 풀 차단: 이 작업은 기존 노드 풀(default-pool)에 있는 노드를 예약 불가능으로 표시합니다. 이를 예약 불가능으로 표시한 다음에는 Kubernetes가 이러한 노드에 대한 새 포드 예약을 중지합니다.

  2. 기존 노드 풀 배출: 이 작업은 기존 노드 풀(default-pool)의 노드에서 실행 중인 작업 부하를 정상적으로 삭제합니다.

위 단계를 수행하면 기존 노드 풀에서 실행 중인 포드가 정상적으로 종료되고 Kubernetes가 이를 다른 사용 가능한 노드에 다시 예약합니다. 이 경우, 사용 가능한 유일한 노드는 3단계에서 생성된 larger-pool에 있는 노드뿐입니다.

Kubernetes가 애플리케이션을 정상적으로 종료하도록 하려면, 컨테이너가 SIGTERM 신호를 처리해야 합니다. 이 신호를 사용하면 클라이언트에 대한 활성 연결을 닫고 데이터베이스 트랜잭션을 깨끗한 방식으로 커밋하거나 중단할 수 있습니다. 포드 매니페스트에서 spec.terminationGracePeriodSeconds 필드를 사용하여 포드의 컨테이너를 종료하기 전에 Kubernetes가 기다려야 하는 시간을 지정할 수 있습니다. 기본값은 30초입니다. 포드 종료에 대한 자세한 내용은 Kubernetes 문서를 참조하세요.

먼저 default-pool에서 노드를 차단합니다. 다음 명령어를 실행하여 이 노드 풀에 있는 노드 목록을 가져올 수 있습니다.

kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool

그런 후 kubectl cordon NODE 명령어를 실행하여 각 노드를 차단합니다. NODE는 이전 명령어의 이름으로 바꿉니다. 다음 명령어는 각 노드에 대해 작업을 반복하고 이를 예약 불가능으로 표시합니다.

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl cordon "$node";
done
출력:
node "gke-migration-tutorial-default-pool-56e3af9a-059q" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-0ng4" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-k6jm" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-lkrv" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-p9j4" cordoned

이제 default-pool 노드의 SchedulingDisabled 상태를 노드 목록에서 확인할 수 있습니다.

kubectl get nodes
출력:
NAME                                                STATUS                     AGE       VERSION
gke-migration-tutorial-default-pool-56e3af9a-059q   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-0ng4   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-k6jm   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-lkrv   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-p9j4   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-2rhk    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-4bb2    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-7fl0    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-cx9q    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-hs6p    Ready                      1h        v1.5.7

그런 다음 각 노드에서 포드를 정상적으로 배출합니다. 배출을 수행하려면 각 노드에서 포드를 축출하는 kubectl drain 명령어를 사용합니다.

NODEkubectl cordon 명령어에 전달된 동일한 이름 목록으로 바꿔서 kubectl drain --force NODE를 실행할 수 있습니다.

다음 셸 명령어는 할당된 정상 종료 시간 10초를 사용해서 포드를 배출하는 방식으로 default-pool에서 각 노드를 반복하여 이를 배출합니다.

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl drain --force --ignore-daemonsets --delete-local-data --grace-period=10 "$node";
done

이 명령어가 완료되면 이제 포드가 larger-pool 노드에서 실행되는 것을 볼 수 있습니다.

kubectl get pods -o=wide
출력:
NAME                   READY     STATUS    IP         NODE
web-2212180648-3n9hz   1/1       Running   10.8.9.4   gke-migration-tutorial-larger-pool-b8ec62a6-cx9q
web-2212180648-88q1c   1/1       Running   10.8.7.4   gke-migration-tutorial-larger-pool-b8ec62a6-2rhk
web-2212180648-dlmjc   1/1       Running   10.8.9.3   gke-migration-tutorial-larger-pool-b8ec62a6-cx9q
web-2212180648-hcv46   1/1       Running   10.8.5.4   gke-migration-tutorial-larger-pool-b8ec62a6-hs6p
web-2212180648-n0nht   1/1       Running   10.8.6.4   gke-migration-tutorial-larger-pool-b8ec62a6-7fl0
web-2212180648-s51jb   1/1       Running   10.8.8.4   gke-migration-tutorial-larger-pool-b8ec62a6-4bb2

5단계: 이전 노드 풀 삭제

Kubernetes가 web 배포의 모든 포드를 larger-pool로 다시 예약한 다음에는 default-pool이 더 이상 필요하지 않으므로, 안전하게 삭제할 수 있습니다. 다음 명령어를 실행하여 default-pool을 삭제합니다.

gcloud container node-pools delete default-pool --cluster migration-tutorial

이 작업이 완료되면 컨테이너 클러스터에 대해 단일 노드 풀(larger-pool)만 사용됩니다.

gcloud container node-pools list --cluster migration-tutorial
출력:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
larger-pool   n1-highmem-2   100           1.5.7

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

  • 컨테이너 클러스터 삭제: 이 단계에서는 컴퓨팅 인스턴스, 디스크, 네트워크 리소스와 같이 컨테이너 클러스터를 구성하는 리소스를 삭제합니다.

    gcloud container clusters delete migration-tutorial

다음 단계

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

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

Kubernetes Engine 가이드