수평형 포드 자동 확장 구성

이 문서에서는 클러스터에서 실행되는 기존 스테이트리스 워크로드에 수평형 포드 자동 확장 처리(HPA)를 설정하는 방법을 설명합니다. 수평형 포드 자동 확장은 실시간 수요에 따라 애플리케이션의 실행 중인 포드 (복제본) 수를 자동으로 조정하여 부하가 감소하면 포드를 삭제하고 부하가 증가하면 포드를 추가합니다. 이러한 확장 및 축소는 수동 개입 없이 용량을 사용자 트래픽에 정확하게 일치시켜 애플리케이션 가용성, 효율적인 리소스 사용, 비용 절감을 보장하는 데 중요합니다. 컨테이너 워크로드 요구사항이 진화함에 따라 포드 자동 확장 기능을 사용하면 운영자가 성능을 지속적으로 모니터링하고 포드 수를 수동으로 조정할 필요가 없습니다.

이 페이지는 기본 기술 인프라 수명 주기를 관리하는 관리자, 설계자, 운영자를 대상으로 합니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.

배포 확장하기

Kubernetes의 확장 기능을 사용하여 배포에서 실행되는 포드 수를 적절하게 확장합니다.

배포의 포드 자동 확장

Kubernetes는 수요가 변화할 때 배포를 수동으로 업데이트할 필요가 없도록 자동 확장 기능을 제공합니다. 다음 단계를 완료하여 배포의 포드를 자동 확장합니다.

  1. 수평형 포드 자동 확장 처리기가 CPU 비율을 적절하게 측정할 수 있도록 배포에서 CPU 리소스 요청을 설정하세요.

  2. 배포에서 수평형 포드 자동 확장 처리기를 설정합니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG \
        -n NAMESPACE \
        autoscale deployment DEPLOYMENT_NAME \
        --cpu-percent=CPU_PERCENT \
        --min=MIN_NUMBER_REPLICAS \
        --max=MAX_NUMBER_REPLICAS
    

    다음을 바꿉니다.

    • CLUSTER_KUBECONFIG: 클러스터의 kubeconfig 파일입니다.

    • NAMESPACE: 네임스페이스입니다. 공유 클러스터의 경우 프로젝트 네임스페이스여야 합니다. 표준 클러스터의 경우 모든 네임스페이스가 될 수 있습니다.

    • DEPLOYMENT_NAME: 자동 확장할 배포의 이름입니다.

    • CPU_PERCENT: 모든 포드에서 요청할 대상 평균 CPU 사용률입니다(백분율로 표시).

    • MIN_NUMBER_REPLICAS: 자동 확장 처리에서 프로비저닝할 수 있는 포드 수의 하한입니다.

    • MAX_NUMBER_REPLICAS: 자동 확장 처리에서 프로비저닝할 수 있는 포드 수의 상한입니다.

  3. 수평형 포드 자동 확장 처리의 현재 상태를 확인합니다.

    kubectl get hpa
    

    출력은 다음과 비슷합니다.

    NAME              REFERENCE                          TARGET    MINPODS   MAXPODS   REPLICAS   AGE
    DEPLOYMENT_NAME   Deployment/DEPLOYMENT_NAME/scale   0% / 50%  1         10        1          18s
    

배포의 포드를 수동으로 확장

배포를 수동으로 확장하려면 다음을 실행하세요.

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    -n NAMESPACE \
    scale deployment DEPLOYMENT_NAME \
    --replicas NUMBER_OF_REPLICAS

다음을 바꿉니다.

  • CLUSTER_KUBECONFIG: 클러스터의 kubeconfig 파일입니다.

  • NAMESPACE: 네임스페이스입니다. 공유 클러스터의 경우 프로젝트 네임스페이스여야 합니다. 표준 클러스터의 경우 모든 네임스페이스가 될 수 있습니다.

  • DEPLOYMENT_NAME: 자동 확장할 배포의 이름입니다.

  • DEPLOYMENT_NAME: 배포에 있는 복제된 Pod 객체의 수입니다.

자동 확장을 위해 Prometheus의 맞춤 측정항목 사용

수평형 포드 자동 확장은 기본적으로 CPU 및 메모리 사용률과 같은 표준 리소스 측정항목을 사용합니다. 표준 측정항목은 일반적인 확장에 적합하지만 특수 애플리케이션 부하에는 유용하지 않습니다.

Prometheus의 커스텀 측정항목과 함께 수평형 포드 자동 확장을 사용하면 HTTP 요청률, 대기열 깊이, 처리 지연 시간과 같은 애플리케이션별 측정항목을 기반으로 워크로드를 확장할 수 있습니다. 클러스터는 Prometheus 모니터링 스택에서 이미 수집한 풍부한 데이터를 활용하여 실제 수요에 더 정확하게 대응할 수 있습니다.

수평형 포드 자동 확장과 함께 Prometheus를 사용하기 위한 필수 요건

