HPA 및 용량 버퍼를 사용하여 에이전트 샌드박스를 동적으로 확장

이 페이지에서는 GKE Standard 클러스터에서 수평형 포드 자동 확장 처리 (HPA) 및 대기 용량 버퍼를 사용하여 GKE 에이전트 샌드박스 환경을 동적으로 확장하는 방법을 설명합니다.

기본적으로 에이전트 샌드박스 웜 풀 은 포드 시작 지연 시간을 최소화하기 위해 미리 프로비저닝된 복제본의 정적 수를 유지합니다. 이렇게 하면 트래픽이 가변적인 시나리오를 방지할 수 있습니다. 이러한 시나리오에서는 많은 수의 정적 복제본을 유지하는 데 높은 컴퓨팅 비용이 발생할 수 있습니다.

동적 확장을 사용하면 용량 준비 상태와 비용 절감을 균형 있게 유지할 수 있습니다. 이 접근 방식은 수요에 따라 SandboxWarmPool의 크기를 조정하고 대기 용량 버퍼 (일시중지된 VM)를 사용하여 활성 노드를 과도하게 프로비저닝하는 데 드는 전체 비용 없이 빠른 확장을 위해 인프라를 사전에 프로비저닝합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

클러스터 만들기

대기 용량 버퍼 및 에이전트 샌드박스에 필요한 구성으로 GKE Standard 클러스터를 만들려면 다음 명령어를 실행합니다.

gcloud container clusters create CLUSTER_NAME \
    --location=CONTROL_PLANE_LOCATION \
    --cluster-version=VERSION \
    --enable-autoscaling \
    --enable-autoprovisioning \
    --max-cpu=MAX_CPU \
    --max-memory=MAX_MEMORY \
    --enable-agent-sandbox \
    --enable-image-streaming \
    --workload-pool=PROJECT_ID.svc.id.goog \
    --monitoring=SYSTEM

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • VERSION: GKE 버전으로, 1.36.0-gke.2208000 이상이어야 합니다.
  • CONTROL_PLANE_LOCATION: 새 클러스터의 Compute Engine 위치입니다. 리전 클러스터의 경우 리전 (예: us-central1)을 선택하고 영역 클러스터의 경우 영역 (예: us-central1-a)을 선택합니다.
  • MAX_CPU: 자동 프로비저닝의 최대 CPU 한도(예: 4000)
  • MAX_MEMORY: 자동 프로비저닝의 최대 메모리 한도(GB)(예: 12000)
  • PROJECT_ID: 프로젝트 ID입니다. Google Cloud

에이전트 샌드박스 구성요소 구성

샌드박스 처리된 워크로드를 관리하려면 SandboxTemplateSandboxWarmPool을 정의해야 합니다.

  1. 다음 매니페스트를 sandboxtemplate.yaml로 저장합니다.

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxTemplate
    metadata:
      name: agent-template
      namespace: NAMESPACE
    spec:
      podTemplate:
        metadata:
          labels:
            app: agent-sandbox-workload
        spec:
          restartPolicy: Never
          containers:
            - name: python-agent
              image: python:3.11-slim
              command: ["/bin/sh", "-c"]
              args: ["echo 'Hello from the Sandbox!' && sleep 3600"]
              resources:
                requests:
                  cpu: "1000m"
                  memory: "100Mi"
    

    NAMESPACE를 네임스페이스(예: agent-sandbox-demo)로 바꿉니다.

  2. 매니페스트를 적용합니다.

    kubectl apply -f sandboxtemplate.yaml
    
  3. 다음 매니페스트를 sandboxwarmpool.yaml로 저장합니다. 이렇게 하면 복제본의 초기 정적 풀이 설정됩니다.

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxWarmPool
    metadata:
      name: agent-warmpool
      namespace: NAMESPACE
    spec:
      replicas: 10
      sandboxTemplateRef:
        name: agent-template
    
  4. 매니페스트를 적용합니다.

    kubectl apply -f sandboxwarmpool.yaml
    

측정항목 수집 구성

에이전트 샌드박스 컨트롤러는 클레임된 샌드박스 수에 대한 카운터 측정항목(agent_sandbox_claim_creation_total)을 노출합니다. PodMonitoring 리소스를 구성하여 이 측정항목을 수집하고 Google Cloud Managed Service for Prometheus로 보낼 수 있습니다.

  1. 다음 매니페스트를 podmonitoring.yaml로 저장합니다.

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: agent-sandbox-controller-monitoring
      namespace: agent-sandbox-system # Namespace where the controller is running
    spec:
      selector:
        matchLabels:
          app: agent-sandbox-controller
      endpoints:
      - port: 8080 # Port where metrics are exposed
        path: /metrics
        interval: 15s
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f podmonitoring.yaml
    

