CPU 시작 부스트로 애플리케이션 시작 가속화

이 문서에서는 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 사용 설정: 수직형 포드 자동 확장 사용 설정 Standard 클러스터에서. 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_ID
    

    PROJECT_ID를 프로젝트의 ID로 바꿉니다.

  • 기존 GKE 클러스터가 있는지 확인합니다. 클러스터가 없으면 클러스터 만들기를 참조하세요.

필요한 역할

CPU 시작 부스트를 사용 설정하고 사용하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

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 2개를 추가합니다.

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 업데이트 프로그램에서 포드의 크기를 인플레이스로 조정했음을 나타내는 메시지와 함께 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
      

      자세한 내용은 컨테이너 수준 부스트 구성을 참조하세요.

다음 단계