이 문서에서는 Google Kubernetes Engine (GKE)에서 수직형 포드 자동 스케일러 (VPA)와 함께 CPU 시작 부스트를 사용하여 초기화 단계에서 포드에 할당된 CPU 리소스를 일시적으로 늘리는 방법을 설명합니다.
CPU 시작 부스트는 초기화 중에 CPU 요청을 일시적으로 늘리고 이를 기준 수준으로 다시 조정하여 애플리케이션 시작을 가속화하고 비용 효율성을 개선합니다. 이 문서에서는 시작 부스트 요구사항, 구성 (포드 및 컨테이너 수준), 확인, 권장사항을 다룹니다.
이 문서는 GKE에서 애플리케이션 시작 성능을 최적화하려는 DevOps, 플랫폼 엔지니어, 애플리케이션 개발자를 대상으로 합니다.
이점
CPU 시작 부스트를 사용하면 다음과 같은 이점이 있습니다.
- 더 빠른 시작: Java, Node.js, Python으로 작성된 것과 같은 리소스 집약적인 애플리케이션의 초기화를 가속화합니다.
- 비용 효율성: 시작 요구사항을 충족하면서 정상 상태 작동을 위해 CPU를 과도하게 프로비저닝하지 마세요. 정상 상태 작업은 애플리케이션이 초기화를 완료하고 리소스 사용량이 안정화된 후의 기간입니다.
- 중단 없음: 컨테이너를 다시 시작하지 않고 Kubernetes 인플레이스 포드 크기 조절 (IPPR)을 사용하여 리소스를 기준 수준으로 다시 확장합니다.
- 수동 작업 감소: 리소스 낭비와 워크로드의 적정 규모 조정에 필요한 수동 작업을 최소화합니다.
요구사항
CPU 시작 부스트를 사용하려면 다음 요구사항을 충족해야 합니다.
- GKE 버전: Standard 및 Autopilot 클러스터 모두에
1.36.0-gke.4447000이상을 사용합니다. - VPA 사용 설정됨: 표준 클러스터에서 수직형 포드 자동 확장을 사용 설정합니다. GKE는 Autopilot 클러스터에서 기본적으로 VPA를 사용 설정합니다. 특정 업데이트 모드를 선택하여 CPU 시작 부스트에만 VPA를 사용할 수 있습니다. VPA를 사용 설정하고 구성하려면 자동으로 포드 리소스 요청 설정을 참고하세요.
- 워크로드 유형: 배포 또는 StatefulSet와 같은 컨트롤러를 사용하여 워크로드를 관리합니다.
- 노드 용량: Standard 클러스터에 부스트된 포드를 위한 충분한 용량이 있는지 확인합니다. 용량이 부족하면 GKE는 노드에 맞게 부스트된 포드 요청을 제한합니다.
CPU 시작 부스트 작동 방식
부스트 수명 주기와 CPU 시작 부스트가 리소스 증가를 계산하는 방법에 대한 자세한 내용은 CPU 시작 부스트 작동 방식을 참고하세요.
시작하기 전에
시작하기 전에 부스트하려는 클러스터가 포함된 Cloud de Confiance by S3NS 프로젝트를 선택하고 다음 작업을 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
선택한 프로젝트를 사용하도록 gcloud CLI를 구성합니다.
gcloud config set project PROJECT_IDPROJECT_ID를 프로젝트의 ID로 바꿉니다.기존 GKE 클러스터가 있는지 확인합니다. 클러스터가 없으면 클러스터 만들기를 참고하세요.
필요한 역할
CPU 시작 부스트를 사용 설정하고 사용하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
- Kubernetes Engine 관리자(
roles/container.admin) - Kubernetes Engine 개발자 (
roles/container.developer)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
CPU 시작 부스트 사용 설정
CPU 시작 부스트를 사용 설정하려면 VerticalPodAutoscaler (VPA) 매니페스트에 startupBoost 구성 블록을 추가하세요. 포드의 모든 컨테이너에 적용되도록 부스트를 구성하거나 특정 리소스 증가로 개별 컨테이너를 타겟팅할 수 있습니다.
포드 수준 부스트 구성
포드 수준 부스트는 워크로드의 모든 컨테이너에 동일한 CPU 리소스 증가를 적용합니다. VPA의 지속적인 리소스 관리 유무에 관계없이 CPU 시작 부스트를 구성할 수 있습니다.
포드 수준 부스트를 구성하려면 다음 옵션 중 하나를 사용하세요.
옵션 A: 시작 부스트 사용 설정 및 VPA 업데이트 모드 사용 중지
일반 VPA 추천을 실행하지 않고 CPU 시작 부스트 기능에만 VPA를 활용하려면 이 옵션을 사용하세요. 다음 예에서는 CPU 곱셈 인자 2를 적용하고 포드가 Ready 상태에 도달한 후 10초 동안 유지합니다.
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
옵션 B: 스타트업 부스트와 VPA 업데이트 모드가 모두 사용 설정됨
GKE에서 시작 부스트를 관리한 후 지속적인 사용량에 따라 포드의 리소스 요청을 자동으로 조정하도록 하려면 이 옵션을 사용하세요. 다음 예에서는 시작 부스트를 적용하고 updateMode 필드를 InPlaceOrRecreate로 설정합니다.
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
컨테이너 수준 부스트 구성
워크로드에 추가 리소스가 필요하지 않은 사이드카 또는 기타 컨테이너가 포함된 경우 resourcePolicy 섹션 내에서 시작 부스트를 위해 특정 컨테이너를 타겟팅할 수 있습니다. containerName 값은 배포 사양의 컨테이너 name 필드와 일치해야 합니다.
컨테이너 수준 부스트를 구성하려면 다음 옵션 중 하나를 사용하세요.
옵션 A: 특정 컨테이너 부스트 (VPA 작동 사용 중지)
이 옵션을 사용하여 포드의 나머지 리소스 요청은 그대로 유지하면서 단일 컨테이너에 부스트를 적용합니다. 다음 예시 매니페스트는 boosted-container-name라는 컨테이너의 기준 요청에 vCPU 두 개를 추가합니다.
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "boosted-container-name"
mode: "Off"
startupBoost:
cpu:
type: "Quantity"
quantity: "2"
옵션 B: 포드 수준 부스트에서 특정 컨테이너 선택 해제
포드 수준 부스트가 구성되어 있지만 특정 컨테이너를 제외하려면 이 옵션을 사용하세요. 다음 매니페스트 예시에서는 전체 포드에 CPU 곱셈 계수 2을 적용하지만, 계수를 1로 설정하여 disable-cpu-boost-for-this-container이라는 컨테이너의 부스트를 사용 중지합니다.
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
resourcePolicy:
containerPolicies:
- containerName: "disable-cpu-boost-for-this-container"
startupBoost:
cpu:
type: "Factor"
factor: 1
CPU 시작 부스트 확인
포드가 부스트를 받는지 확인하려면 VPA 구성, 포드 리소스 요청, 포드 주석, VPA 이벤트를 확인하세요.
VPA 구성 확인
VerticalPodAutoscaler 객체의 세부정보를 확인하려면 다음 명령어를 실행합니다.
kubectl describe vpa VPA_NAME
VPA_NAME을 VPA 객체 이름으로 바꿉니다.
포드에서 부스트된 CPU 요청 확인
포드의 현재 리소스 요청을 확인하려면 다음 명령어를 실행합니다.
kubectl describe pod POD_NAME
POD_NAME을 포드 이름으로 바꿉니다.
포드 주석을 사용하여 CPU 부스트 확인
VPA 허용 웹훅은 부스트가 만료될 때 각 컨테이너가 되돌아가야 하는 원래 리소스를 추적하기 위해 컨테이너 범위 주석을 삽입합니다. 이러한 주석을 확인하려면 다음 명령어를 실행하세요.
kubectl get pod POD_NAME --output yaml
metadata.annotations 섹션에서 vpaCpuStartupBoost/CONTAINER_NAME 형식으로 지정된 주석을 찾습니다. 예를 들면 다음과 같습니다.
metadata:
annotations:
vpaCpuStartupBoost/slow-starter: '{"requests":{"cpu":"50m","memory":"64Mi"},"limits":{"cpu":"200m","memory":"128Mi"}}'
명령어 출력은 다음 확인 결과 중 하나를 나타냅니다.
- 성공적인 부스트:
vpaCpuStartupBoost/CONTAINER_NAME주석이 포드에 있습니다. - 실패한 향상: 주석이 완전히 누락되었습니다. 이는 승인 컨트롤러가 노드 용량 한도 또는 Autopilot 리소스 제한으로 인해 부스트를 무시했음을 의미합니다.
축소 이벤트 확인
GKE가 CPU 리소스 할당을 기준선으로 다시 줄였는지 확인하려면 다음 명령어를 실행하여 클러스터 이벤트를 확인하세요.
kubectl get events --field-selector reason=InPlaceResizedByVPA
명령어 출력은 다음 확인 결과 중 하나를 나타냅니다.
- 성공적인 부스트 해제: VPA Updater에 의해 포드의 크기가 제자리에서 조정되었음을 나타내는 메시지와 함께
InPlaceResizedByVPA이벤트가 표시됩니다. 이를 통해 컨테이너를 다시 시작하지 않고 CPU 요청이 기준 값으로 돌아갔음을 확인할 수 있습니다. - 부스트 해제 실패: 부스트가 만료된 후에도
vpaCpuStartupBoost/CONTAINER_NAME주석이 포드에 남아 있고InPlaceResizedByVPA이벤트가 없습니다.
권장사항 및 제한사항
CPU 시작 부스트를 사용할 때는 다음 사항을 검토하세요.
수평형 포드 자동 확장과의 상호작용
CPU 시작 부스트와 함께 수평형 포드 자동 확장 처리 (HPA)를 사용하는 경우 다음 가이드라인을 따르세요.
- 상태 프로브 정의: 워크로드에
readinessProbe를 정의해야 합니다. - 지연 시간 구성:
durationSeconds매개변수를0로 설정해야 합니다. 이 구성은 시작 중에 CPU 사용률이 높아 HPA가 애플리케이션을 너무 일찍 스케일 아웃하는 것을 방지합니다.
클러스터 자동 확장 처리 및 제거 루프
GKE Standard 클러스터에서 클러스터 자동 확장 처리를 사용하는 경우 다음 노드 동작을 고려하세요.
- 잠재적 제거 루프: 임시 CPU 부스트로 인해 노드 스케일 업이 트리거될 수 있습니다. 포드가 준비되고 축소된 후 사용률이 낮으면 노드 축소가 트리거되고 포드가 제거되어 무한 루프가 발생할 수 있습니다.
- 완화: GKE Autopilot을 사용하여 노드 조각화 및 제거 루프 문제를 완화하는 것이 좋습니다.
컨테이너 재시작
다음 동작을 검토하여 컨테이너 재시작이 CPU 시작 부스트에 미치는 영향을 파악하세요.
- 포드 생성 중에만: CPU 시작 부스트는 초기 포드 생성 단계 중에만 적용됩니다.
- 다시 시작 시 부스트 없음: 컨테이너가 OOMKill 이벤트 등으로 인해 다시 시작되지만 포드가 활성 상태로 유지되면 GKE는 부스트를 다시 적용하지 않습니다. 이 동작은 포드 허용 웹훅이 초기 포드 생성 프로세스 중에만 트리거되기 때문에 발생합니다.
삭제
기존 워크로드에서 CPU 시작 부스트를 구성하므로 워크로드 중단을 방지하려면 다음 사항에 유의하세요.
- Kubernetes 리소스를 삭제할 필요는 없습니다.
- 정상 상태 작업에 VerticalPodAutoscaler 객체 또는 워크로드 컨트롤러 (예: 배포 또는 StatefulSet)가 여전히 필요한 경우 삭제하지 마세요.
CPU 시작 부스트가 필요하지 않은 경우 범위에 따라 다음 방법 중 하나를 사용하여 부스트만 사용 중지하면 됩니다.
- 전체 워크로드에 대해 부스트 사용 중지: VerticalPodAutoscaler 객체 사양에서
startupBoost블록을 삭제하고 업데이트된 매니페스트를 클러스터에 적용합니다. 특정 컨테이너의 부스트 사용 중지: 포드 수준 부스트에서 특정 컨테이너를 제외하려면
containerPolicies섹션 아래에 컨테이너 정책을 추가하고 CPU 승수 요소를 1로 설정합니다.startupBoost: cpu: type: "Factor" factor: 1자세한 내용은 컨테이너 수준 부스트 구성을 참고하세요.
- 전체 워크로드에 대해 부스트 사용 중지: VerticalPodAutoscaler 객체 사양에서