커스텀 측정항목 어댑터 사용 설정

HPA가 Google Cloud Managed Service for Prometheus에서 측정항목을 읽을 수 있도록 하려면 custom-metrics-stackdriver-adapter를 배포해야 합니다.

필요한 IAM 결합을 사용 설정합니다. 다음 명령어를 실행합니다.

kubectl create clusterrolebinding cluster-admin-binding \
    --clusterrole=cluster-admin --user="$(gcloud config get-value account)"

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml

gcloud projects add-iam-policy-binding PROJECT_ID \
  --role=roles/monitoring.viewer \
  --member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/custom-metrics/sa/custom-metrics-stackdriver-adapter

PROJECT_NUMBER를 Google Cloud 프로젝트 번호로 바꿉니다.

SandboxWarmPool의 RBAC 권한 구성

용량 버퍼 컨트롤러에는 SandboxWarmPool 커스텀 리소스의 확장 하위 리소스를 읽을 수 있는 권한이 필요합니다.

  1. 다음 매니페스트를 capacity-buffer-rbac.yaml로 저장합니다.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: sandbox-warmpool-scale-reader
    rules:
    - apiGroups: ["extensions.agents.x-k8s.io"]
      resources: ["sandboxwarmpools/scale"]
      verbs: ["get"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: ca-sandbox-warmpool-scale-reader
    subjects:
    - kind: User
      name: "system:cluster-autoscaler"
      namespace: kube-system
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: sandbox-warmpool-scale-reader
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f capacity-buffer-rbac.yaml
    

용량 버퍼 구성

SandboxWarmPool의 크기에 비례하는 인프라 버퍼를 유지하도록 CapacityBuffer를 구성합니다. 자세한 내용은 용량 버퍼 구성을 참조하세요.

  1. 다음 매니페스트를 capacitybuffer.yaml로 저장합니다. 이 예시에서는 대기 용량 (일시중지된 VM)을 사용하여 SandboxWarmPool 복제본의 200% 에 해당하는 버퍼를 유지합니다.

    apiVersion: autoscaling.x-k8s.io/v1beta1
    kind: CapacityBuffer
    metadata:
      name: agent-warmpool-buffer
      namespace: NAMESPACE
    spec:
      percentage: 200
      scalableRef:
        apiGroup: extensions.agents.x-k8s.io
        kind: SandboxWarmPool
        name: agent-warmpool
      provisioningStrategy: "buffer.gke.io/standby-capacity"
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f capacitybuffer.yaml
    

수평형 포드 자동 확장 처리 구성

SandboxWarmPool을 HPA에 연결하여 커스텀 측정항목을 기반으로 복제본을 동적으로 확장합니다.

  1. 다음 매니페스트를 hpa.yaml로 저장합니다.

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: agent-warmpool-hpa
      namespace: NAMESPACE
    spec:
      scaleTargetRef:
        apiVersion: extensions.agents.x-k8s.io/v1alpha1
        kind: SandboxWarmPool
        name: agent-warmpool
      minReplicas: 10
      maxReplicas: 100
      metrics:
      - type: External
        external:
          metric:
            name: "prometheus.googleapis.com|agent_sandbox_claim_creation_total|counter"
            selector:
              matchLabels:
                metric.labels.warmpool_name: "agent-warmpool"
          target:
            type: Value
            value: 0.2
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f hpa.yaml
    

확장 이벤트 모니터링

HPA 및 용량 버퍼 이벤트를 모니터링하여 동적 확장을 확인할 수 있습니다.

HPA 이벤트 모니터링

HPA 이벤트를 보려면 다음 명령어를 실행합니다.

kubectl get events -n NAMESPACE --watch \
    --field-selector involvedObject.kind=HorizontalPodAutoscaler

확장이 발생할 때 샘플 출력은 다음과 유사합니다.

SuccessfulRescale New size: 20; reason: external metric prometheus.googleapis.com|agent_sandbox_claim_creation_total|counter above target

CapacityBuffer 이벤트 모니터링

용량 버퍼 이벤트를 보려면 다음 명령어를 실행합니다.

kubectl get events -n NAMESPACE --watch \
    --field-selector involvedObject.kind=CapacityBuffer

일시중지된 VM 재개 또는 스케일 업을 보여주는 샘플 출력은 다음과 유사합니다.

TriggeredScaleUp capacity buffer 20 fake pods triggered scale-up

다음 단계