인프라 비용과 할당량을 보다 효과적으로 관리하려면 Google Kubernetes Engine (GKE) 클러스터 자동 확장 처리에 대한 최대 리소스 한도를 정의하면 됩니다. 이 문서에서는 CapacityQuota 커스텀 리소스를 사용하여 노드 하위 집합의 자동 확장 리소스 한도를 지정하는 방법을 보여줍니다. 클러스터 전체 리소스 한도와 달리 Kubernetes 라벨 선택기를 사용하여 CapacityQuota에서 특정 노드를 선택할 수 있습니다.
이 문서는 클러스터 확장 및 인프라를 관리하는 플랫폼 관리자를 대상으로 합니다. Kubernetes 노드 라벨과 GKE 클러스터 자동 확장 처리에 대해 숙지하고 있어야 합니다.
CapacityQuota 리소스 한도의 작동 방식
CapacityQuota는 매니페스트에서 구성하고 클러스터에 적용하는 클러스터 범위 Kubernetes 커스텀 리소스입니다. CapacityQuota 사양에서 다음 필드를 사용하여 노드를 선택하고 리소스 제한을 지정합니다.
selector: 하나 이상의 라벨 선택기를 사용하여 특정 노드를 필터링합니다. 예를 들어 특정 ComputeClass의 모든 노드 또는 특정 라벨이 두 개 있는 노드를 선택할 수 있습니다.limits: 선택기와 일치하는 노드의 최대 리소스 한도를 지정합니다. 예를 들어 특정 커스텀 ComputeClass에서 사용할 수 있는 CPU 양을 제한하거나 특정 유형의 GPU 수를 제한할 수 있습니다.
확장 작업이 시작되면 클러스터 자동 확장 처리는 노드 라벨과 일치하는 모든 CapacityQuota와 구성된 클러스터 전체 리소스 한도에 대해 제안된 노드를 확인합니다. GKE는 노드가 구성된 리소스 한도를 위반하지 않는 경우에만 노드를 만듭니다.
제한사항
- GKE는
node.kubernetes.io/instance-type및beta.kubernetes.io/instance-type라벨 선택기를 지정하는 CapacityQuota를 거부합니다. 특정 머신 유형을 사용하는 노드를 제한하려면machineType우선순위 규칙이 있는 커스텀 ComputeClass를 만들고 CapacityQuota에서 해당 ComputeClass를 선택합니다. - 클러스터 전체 제한과 마찬가지로 CapacityQuotas로 인해 ComputeClass 활성 마이그레이션이 발생하지 않을 수 있습니다. 활성 마이그레이션은 수직 확장 작업이므로 클러스터 자동 확장 처리는 적용 가능한 모든 CapacityQuota 및 클러스터 전체 리소스 한도에 대해 잠재적인 새 노드를 확인합니다. 새 노드가 이러한 제한 중 하나를 위반하면 GKE는 노드를 만들지 않으며 활성 마이그레이션이 발생하지 않습니다. 이 상황은 CapacityQuota가 이미 구성된 한도에 도달했거나 한도에 가까운 경우에만 발생합니다.
- CapacityQuota 한도는 엄격한 한도가 아닙니다. 드물지만 GKE가 구성된 한도를 약간 초과하는 경우가 있습니다.
- CapacityQuota 한도는 클러스터 자동 확장 처리에 의해서만 적용됩니다. 클러스터를 수동으로 확장하거나 한도를 현재 사용량보다 낮게 변경하면 한도를 초과할 수 있습니다.
- 클러스터의 노드가 구성된 CapacityQuota 한도를 초과하면 클러스터 자동 확장 처리는 초과된 CapacityQuota와 일치하는 새 노드의 생성을 차단합니다. 클러스터 자동 확장 처리는 CapacityQuota와 일치하는 기존 노드를 축소하지 않습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면
gcloud components update명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
- 버전 1.36.2-gke.2064000 이상을 실행하는 기존 Autopilot 또는 Standard 클러스터가 있는지 확인합니다. 새 클러스터를 만들려면 Autopilot 클러스터 만들기를 참고하세요.
CapacityQuota에서 리소스 한도 구성
다음 방법 중 하나 또는 둘 다를 사용하여 CapacityQuota가 적용되는 노드를 선택할 수 있습니다.
정확한 노드 라벨을 사용하여 노드 선택:
matchLabels필드에 노드 라벨 키-값 쌍을 하나 이상 지정합니다. GKE는 지정한 라벨이 모두 있는 노드를 찾습니다. 이 방법은 포드 사양에서nodeSelector필드를 사용하는 것과 비슷합니다.표현식을 사용하여 노드 선택: 라벨 키, 연산자, 값을 지정하여 하나 이상의 라벨 선택기 표현식을 지정합니다. 이 방법은 포드 사양에서
nodeAffinity필드를 사용하는 것과 비슷합니다.
노드 라벨을 사용하여 노드 선택
matchLabels 필드를 사용하여 노드 라벨 일치를 기반으로 CapacityQuota를 구성하려면 다음 단계를 따르세요.
다음 예시 CapacityQuota 중 하나를 저장합니다. 각 예시는 특정 사용 사례를 위한 것입니다.
cloud.google.com/compute-class라벨을 지정하여 전체 커스텀 ComputeClass의 리소스 한도를 구성합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityQuota metadata: name: capacity-quota-compute-class spec: selector: matchLabels: cloud.google.com/compute-class: my-class limits: resources: cpu: 12이 CapacityQuota는 클러스터 자동 확장 처리기가 GKE에서
my-classComputeClass에 대해 만드는 모든 노드에서 최대 12개의 CPU로 제한합니다.cloud.google.com/gke-accelerator라벨과nvidia.com/gpu리소스 이름을 사용하여 특정 유형의 GPU 수에 대한 제한을 구성합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityQuota metadata: name: capacity-quota-gpu spec: selector: matchLabels: cloud.google.com/compute-class: my-gpu-class cloud.google.com/gke-accelerator: nvidia-tesla-t4 limits: resources: nvidia.com/gpu: 16이 CapacityQuota는 클러스터 자동 확장 처리를
my-gpu-classComputeClass에서 최대 16개의 NVIDIA Tesla T4 GPU로 제한합니다. ComputeClass 선택기를 생략하면 클러스터의 모든 NVIDIA Tesla T4 GPU 노드에 한도가 적용됩니다.topology.kubernetes.io/zone라벨과nodes리소스 이름을 사용하여 GKE가 특정 영역에 만드는 노드 수를 제한합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityQuota metadata: name: capacity-quota-zone spec: selector: matchLabels: topology.kubernetes.io/zone: us-central1-b limits: resources: nodes: 64이 CapacityQuota는 클러스터 자동 확장 처리기를
us-central1-b영역의 64개 노드로 제한합니다.
CapacityQuota를 만듭니다.
kubectl apply -f PATH_TO_MANIFEST_FILEPATH_TO_MANIFEST_FILE를 만든 CapacityQuota 매니페스트 파일의 경로로 바꿉니다.
표현식을 사용하여 노드 선택
더 복잡한 타겟팅의 경우 CapacityQuota는 matchLabels 필드 외에도 matchExpressions 필드를 정의할 수 있습니다. matchExpressions는 In, NotIn, Exists, DoesNotExist와 같은 연산자를 사용 설정합니다.
matchExpressions필드를 사용하는 CapacityQuota 매니페스트를 만듭니다. 다음 CapacityQuota 예시에서는In연산자를 사용하여 특정 고성능 머신 계열에서 실행되는 노드를 그룹화하여 CPU 및 메모리 한도를 적용합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityQuota metadata: name: capacity-quota-high-perf-machines spec: selector: matchExpressions: - key: cloud.google.com/machine-family operator: In values: - c2 - c3 - c3d limits: resources: cpu: 64 memory: 128Gi매니페스트를 클러스터에 적용합니다.
kubectl apply -f PATH_TO_MANIFEST_FILEPATH_TO_MANIFEST_FILE를 만든 CapacityQuota 매니페스트 파일의 경로로 바꿉니다.
CapacityQuota 구성 확인
이 섹션에서는 한도를 위반하는 예시 워크로드를 배포하여 CapacityQuota가 한도를 적극적으로 적용하는지 확인하는 방법을 보여줍니다. 이 확인을 수행하려면 다음 단계를 따르세요.
다음 예시 ComputeClass를
test-capacityquota-class.yaml로 저장합니다.apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: test-capacityquota-class spec: priorities: - machineFamily: n2 nodePoolAutoCreation: enabled: true이 ComputeClass는 N2 머신 시리즈를 사용하는 노드를 자동으로 만들 수 있습니다.
ComputeClass를 만듭니다.
kubectl apply -f test-capacityquota-class.yaml다음 예시 CapacityQuota를
test-capacityquota.yaml로 저장합니다.apiVersion: autoscaling.x-k8s.io/v1beta1 kind: CapacityQuota metadata: name: test-capacityquota spec: selector: matchLabels: cloud.google.com/compute-class: test-capacityquota-class limits: resources: cpu: 8이 CapacityQuota는 자동 확장 처리를
test-capacityquota-classComputeClass에 대해 최대 8개의 CPU 리소스로 제한합니다.CapacityQuota를 만듭니다.
kubectl apply -f test-capacityquota.yaml다음 배포를
test-capacityquota-workload.yaml로 저장합니다.apiVersion: apps/v1 kind: Deployment metadata: name: test-capacityquota-workload spec: replicas: 16 selector: matchLabels: app: test-capacityquota-workload template: metadata: labels: app: test-capacityquota-workload spec: containers: - name: test image: gcr.io/google_containers/pause resources: limits: cpu: 500m nodeSelector: cloud.google.com/compute-class: test-capacityquota-class이 Deployment는 각각 500mCPU를 요청하는 포드 16개를 생성합니다. 노드는 시스템 구성요소에 일부 CPU를 예약하므로 16개의 포드를 실행하기 위해 GKE가 만들어야 하는 모든 노드의 CPU 리소스 합계는
8보다 큽니다.배포를 만듭니다.
kubectl apply -f test-capacityquota-workload.yaml약 2분 정도 기다린 후 포드 예약 상태를 확인합니다.
kubectl get pods -l app=test-capacityquota-workload클러스터 자동 확장 처리는 노드를 CPU 8개의 CapacityQuota 한도까지 확장합니다. 이 한도에 도달하면 자동 확장 처리에서 노드를 생성하지 않습니다. 따라서 배포의 일부 포드가
Pending상태로 유지됩니다.CapacityQuota가
Pending상태의 원인인지 확인하려면 대기 중인 포드 중 하나를 설명합니다.kubectl describe pod PENDING_POD_NAMEPENDING_POD_NAME을Pending상태에서 멈춘 포드의 이름으로 바꿉니다.출력은 다음과 비슷하며, 이는 CapacityQuota가 노드 스케일 업을 차단했음을 나타냅니다.
Pod didn't trigger scale-up: 1 exceeded quota: "CapacityQuota/test-capacityquota", resources: cpu클러스터 자동 확장 처리 공개 상태 로그를 사용하여 이러한 이벤트를 볼 수도 있습니다. 다음 예시와 같이
noScaleUp이벤트를 확인합니다.{ "jsonPayload": { "noDecisionStatus": { "noScaleUp": { "skippedMigs": [ { "reason": { "parameters": [ "exceeded quota: \"CapacityQuota/test-capacityquota\", resources: cpu" ], "messageId": "no.scale.up.mig.skipped" }, "mig": { "name": "gke-test-grp", "zone": "us-central1-f", "nodepool": "nap-n2-highcpu-2-test" } } ] } } } }
CapacityQuotas의 사용량 및 유효성 확인
CapacityQuota API 리소스의 status 필드는 CapacityQuota와 일치하는 노드의 리소스 사용량과 CapacityQuota 사양의 유효성에 대한 정보를 제공합니다.
CapacityQuota 상태를 확인하려면 다음 명령어를 실행합니다.
kubectl describe capacityquota CAPACITY_QUOTA_NAME
CAPACITY_QUOTA_NAME을 검사하려는 CapacityQuota의 이름으로 바꿉니다.
출력에서 다음 필드를 확인합니다.
일치하는 노드의 리소스 사용량을 확인하려면
status.used필드를 사용하세요.status: conditions: - lastTransitionTime: "2026-07-27T10:00:00Z" message: "CapacityQuota is valid" reason: "Valid" status: "True" type: "cluster-autoscaler.kubernetes.io/valid" used: resources: cpu: 32 memory: 128Gistatus.used필드는 관측 가능성을 위한 것이며 클러스터 자동 확장 처리기에서 제한을 적용하는 데 사용되지 않습니다. 이 필드는 수직 확장 작업이 성공한 후에만 사용량을 표시합니다. 클러스터 자동 확장 처리는 또한 대기 중인 노드를 내부적으로 추적하고 이러한 대기 중인 노드를 후속 수직 확장 평가에 반영합니다. 이 내부 추적은 한도를 초과하지 않도록 하는 데 도움이 됩니다.CapacityQuota의 유효성을 확인하려면
status.conditions필드를 사용하세요.status: conditions: - lastTransitionTime: "2026-07-27T10:00:00Z" message: "CapacityQuota is valid" reason: "Valid" status: "True" type: "cluster-autoscaler.kubernetes.io/valid" used: resources: cpu: 32 memory: 128Gicluster-autoscaler.kubernetes.io/valid조건은 CapacityQuota가 올바르게 형식이 지정된 선택기와 같은 유효한 구성을 사용하는지 확인합니다. 이 조건의status필드 값이True이면 CapacityQuota가 유효하며 한도가 적용됩니다. 하지만status필드의 값이False이거나 아직 조건이 없는 경우 제한이 적용되지 않습니다.message필드는 CapacityQuota가 유효하지 않은 이유에 대한 세부정보를 제공합니다.
다음 단계
- 클러스터 자동 확장 처리 작동 방식 자세히 알아보기
- CapacityQuota API 참조를 확인하세요.