세부 리소스 한도 구성

인프라 비용과 할당량을 보다 효과적으로 관리하려면 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를 구성하려면 다음 단계를 따르세요.

  1. 다음 예시 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-class ComputeClass에 대해 만드는 모든 노드에서 최대 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-class ComputeClass에서 최대 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개 노드로 제한합니다.

  2. CapacityQuota를 만듭니다.

    kubectl apply -f PATH_TO_MANIFEST_FILE
    

    PATH_TO_MANIFEST_FILE를 만든 CapacityQuota 매니페스트 파일의 경로로 바꿉니다.

표현식을 사용하여 노드 선택

더 복잡한 타겟팅의 경우 CapacityQuota는 matchLabels 필드 외에도 matchExpressions 필드를 정의할 수 있습니다. matchExpressions는 In, NotIn, Exists, DoesNotExist와 같은 연산자를 사용 설정합니다.

  1. 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
    
  2. 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f PATH_TO_MANIFEST_FILE
    

    PATH_TO_MANIFEST_FILE를 만든 CapacityQuota 매니페스트 파일의 경로로 바꿉니다.

CapacityQuota 구성 확인

이 섹션에서는 한도를 위반하는 예시 워크로드를 배포하여 CapacityQuota가 한도를 적극적으로 적용하는지 확인하는 방법을 보여줍니다. 이 확인을 수행하려면 다음 단계를 따르세요.

  1. 다음 예시 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 머신 시리즈를 사용하는 노드를 자동으로 만들 수 있습니다.

  2. ComputeClass를 만듭니다.

    kubectl apply -f test-capacityquota-class.yaml
    
  3. 다음 예시 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-class ComputeClass에 대해 최대 8개의 CPU 리소스로 제한합니다.

  4. CapacityQuota를 만듭니다.

    kubectl apply -f test-capacityquota.yaml
    
  5. 다음 배포를 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보다 큽니다.

  6. 배포를 만듭니다.

    kubectl apply -f test-capacityquota-workload.yaml
    
  7. 약 2분 정도 기다린 후 포드 예약 상태를 확인합니다.

    kubectl get pods -l app=test-capacityquota-workload
    

    클러스터 자동 확장 처리는 노드를 CPU 8개의 CapacityQuota 한도까지 확장합니다. 이 한도에 도달하면 자동 확장 처리에서 노드를 생성하지 않습니다. 따라서 배포의 일부 포드가 Pending 상태로 유지됩니다.

  8. CapacityQuota가 Pending 상태의 원인인지 확인하려면 대기 중인 포드 중 하나를 설명합니다.

    kubectl describe pod PENDING_POD_NAME
    

    PENDING_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: 128Gi
    

    status.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: 128Gi
    

    cluster-autoscaler.kubernetes.io/valid 조건은 CapacityQuota가 올바르게 형식이 지정된 선택기와 같은 유효한 구성을 사용하는지 확인합니다. 이 조건의 status 필드 값이 True이면 CapacityQuota가 유효하며 한도가 적용됩니다. 하지만 status 필드의 값이 False이거나 아직 조건이 없는 경우 제한이 적용되지 않습니다. message 필드는 CapacityQuota가 유효하지 않은 이유에 대한 세부정보를 제공합니다.

다음 단계