이 기능을 사용 설정하기 전에 다음 조건을 충족해야 합니다.

  • 기존 Prometheus 서버: Prometheus 서버가 이미 배포되어 있고 클러스터 내에서 네트워크를 통해 액세스할 수 있어야 합니다 (HPA 컨트롤러는 Prometheus 인스턴스 자체를 관리하지 않음). 자세한 내용은 Kubernetes에서 Prometheus 연산자를 배포하고 구성하는 방법을 참고하세요.

  • 관리 권한: 클러스터 커스텀 리소스를 수정하는 데 필요한 권한이 있어야 합니다.

  • API 충돌 없음: 사전 검사에서는 다른 구성요소가 이미 custom.metrics.k8s.io용 APIService를 등록하지 않았는지 확인합니다. 충돌이 있으면 어댑터를 사용 설정할 수 없습니다.

Prometheus 사용 설정 및 구성

이 프로세스에는 측정항목 규칙을 정의하고 클러스터 구성을 업데이트하는 작업이 포함됩니다.

  1. 측정항목 규칙 ConfigMap을 하나 이상 만듭니다.

    타겟 클러스터 네임스페이스 내 하나 이상의 ConfigMap에서 맞춤 측정항목의 PromQL 기반 규칙을 정의합니다. 컨트롤러는 이러한 ConfigMap을 감시하고 병합하여 어댑터에 자동으로 적용합니다.

    규칙 정의에 관한 자세한 내용은 kubernetes-sigs/prometheus-adapter측정항목 검색 및 표시 구성을 참고하세요.

    다음 샘플은 data 필드에 http_requests_per_second에 대해 정의된 규칙이 있는 ConfigMap을 보여줍니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-app-rules
      namespace: <cluster-namespace>
    data:
      config.yaml: |
        rules:
        - seriesQuery: 'http_requests_total'
          resources:
            overrides:
              namespace_name: {resource: "namespace"}
              pod_name: {resource: "pod"}
          name:
            matches: "^(.*)_total$"
            as: "${1}_per_second"
          metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'
    
  2. Prometheus 서버에 상호 전송 계층 보안 (mTLS)과 같은 인증이 필요한 경우 필요한 사용자 인증 정보가 포함된 kubeconfig 형식의 Kubernetes Secret을 만듭니다.

    다음 예는 기본 인증을 지원하는 보안 비밀을 보여줍니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: prometheus-auth-secret
      namespace: <cluster-namespace>
      annotations:
        baremetal.cluster.gke.io/mark-source: "true"
    type: Opaque
    stringData:
      config: authentication-credentials
    
  3. 클러스터 커스텀 리소스를 업데이트합니다.

    1. 클러스터 커스텀 리소스의 metadatapreview.baremetal.cluster.gke.io/metrics-adapter: "true" 주석을 추가합니다.

    2. spec.metricsAdapter 섹션을 추가하여 Prometheus URL을 정의하고 규칙 ConfigMap을 참조합니다.

      apiVersion: baremetal.cluster.gke.io/v1
      kind: Cluster
      metadata:
        name: <cluster-name>
        namespace: <cluster-namespace>
        annotations:
          preview.baremetal.cluster.gke.io/metrics-adapter: "true"
      spec:
        # ... other existing cluster configurations ...
        metricsAdapter:
          prometheus:
            url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090"
            orgID: "production-environment"
            auth:
              configSecretRef:
                name: prometheus-auth-secret
                key: config # This is the key within the Secret's 'data' field
          rules:
            configMapKeyRefs:
              - name: my-app-rules
                key: config.yaml # This is the key within the ConfigMap's 'data' field
              # - name: base-system-rules
              #   key: config.yaml
      

      Prometheus 인스턴스에 인증이 필요하지 않으면 클러스터 사양에서 metricsAdapter.prometheus.auth 섹션을 생략할 수 있습니다.

  4. 업데이트된 클러스터 커스텀 리소스를 적용합니다.

    컨트롤러는 Prometheus 어댑터를 kube-system 네임스페이스에 자동으로 배포합니다.

  5. ConfigMaps rules 필드에 정의된 맞춤 측정항목을 타겟팅하는 HorizontalPodAutoscaler 리소스를 만들어 수평형 포드 자동 확장에 맞춤 측정항목을 사용합니다.

    이전 단계의 ConfigMap 샘플에서는 http_requests_per_second 커스텀 측정항목을 정의했습니다. 이 측정항목을 사용하려면 HorizontalPodAutoscaler 리소스가 다음 예시와 비슷해야 합니다.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: <name>
      namespace: <namespace>
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <workload-name>
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: http_requests_per_second
          target:
            type: AverageValue
            averageValue: 10
    

Prometheus 사용 중지

수평형 포드 자동 확장과 함께 Prometheus를 사용하지 않도록 설정하려면 클러스터 커스텀 리소스에서 spec.metricsAdapter 섹션을 삭제하세요.