시작하기 전에
수직형 포드 자동 확장을 구성하기 전에 다음 필수사항을 충족하는지 확인하세요.
- 베어메탈 클러스터가 실행 중입니다.
- 클러스터에 대한
kubectl액세스 권한이 있습니다. - 클러스터에서 측정항목 서버를 사용할 수 있습니다. 베어메탈 클러스터에는 기본적으로 측정항목 서버가 포함되어 있습니다.
수직형 포드 자동 확장 사용 설정
미리보기 주석을 설정하고 클러스터 사양을 구성하여 베어메탈 클러스터에서 수직형 포드 자동 확장을 사용 설정합니다.
클러스터 커스텀 리소스에서 미리보기 주석을 추가하거나 업데이트합니다.
클러스터 커스텀 리소스를 직접 수정하거나 클러스터 구성 파일을 수정하고
bmctl update를 사용합니다.metadata: annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enableverticalPodAutoscaling필드를 포함하고enableUpdater및enableMemorySaver모드를 지정하도록 클러스터 커스텀 리소스의spec을 수정합니다.apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: cluster1 namespace: cluster-cluster1 annotations: preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable spec: # ... other cluster spec fields verticalPodAutoscaling: enableUpdater: true # Set to true for automated updates enableMemorySaver: true # Set to true to reduce recommender memory usage클러스터 구성 파일을 수정한 경우 다음 명령어를 사용하여 변경사항을 적용합니다.
bmctl update cluster -c CLUSTER_NAME --kubeconfig KUBECONFIG다음을 바꿉니다.
CLUSTER_NAME: 클러스터 이름입니다.KUBECONFIG: 클러스터 kubeconfig 파일 경로입니다.
VerticalPodAutoscaler 커스텀 리소스 만들기
클러스터에서 수직형 포드 자동 확장을 사용 설정한 후 특정 워크로드를 타겟팅하도록 VerticalPodAutoscaler 커스텀 리소스를 정의합니다.
타겟 워크로드와 동일한 네임스페이스에서
VerticalPodAutoscaler리소스를 정의합니다.이 커스텀 리소스는
targetRef및 리소스 정책을 사용하여 타겟팅하는 포드를 지정합니다.apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"]다음 명령어를 사용하여
VerticalPodAutoscaler매니페스트를 적용합니다.kubectl apply -f VPA_MANIFEST \ --kubeconfig KUBECONFIG다음을 바꿉니다.
VPA_MANIFEST:VerticalPodAutoscaler매니페스트 파일의 경로입니다.KUBECONFIG: 클러스터 kubeconfig 파일 경로입니다.
수직형 포드 자동 확장 모드 이해하기
수직형 포드 자동 확장은 리소스 권장사항을 적용하는 방법을 제어하는 여러 모드로 작동합니다.
권장 모드
권장 모드에서 수직형 포드 자동 확장은 추천 도구 구성요소를 설치합니다. 이 구성요소는 리소스 사용량을 분석하고 사용자가 만든 VerticalPodAutoscaler 커스텀 리소스의 상태 섹션에 CPU 및 메모리 요청과 한도의 권장 값을 게시합니다.
리소스 요청 및 한도 권장사항을 보려면 다음 명령어를 사용합니다.
kubectl describe vpa VPA_NAME \
--kubeconfig KUBECONFIG \
-n CLUSTER_NAMESPACE
Replace the following:
* `VPA_NAME`: the name of the `VerticalPodAutoscaler`
that's targeting the workloads for which you are considering resource
adjustments.
* `KUBECONFIG`: the path of the cluster kubeconfig
file.
* `CLUSTER_NAMESPACE`: the name of the cluster that's
running vertical Pod autoscaling.
응답에는 다음 샘플과 유사한 Status 섹션이 포함되어야 합니다.
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
이 모드에서는 포드가 자동으로 업데이트되지 않습니다. 이러한 권장사항을 사용하여 포드 구성을 수동으로 업데이트합니다.
enableUpdater
가 설정되지 않았거나 false인 경우 기본 동작입니다.
자동 업데이트 모드
enableUpdater
enableUpdater
를 true로 설정하면 베어메탈 수명 주기 컨트롤러가 추천 도구 외에도 수직형 포드 자동 확장
업데이트 프로그램 및 승인 컨트롤러 구성요소를 배포합니다. 업데이트 프로그램은 현재 리소스 요청이 권장사항과 크게 다른 포드를 모니터링합니다.
VerticalPodAutoscaler 리소스의 업데이트 정책은 업데이트 프로그램이 권장사항을 적용하는 방법을 지정합니다. 기본적으로 업데이트 모드는 Auto이며, 이는 업데이트 프로그램이 포드 생성 시 업데이트된 리소스 설정을 할당하도록 지시합니다. 다음 VerticalPodAutoscaler 샘플은 업데이트 모드를 Initial로 설정하는 방법을 보여줍니다.
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: hamster
resourcePolicy:
updatePolicy:
updateMode: "Initial"
...
업데이트 프로그램은 다음 5가지 모드를 지원합니다.
Auto: 업데이트 프로그램이 포드를 삭제합니다. 승인 컨트롤러는 새 포드의 생성 요청을 가로채고 추천 도구에서 제공하는 권장 CPU 및 메모리 값을 사용하도록 수정합니다. 리소스를 업데이트하려면 포드를 다시 만들어야 하므로 중단이 발생할 수 있습니다. 업데이트 프로그램이 적용하는 포드 중단 예산, 을 사용하여 삭제 프로세스를 관리합니다. 이 모드는Recreate과 동일합니다.Recreate: 업데이트 프로그램은 포드를 삭제하고 포드가 다시 생성될 때 권장 리소스 요청 및 한도를 할당합니다.InPlaceOrRecreate(알파): 업데이트 프로그램은 최선을 다해 인플레이스 업데이트를 시도하지만 인플레이스 업데이트가 불가능한 경우 포드를 다시 만들 수 있습니다. 자세한 내용은 인플레이스 포드 크기 조정 문서를 참조하세요.Initial: 업데이트 프로그램은 포드 생성 시에만 리소스 요청을 할당하고 이후에 항목을 변경하지 않습니다.Off: 업데이트 프로그램은 포드의 리소스 요구사항을 자동으로 변경하지 않습니다. 권장사항을 계산하고VerticalPodAutoscaler객체에서 검사할 수 있습니다.
VerticalPodAutoscaler 커스텀 리소스에 대한 자세한 내용은 kubectl을 사용하여 버전 1.33.0 이상 클러스터에 설치된 verticalpodautoscalercheckpoints.autoscaling.k8s.io 커스텀 리소스 정의를 가져옵니다.
다음 샘플은 hamster 컨테이너의 Status 섹션에 리소스 권장사항이 표시되는 방법을 보여줍니다. 이 샘플은 업데이트 프로그램이 다시 생성된 포드에 권장 리소스 구성을 자동으로 할당하기 전에 포드를 삭제할 때 발생하는 포드 삭제 이벤트의 예도 보여줍니다.
Spec:
Resource Policy:
Container Policies:
Container Name: *
Controlled Resources:
cpu
memory
Max Allowed:
Cpu: 1
Memory: 500Mi
Min Allowed:
Cpu: 100m
Memory: 50Mi
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: hamster
Update Policy:
Update Mode: Auto
Status:
Conditions:
Last Transition Time: 2025-08-04T23:53:32Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: hamster
Lower Bound:
Cpu: 100m
Memory: 262144k
Target:
Cpu: 587m
Memory: 262144k
Uncapped Target:
Cpu: 587m
Memory: 262144k
Upper Bound:
Cpu: 1
Memory: 500Mi
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal EvictedPod 49s vpa-updater VPA Updater evicted Pod hamster-7cb59fb657-lkrk4 to apply resource recommendation.
메모리 절약 모드
메모리 절약 모드는 수직형 포드 자동 확장 추천 도구 구성요소의 메모리 사용량을 줄입니다.
enableMemorySaver
를 true로 설정하면 추천 도구는 일치하는 VerticalPodAutoscaler 커스텀 리소스가 있는 포드의 집계를 추적하고 계산하기만 합니다.
절충안은 기존 워크로드에 새 VerticalPodAutoscaler 커스텀 리소스를 만들 때 추천 도구가 정확한 권장사항을 제공하기에 충분한 기록을 수집하는 데 시간이 걸린다는 것입니다 (최대 24시간). 이 모드는 대부분의 클러스터 유형에서 기본적으로 false이지만 에지 클러스터에서는 기본적으로 true입니다.
Prometheus를 영구 기록 제공자로 사용
기본적으로 추천 도구 구성요소는 클러스터에서 실행되는 워크로드의 리소스 소비 기록을 메모리에 보관하고, 주기적으로 etcd의 VerticalPodAutoscalerCheckpoint 커스텀 리소스에 상태를 저장하여 다시 시작에 대한 복원력을 제공합니다.
Google Distributed Cloud 버전 1.34부터 Prometheus의 자체 인스턴스를 리소스 소비 데이터(CPU 및 메모리 사용량 측정항목)의 영구 기록 제공자로 사용할 수 있습니다. 이 통합이 사용 설정되면 추천 도구는 시작 또는 다시 시작 시 Prometheus 서버를 쿼리하여 모든 관리형 포드의 장기적인 이전 리소스 사용량 데이터를 가져올 수 있습니다. 이 데이터를 가져오면 추천 도구가 풍부한 데이터 세트로 내부 상태를 즉시 빌드할 수 있으므로 처음부터 더 많은 정보를 바탕으로 정확한 권장사항을 제공할 수 있습니다.
Prometheus를 영구 기록 제공자로 사용하면 다음과 같은 이점이 있습니다.
리소스 사용률 최적화: 시작하자마자 충분한 정보를 바탕으로 정확한 권장사항을 생성하므로 클러스터 리소스 사용률을 최적화할 수 있습니다.
메모리 부족 (OOM) 오류 방지: Prometheus는 추천자의 내부 상태를
VerticalPodAutoscalerCheckpoint커스텀 리소스 (CR)에 저장할 필요가 없으므로 ETCD 메모리 사용률이 더 효율적입니다. 추천 도구 구성요소가 다시 시작되면 메모리 내 이전 데이터가 손실됩니다. Prometheus를 기록 제공자로 사용하면 추천 도구가 다시 시작 시 Prometheus에서 이전 측정항목을 가져오므로VerticalPodAutoscalerCheckpointCR이 필요하지 않고 ETCD 메모리가 절약됩니다.
언제든지 Prometheus를 영구 기록 프로바이더로 사용 설정하거나 사용 중지할 수 있습니다.
수직형 포드 자동 확장과 함께 Prometheus를 사용하기 위한 필수사항
자체 Prometheus 인스턴스를 수직형 포드 자동 확장의 기록 제공자로 사용하려면 필요한 측정항목을 스크래핑하도록 구성해야 합니다. 여기에는 다음 단계가 포함됩니다.
필요한 경우 수직형 포드 자동 확장의 영구 기록 프로바이더로 사용하려는 클러스터에 Prometheus 연산자를 배포합니다. 자세한 내용은 Kubernetes에서 Prometheus 연산자를 배포하고 구성하는 방법을 참조하세요.
측정항목 스크래핑을 위한 권한을 구성합니다.
Prometheus가 구성 파일을 사용하여 cAdvisor에서 측정항목을 스크래핑하도록 허용하려면 Prometheus 서버에서 사용하는 서비스 계정에 추가 권한을 부여해야 합니다. 이러한 규칙이 포함된
ClusterRole을 만들거나 업데이트하고ClusterRoleBinding을 사용하여 올바른 Prometheus 서비스 계정에 바인딩되어 있는지 확인합니다.apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus-role labels: app: prometheus-server rules: - apiGroups: [""] resources: - nodes verbs: - get - list - watch - apiGroups: [""] resources: - nodes/proxy - nodes/metrics verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus-binding labels: app: prometheus-server subjects: - kind: ServiceAccount name: prometheus-server # Service account being used by prometheus namespace: prometheus # Service account's namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus-role # Name of the ClusterRole created abovePrometheus 구성 파일을 업데이트하여 cAdvisor에서 다음 측정항목을 스크래핑합니다.
container_cpu_usage_seconds_totalcontainer_memory_working_set_bytes
다음 줄은 cAdvisor 측정항목의 스크래핑 세부정보를 정의합니다.
- job_name: 'kubernetes-cadvisor' scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor metric_relabel_configs: # Keep only the metrics VPA uses to save disk space - source_labels: [__name__] regex: (container_cpu_usage_seconds_total|container_memory_working_set_bytes) action: keepPrometheus 구성 파일을 업데이트하여
kube-state-metrics서비스에서 다음 측정항목을 스크래핑합니다.kube_pod_labels
클러스터에
kube-state-metrics서비스를 배포합니다.다음 Helm 명령어를 사용하여 새 서비스를 설치할 수 있습니다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update다음 콘텐츠로
ksm-values.yaml파일을 만듭니다.fullnameOverride: vpa-kube-state-metrics metricAllowlist: - kube_pod_labels metricLabelsAllowlist: - "pods=[*]"이전 단계의 값 파일을 기반으로 Helm 차트를 설치합니다.
helm install vpa-ksm prometheus-community/kube-state-metrics \ -f ksm-values.yaml --namespace kube-system설치된
kube-state-metrics서비스에서kube_pod_labels측정항목을 스크래핑하도록 다음 줄을 Prometheus 구성 파일에 추가합니다.- job_name: 'kube-state-metrics' static_configs: - targets: ['vpa-kube-state-metrics.kube-system.svc.cluster.local:8080'] metric_relabel_configs: - source_labels: [ __name__ ] regex: 'kube_pod_labels' action: keep
Prometheus 사용 설정 및 사용
수직형 포드 자동 확장은 Prometheus에 연결하기 위한 기본 인증과 Bearer 토큰 기반 인증을 모두 지원합니다. 인증을 사용하는 경우 클러스터 네임스페이스에 필요한 사용자 인증 정보가 포함된 Secret을 만들어야 합니다. 컨트롤러는 이 보안 비밀을 대상 클러스터로 전달하고 추천자 포드에서 볼륨 또는 환경 변수로 마운트합니다. 인증 없이 Prometheus를 사용할 수도 있습니다.
수직형 포드 자동 확장과 함께 자체 Prometheus 인스턴스를 사용 설정하고 사용하려면 Prometheus 인스턴스에 연결하기 위한 세부정보로 클러스터 사양의 verticalPodAutoscaling 섹션을 구성해야 합니다.
다음은 Bearer 토큰과 함께 사용할 클러스터 사양의 구성 예시입니다.
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
preview.baremetal.cluster.gke.io/vertical-pod-autoscaler: enable
spec:
# ... other existing cluster configurations ...
verticalPodAutoscaling:
# ... other vertical Pod autoscaling configurations ...
# Add this new section to configure the vpa to use prometheus using bearer token authentication as history provider
prometheus:
url: "http://prometheus.prometheus.monitoring.svc.cluster.local:9090"
auth:
bearerTokenAuth:
name: prom-bearer-creds
key: bearertoken
수직형 포드 자동 확장과 함께 사용할 Prometheus를 사용 설정하려면 다음 단계를 따르세요.
수직형 포드 자동 확장과 함께 Prometheus를 사용하기 위한 필수사항에 설명된 대로 Prometheus 인스턴스가 필요한 측정항목을 스크래핑하도록 설정되어 있는지 확인합니다.
클러스터 커스텀 리소스
spec을(를) 업데이트하여verticalPodAutoscaling.prometheus필드가 Prometheus 서버의 연결 설정을 지정하도록 합니다.url을prometheus섹션에 추가하고 클러스터 내에서 Prometheus에 연결하기 위한 정규화된 도메인 이름 (FQDN)으로 설정합니다.spec: # ... other existing cluster configurations ... verticalPodAutoscaling: # ... other vpa configurations ... # Add this new section to configure the vpa to use prometheus as history provider prometheus: # Required: The URL of the Prometheus server url: "http://prometheus.prometheus.svc.cluster.local:9090"연결 세부정보를 지정합니다.
수직형 포드 자동 확장은 다음 세 가지 연결 방법을 지원합니다.
- 인증이 필요하지 않음
- 기본 (사용자 이름, 비밀번호) 인증
Bearer 토큰 인증
인증이 필요하지 않음
Prometheus 인스턴스에 인증이 필요하지 않으면 완료됩니다.
prometheus섹션에는url필드만 포함되어야 합니다.기본 인증
다음 단계를 따라 Prometheus의 기본 인증을 지정합니다.
stringData섹션에 사용자 이름과 비밀번호가 포함된 보안 비밀과baremetal.cluster.gke.io/mark-source: "true"주석을 만듭니다.다음 예는 기본 인증을 지원하는 보안 비밀을 보여줍니다.
apiVersion: v1 kind: Secret metadata: name: prom-basic-creds namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: username: admin password: pwd소스 보안 비밀과 대상 클러스터의 보안 비밀이 항상 동기화되도록 하려면 주석이 필요합니다. 소스 보안 비밀이 업데이트되면 보안 비밀이 업데이트됩니다.
보안 비밀의
data필드에서 사용자 이름과 비밀번호를 참조하도록 클러스터 사양의prometheus.auth.basicAuth섹션을 업데이트합니다.다음 예는 이전 단계의 보안 비밀에서 사용자 이름과 비밀번호를 참조하는
basicAuth섹션을 보여줍니다.# ... other vpa configurations ... prometheus: url: "http://prometheus.prometheus.svc.cluster.local:9090" auth: basicAuth: usernameRef: name: prom-basic-creds key: username passwordRef: name: prom-basic-creds key: password사용자 이름과 비밀번호는 동일한 보안 비밀에 있어야 합니다. 키는 보안 비밀의
data필드에 있는 유효한 키여야 합니다.
클러스터 커스텀 리소스가 업데이트되면 Prometheus 인스턴스가 수직형 포드 자동 확장 처리의 기록 제공자로 작동하기 시작합니다.
Bearer 토큰 인증
다음 단계를 따라 Prometheus의 Bearer 토큰 인증을 지정합니다.
stringData섹션에 Bearer 토큰이 포함된 보안 비밀과baremetal.cluster.gke.io/mark-source: "true"주석을 만듭니다.다음 예는 Bearer 토큰 인증을 지원하는 보안 비밀을 보여줍니다.
apiVersion: v1 kind: Secret metadata: name: prom-bearer-creds namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: bearertoken: "SAMPLE_TOKEN"소스 보안 비밀과 대상 클러스터의 보안 비밀이 항상 동기화되도록 하려면 주석이 필요합니다. 소스 보안 비밀이 업데이트되면 보안 비밀이 업데이트됩니다.
보안 비밀의
data필드에서 Bearer 토큰을 참조하도록 클러스터 사양의prometheus.auth.bearerTokenAuth섹션을 업데이트합니다.다음 예는 이전 단계의 보안 비밀에서 Bearer 토큰을 참조하는
bearerTokenAuth섹션을 보여줍니다.# ... other vertical Pod autoscaling configurations ... prometheus: url: "http://prometheus.prometheus.svc.cluster.local:9090" auth: bearerTokenAuth: name: prom-bearer-creds key: bearertoken키는 보안 비밀의
data필드에 있는 유효한 키여야 합니다.
클러스터 커스텀 리소스가 업데이트되면 Prometheus 인스턴스가 수직형 포드 자동 확장의 기록 제공자로 작동하기 시작합니다.
Prometheus 사용 중지
수직형 포드 자동 확장과 함께 Prometheus를 사용 중지하려면 클러스터 커스텀 리소스의 verticalPodAutoscaling 섹션에서 prometheus 섹션을 삭제합니다.
수직형 포드 자동 확장 사용 중지
클러스터에서 커스텀 리소스와 구성을 삭제하여 수직형 포드 자동 확장을 사용 중지합니다.
만든
VerticalPodAutoscaler커스텀 리소스를 삭제합니다.클러스터 커스텀 리소스를 수정하고
spec에서 전체verticalPodAutoscaling섹션을 삭제합니다.클러스터 커스텀 리소스를 직접 수정하거나 클러스터 구성 파일을 수정하고
bmctl update를 사용합니다.클러스터 커스텀 리소스에서
preview.baremetal.cluster.gke.io/vertical-pod-autoscaler주석을 삭제합니다.
제한사항
수직형 포드 자동 확장을 사용할 때는 다음 제한사항을 고려하세요.
- 워크로드의 실제 메모리 사용량에 대한 제한된 공개 상태로 인해 수직형 포드 자동 확장을 아직 JVM 기반 워크로드에서 사용할 수 없습니다.
- 업데이트 프로그램은 배포가 포드를 수정된 리소스 값으로 대체할 때 최소 2개의 포드 복제본을 생성해야 합니다.
- 업데이트 프로그램은 메모리 부족 (OOM) 오류로 인해 비정상 종료 루프에 있는 포드를 빠르게 업데이트하지 않습니다.
- 포드의
InPlaceOrRecreate업데이트 정책은 수직형 포드 자동 확장 내의 알파 기능입니다. 최선을 다해 인플레이스 업데이트를 시도하지만 인플레이스 업데이트가 불가능한 경우 포드를 다시 만들 수 있습니다.
다음 단계
- 포드 중단 예산을 살펴봅니다.