이 페이지에서는 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 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.
버전 1.36.0-gke.2208000 이상을 실행하는 GKE Standard 클러스터
클러스터 만들기
대기 용량 버퍼 및 에이전트 샌드박스에 필요한 구성으로 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
에이전트 샌드박스 구성요소 구성
샌드박스 처리된 워크로드를 관리하려면 SandboxTemplate 및 SandboxWarmPool을 정의해야 합니다.
다음 매니페스트를
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)로 바꿉니다.매니페스트를 적용합니다.
kubectl apply -f sandboxtemplate.yaml다음 매니페스트를
sandboxwarmpool.yaml로 저장합니다. 이렇게 하면 복제본의 초기 정적 풀이 설정됩니다.apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxWarmPool metadata: name: agent-warmpool namespace: NAMESPACE spec: replicas: 10 sandboxTemplateRef: name: agent-template매니페스트를 적용합니다.
kubectl apply -f sandboxwarmpool.yaml
측정항목 수집 구성
에이전트 샌드박스 컨트롤러는 클레임된 샌드박스 수에 대한 카운터 측정항목(agent_sandbox_claim_creation_total)을 노출합니다. PodMonitoring 리소스를 구성하여 이 측정항목을 수집하고 Google Cloud Managed Service for Prometheus로 보낼 수 있습니다.
다음 매니페스트를
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매니페스트를 적용합니다.
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 커스텀 리소스의 확장 하위 리소스를 읽을 수 있는 권한이 필요합니다.
다음 매니페스트를
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매니페스트를 적용합니다.
kubectl apply -f capacity-buffer-rbac.yaml
용량 버퍼 구성
SandboxWarmPool의 크기에 비례하는 인프라 버퍼를 유지하도록 CapacityBuffer를 구성합니다. 자세한 내용은 용량 버퍼 구성을 참조하세요.
다음 매니페스트를
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"매니페스트를 적용합니다.
kubectl apply -f capacitybuffer.yaml
수평형 포드 자동 확장 처리 구성
SandboxWarmPool을 HPA에 연결하여 커스텀 측정항목을 기반으로 복제본을 동적으로 확장합니다.
다음 매니페스트를
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매니페스트를 적용합니다.
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