이 튜토리얼에서는 스테이트풀(Stateful) 애플리케이션 생성 및 애플리케이션을 실행하는 Google Kubernetes Engine(GKE) 클러스터 업그레이드를 위한 권장사항을 제공합니다. 이 튜토리얼에서는 스테이트풀(Stateful) 애플리케이션을 배포하는 예시로 Redis를 사용하지만 GKE에 배포된 다른 유형의 스테이트풀(Stateful) 애플리케이션에도 동일한 개념이 적용됩니다.
목표
이 튜토리얼은 다음 과정을 다룹니다.
- 출시 채널에 등록된 GKE 클러스터를 만듭니다.
- GKE에 Redis 클러스터를 만듭니다.
- GKE에 Redis 클라이언트 애플리케이션을 배포합니다.
- 노드 풀 업그레이드에 대해 다음 권장사항을 수행합니다.
- 포드 중단 예산(PDB)을 설정합니다.
- 유지보수 기간 및 제외 설정
- 노드 업그레이드 전략을 일시 급증 업그레이드 또는 블루-그린 업그레이드로 설정합니다.
- 애플리케이션 테스트
- 클러스터를 업그레이드합니다.
- 워크로드 중단을 테스트합니다.
다음 다이어그램에서는 이 튜토리얼의 클러스터 아키텍처를 대략적으로 보여줍니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
프로젝트 설정
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Google Cloud CLI 기본값 설정
Google Cloud 콘솔에서 Cloud Shell 인스턴스를 시작합니다.
Cloud Shell 열기이 샘플 앱의 소스 코드를 다운로드합니다.
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app-redis/manifests
기본 환경 변수를 설정합니다.
gcloud config set project PROJECT-ID gcloud config set compute/zone COMPUTE-ZONE
다음 값을 바꿉니다.
- PROJECT_ID: Google Cloud 프로젝트 ID입니다.
- COMPUTE_ZONE: Compute Engine 영역입니다.
출시 채널에 등록된 GKE 클러스터 만들기
GKE 클러스터를 만들려면 다음 안내를 따르세요.
노드가 3개인
redis-test
라는 클러스터를 만듭니다.gcloud container clusters create redis-test \ --num-nodes=3 \ --release-channel regular
클러스터가 생성되면 다음 예시와 비슷한 출력이 표시됩니다.
NAME: redis-test LOCATION: us-central1-c MASTER_VERSION: 1.22.10-gke.600 MASTER_IP: 34.69.67.7 MACHINE_TYPE: e2-medium NODE_VERSION: 1.22.10-gke.600 NUM_NODES: 3 STATUS: RUNNING
클러스터와 통신하도록
kubectl
을 구성합니다.gcloud container clusters get-credentials redis-test
GKE에 Redis 클러스터를 만듭니다.
이 섹션에서는 ConfigMap, StatefulSet 및 헤드리스 서비스를 배포하여 이전에 만든 GKE 클러스터 위에 Redis 클러스터를 추가합니다.
Redis 클러스터를 만들려면 다음 단계를 수행합니다.
Redis 구성을 저장하는 ConfigMap 파일(
redis-configmap.yaml
)을 참조하세요. 아래 스니펫은 준비 프로브와 활성 프로브 스크립트를 보여줍니다.readiness.sh
및liveness.sh
스크립트는 redis-cli ping을 사용하여 redis 서버가 실행 중인지 여부를 확인합니다.PONG
이 반환되면 Redis 서버가 실행 중인 것입니다. 이러한 스크립트는redis-cluster.yaml
에서 사용됩니다.이 ConfigMap의 Redis 매개변수에 대해 자세히 알아보려면 Redis 클러스터 튜토리얼의 Redis 클러스터 구성 매개변수 섹션을 참조하세요.
ConfigMap을 배포합니다.
kubectl apply -f redis-configmap.yaml
준비 프로브와 활성 프로브의 사용을 보여주는 아래 StatefulSet(
redis-cluster.yaml
) 스니펫을 참조하세요.Kubernetes에서 프로브를 구성하는 방법에 대해 알아보려면 프로브 구성을 참조하세요.
노드 풀을 업그레이드할 때 준비 및 활성 프로브를 사용하는 것이 좋습니다. 이렇게 하면 업그레이드 중에 포드가 준비됩니다.
StatefulSet를 배포합니다.
kubectl apply -f redis-cluster.yaml
redis-service.yaml
이라는 헤드리스 서비스는 Redis 노드의 연결을 위한 것입니다. 헤드리스 서비스를 만들려면clusterIP
필드는None
으로 설정됩니다.서비스를 배포합니다.
kubectl apply -f redis-service.yaml
약 2분 동안 기다린 후 다음 명령어를 사용하여 모든 포드가 실행 중인지 확인합니다.
kubectl get pods
다음과 비슷한 출력이 표시됩니다.
NAME READY STATUS RESTARTS AGE redis-0 1/1 Running 0 2m29s redis-1 1/1 Running 0 2m8s redis-2 1/1 Running 0 107s redis-3 1/1 Running 0 85s redis-4 1/1 Running 0 54s redis-5 1/1 Running 0 23s
다음 명령어를 실행하여 영구 볼륨이 생성되었는지 확인합니다.
kubectl get pv
다음과 비슷한 출력이 표시됩니다.
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-HASH 1Gi RWO Delete Bound default/data-redis-5 standard 75s pvc-HASH 1Gi RWO Delete Bound default/data-redis-1 standard 2m59s pvc-HASH 1Gi RWO Delete Bound default/data-redis-3 standard 2m16s pvc-HASH 1Gi RWO Delete Bound default/data-redis-2 standard 2m38s pvc-HASH 1Gi RWO Delete Bound default/data-redis-0 standard 3m20s pvc-HASH 1Gi RWO Delete Bound default/data-redis-4 standard 104s
이 출력에서 HASH는 각 영구 볼륨 이름에 연결된 해시를 나타냅니다.
Redis 클러스터에 역할 할당
구성이 완료되면 Redis 클러스터에 역할을 할당합니다.
다음 스크립트는 포드 IP 주소를 가져온 후 각 포드 IP 주소를 명령어에 전달하여 리더 및 팔로워 역할을 할당합니다.
Redis 클러스터에 역할을 할당하려면 다음 단계를 완료하세요.
스크립트를 실행합니다.
chmod +x ./roles.sh ./roles.sh
메시지가 표시되면
yes
를 입력합니다.Redis 노드에 로그인하여 역할을 확인합니다. 예를 들어
redis-0
에 리더 역할이 있는지 확인하려면 다음 명령어를 실행합니다.kubectl exec -it redis-0 -- redis-cli role
다음과 비슷한 출력이 표시됩니다.
1) "master" 2) (integer) 574 3) 1) 1) "10.28.2.3" 2) "6379" 3) "574"
Redis 클라이언트 애플리케이션 배포
만든 GKE 클러스터에 애플리케이션을 배포하려면 애플리케이션 배포를 정의합니다.
app-deployment.yaml
이라는 파일에는 애플리케이션 배포 정의가 포함됩니다.
이 배포에서 사용되는 프로브 및 포드 어피니티 규칙에 대해 자세히 알아보려면 GKE 권장사항: 가용성이 높은 클러스터 설계 및 빌드를 참조하세요.
배포를 만들려면 다음 단계를 완료하세요.
배포를 적용합니다.
kubectl apply -f app-deployment.yaml
부하 분산기를 통해 애플리케이션을 노출합니다.
kubectl expose deployment hello-web \ --type=LoadBalancer \ --port 80 \ --target-port 8080
약 1분간 기다린 후 다음 명령어를 실행하여 애플리케이션의 외부 IP 주소를 검색합니다.
kubectl get service
출력에서
hello-web's
EXTERNAL-IP
열에 나열된 값을 복사합니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-web LoadBalancer 10.13.10.55 EXTERNAL_IP 80:30703/TCP 166m
웹브라우저에 EXTERNAL_IP를 붙여 넣어 애플리케이션이 작동하는지 확인합니다. 다음과 비슷한 출력이 표시됩니다.
I have been hit [1] times since deployment!
방문 번호를 기록합니다. 애플리케이션 중단 테스트 섹션에서 이 방문 번호를 사용해야 합니다.
방금 복사한 EXTERNAL_IP의 변수를 설정합니다. 다음 섹션에서 애플리케이션을 테스트할 스크립트를 만들 때 이 값을 사용합니다.
export IP=EXTERNAL_IP
노드 풀 업그레이드 권장사항 구성
스테이트풀(Stateful) 애플리케이션의 권장사항을 수행하여 노드 풀 업그레이드 중 가용성을 최적화합니다.
포드 중단 예산(PDB) 설정
포드 중단 예산을 만들어 자발적 중단 중에 동시에 다운되는 복제된 포드 수를 제한합니다. 이 기능은 업그레이드 중에 사용 가능한 복제본 수에 대한 쿼럼이 필요한 스테이트풀(Stateful) 애플리케이션에 유용합니다.
PDB 정의에서 각 항목의 의미는 다음과 같습니다.
app
은 이 PDB가 적용되는 애플리케이션을 지정합니다.minAvailable
은 중단 중에 사용할 수 있는 최소 포드 수를 설정합니다. 값 또는 백분율(예: 30%)일 수 있습니다.maxUnavailable
은 서비스 중단 중에 사용할 수 없는 최대 포드 수를 설정합니다. 값 또는 백분율일 수도 있습니다.
PDB를 설정하려면 다음 단계를 수행합니다.
PDB를 배포합니다.
kubectl apply -f pdb-minavailable.yaml
PDB가 생성되었는지 확인합니다.
kubectl get pdb
유지보수 기간 및 유지보수 제외 설정
노드 자동 업그레이드는 업그레이드 프로세스를 간소화하고, 제어 영역이 사용자를 대신하여 업그레이드될 때 클러스터의 노드를 최신 상태로 유지합니다. 이 기능은 기본적으로 사용하도록 설정되어 있습니다. 자세한 내용은 노드 자동 업그레이드를 참조하세요.
유지보수 기간 및 유지보수 제외를 사용하여 기간을 설정하고 GKE 클러스터에서 유지보수가 수행되거나 될 수 없는 시기를 제어합니다.
유지보수 기간은 2022년 8월 19일 UTC를 기준으로 오전 2시에 시작해서 4시간 후에 종료됩니다. 이 유지보수 기간은 매일 실행됩니다. 이 기간 중에는 자동 유지보수가 허용됩니다.
gcloud container clusters update redis-test \ --maintenance-window-start 2022-08-19T02:00:00Z \ --maintenance-window-end 2022-08-19T06:00:00Z \ --maintenance-window-recurrence FREQ=DAILY
새해 휴일 동안 유지보수를 차단하는 제외 기간을 설정합니다. 이 유지보수 제외에는
no_upgrades
범위가 사용됩니다. 이 기간에는 어떤 종류의 자동 유지보수도 허용되지 않습니다. 자세한 내용은 제외할 유지보수 범위를 참조하세요.gcloud container clusters update redis-test \ --add-maintenance-exclusion-name new-year \ --add-maintenance-exclusion-start 2022-12-26T00:00:00Z \ --add-maintenance-exclusion-end 2023-01-02T02:00:00Z \ --add-maintenance-exclusion-scope no_upgrades
유지보수 기간 및 제외가 적용되었는지 확인합니다.
maintenancePolicy:
아래를 살펴봅니다.gcloud container clusters describe redis-test
자세한 내용은 유지보수 기간 및 제외 구성을 참조하세요.
노드 업그레이드 전략 구성
GKE 클러스터에서 노드에 사용할 수 있는 두 가지 노드 풀 업그레이드 전략은 블루-그린 업그레이드와 일시 급증 업그레이드입니다. 자세한 내용은 노드 업그레이드 전략을 참조하세요.
블루/그린 업그레이드
워크로드가 중단에 대한 내결함성이 낮고 리소스 사용량이 더 많아서 일시적으로 비용이 증가하는 경우 블루-그린 업그레이드를 선택합니다.
다음 명령어를 실행하여 현재 노드 풀을 블루=그린 업그레이드 전략으로 변경합니다.
gcloud container node-pools update default-pool \
--cluster=redis-test \
--enable-blue-green-upgrade \
--zone COMPUTE-ZONE \
--node-pool-soak-duration=120s
이 튜토리얼에서는 노드 풀 흡수 시간을 2분으로 설정하여 흡수 노드 풀 단계에서 시간을 절약합니다. 이 단계는 블루 풀 노드가 드레이닝된 후 워크로드 상태를 확인하는 데 사용됩니다. 노드 풀 흡수 기간을 1시간(3,600초) 또는 애플리케이션에 가장 적합한 기간으로 설정하는 것이 좋습니다.
포드 할당 관리에 대한 자세한 내용은 특정 노드 풀에 포드 배포 및 특정 노드 풀에 서비스 배포를 참조하세요.
블루-그린 업그레이드 구성에 대한 자세한 내용은 블루-그린 업그레이드 구성을 참조하세요.
일시 급증 업그레이드
비용 최적화가 중요하고 워크로드가 60분 이내의 단계적 종료를 허용할 수 있는 경우 일시 급증 업그레이드를 선택합니다(GKE에서 최대 60분까지 PDB 지원).
다음 명령어를 실행하여 현재 노드 풀을 일시 급증 업그레이드 전략으로 변경합니다.
gcloud container node-pools update default-pool \
--max-surge-upgrade=1 \
--max-unavailable-upgrade=0 \
--cluster=redis-test
이 구성(maxSurge=1
및 maxUnavailable=0
)을 사용하면 업그레이드 중 노드 풀에 일시 급증 노드 1개만 추가할 수 있으므로 한 번에 노드 한 개만 업그레이드할 수 있습니다. 이 설정은 보수적으로 진행하면서 업그레이드 중 포드 재시작 속도를 높입니다.
일시 급증 업그레이드 구성에 대한 자세한 내용은 일시 급증 업그레이드 구성을 참조하세요.
현재 노드 풀 구성을 확인합니다.
gcloud container node-pools describe default-pool \
--cluster redis-test \
--zone COMPUTE-ZONE
노드 풀 보기에 대한 자세한 내용은 클러스터의 노드 풀 보기를 참조하세요.
애플리케이션 테스트
이 섹션에서는 요청을 애플리케이션으로 전송하는 스크립트와 요청의 성공률을 측정하는 스크립트, 이렇게 2개의 스크립트를 사용합니다. 이 스크립트를 사용하여 클러스터를 업그레이드할 때 발생하는 상황을 측정합니다.
스크립트를 만들려면 다음 안내를 따르세요.
스크립트가 포함된 디렉터리로 변경합니다.
cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts
애플리케이션에 초당 쿼리 수(QPS) 요청을 전송하는
generate_load.sh
라는 스크립트를 참조하세요. 스크립트는 HTTP 응답 코드를 현재 디렉터리에output
파일로 저장합니다.output
값은 다음 단계에서 만드는 스크립트에 사용됩니다.generate_load.sh
에서 생성된 출력을 기반으로 성공률을 계산하는print_error_rate.sh
라는 스크립트를 참조하세요.스크립트를 실행할 권한을 자신에게 부여합니다.
chmod u+x generate_load.sh print_error_rate.sh
QPS 수에 대한 변수를 설정합니다. 이 값은 EXTERNAL_IP에 대해 설정하는 변수와 마찬가지로
generate_load.sh
스크립트에 사용됩니다. 값을 40으로 설정하는 것이 좋습니다.export QPS=40
generate_load.sh
스크립트를 실행하여 QPS 전송을 시작합니다../generate_load.sh $IP $QPS 2>&1
generate_load.sh
스크립트를 실행 중 상태로 두고 새 터미널을 엽니다. 새 터미널에서print_error_rate.sh
스크립트를 실행하여 오류율을 확인합니다.cd cd kubernetes-engine-samples/quickstarts/hello-app-redis/scripts watch ./print_error_rate.sh
QPS가 생성되면 100% 성공률과 0% 오류율이 표시됩니다.
두 스크립트 모두 실행 중 상태로 두고 다음 섹션에 대비하여 세 번째 터미널을 엽니다.
클러스터를 업그레이드합니다.
클러스터를 업그레이드하려면 다음 단계를 수행합니다.
redis-test
클러스터가 사용 중인 GKE 버전을 확인합니다.V=$(gcloud container clusters describe redis-test | grep "version:" | sed "s/version: //") echo $V
다음 예시와 비슷한 출력이 표시됩니다.
1.22.9-gke.2000
.사용 가능한 Kubernetes 버전 목록을 가져옵니다.
gcloud container get-server-config
버전 목록에서
validMasterVersions:
섹션을 찾고 이전 단계에서 검색한redis-test
버전을 찾습니다. 노드와 호환되지 않는 버전을 선택하여 GKE 버전 편향 정책을 위반하지 않으려면redis-test
버전 바로 앞에 나열된 목록에서 버전을 복사합니다.클러스터의 제어 영역을 선택한 버전으로 업그레이드하고 메시지가 표시되면
y
를 입력합니다.gcloud container clusters upgrade redis-test \ --master \ --cluster-version VERSION
VERSION을 이전 단계의 목록에서 선택한 버전으로 바꿉니다.
제어 영역 업그레이드에는 몇 분 정도 걸립니다.
클러스터 노드를 선택한 버전으로 업그레이드하고 메시지가 표시되면
y
를 입력합니다.gcloud container clusters upgrade redis-test \ --cluster-version=VERSION \ --node-pool=default-pool
VERSION을 목록에서 선택한 버전으로 바꿉니다.
워크로드 중단 테스트
이 섹션에서는 애플리케이션 상태를 테스트하고 워크로드 중단을 관찰합니다.
./print_error_rate.sh
를 실행하는 터미널 창으로 돌아가서 업그레이드 중에 성공률이 어떻게 바뀌는지 관찰합니다. 업그레이드를 위해 노드가 중지됨에 따라 성공률이 약간 감소하고 앱 네트워크 오류율이 약간 증가합니다.Success rate
필드에는 성공한 웹사이트 방문 수가 표시됩니다. 이 값을 기록해 둡니다.관련 터미널에
CTRL+C
를 입력하여 두 스크립트 실행을 중지합니다.IP 주소(Redis 클라이언트 애플리케이션 배포 섹션에서 복사한 EXTERNAL_IP)를 브라우저에 입력하여 애플리케이션의 웹사이트로 돌아갑니다.
애플리케이션의 방문 번호를 확인합니다. 표시되는 숫자는 다음과 같아야 합니다.
ORIGINAL_VISIT_NUMBER + SUCCESSFUL_VISIT_NUMBER
여기서 ORIGINAL_VISIT_NUMBER는 Redis 클라이언트 애플리케이션 배포의 마지막 단계에서 기록한 번호이고, SUCCESSFUL_VISIT_NUMBER는 이 섹션의 첫 번째 단계에서 기록한 값입니다.
삭제
튜토리얼을 완료한 후에는 만든 리소스를 삭제하여 할당량 사용을 중지하고 요금이 청구되지 않도록 할 수 있습니다. 다음 섹션은 이러한 리소스를 삭제하거나 사용 중지하는 방법을 설명합니다.
프로젝트 삭제
비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.
프로젝트를 삭제하는 방법은 다음과 같습니다.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
클러스터 삭제
이 튜토리얼에서 만든 클러스터를 삭제하려면 다음 명령어를 실행합니다.
gcloud container clusters delete redis-test