메트릭 서버는 Kubernetes의 기본 제공 자동 크기 조정 파이프라인을 위한 확장 가능하고 효율적인 컨테이너 리소스 메트릭 원본입니다. AKS(Azure Kubernetes Service)를 사용하면 메트릭 서버에서 수직 Pod 자동 크기 조정이 사용됩니다. 메트릭 서버는 일반적으로 Horizontal Pod Autoscaler와 같은 다른 Kubernetes 추가 기능에서 사용됩니다.
VPA(Vertical Pod Autoscaler)를 사용하면 메트릭 서버에서 CPU 및 메모리 리소스 제약이 지속적으로 발생할 때 리소스 제한을 조정할 수 있습니다.
시작하기 전에
AKS 클러스터가 Kubernetes 버전 1.24 이상을 실행해야 함
메트릭 서버 제한
메트릭 서버 제한 속도가 높고 두 Pod의 메모리 사용량이 불균형한 경우 메트릭 서버에 지정된 기본값보다 더 많은 리소스가 필요하다는 의미입니다.
계수 값을 업데이트하려면 오버레이 kube-system 네임스페이스에 ConfigMap을 만들어 메트릭 서버 사양의 값을 재정의합니다. 메트릭 서버를 업데이트하려면 다음 단계를 수행합니다.
metrics-server-config.yaml이라는 ConfigMap 파일을 만들고 다음 매니페스트에 복사합니다.
apiVersion: v1 kind: ConfigMap metadata: name: metrics-server-config namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration baseCPU: 100m cpuPerNode: 1m baseMemory: 100Mi memoryPerNode: 8Mi
ConfigMap 예제에서, 리소스 제한 및 요청은 다음과 같이 변경됩니다.
- cpu: (100+1n)밀리코어
- 메모리: (100+8n)메비바이트
여기서 n은 노드 수입니다.
kubectl apply configmap 명령을 사용하여 ConfigMap을 만들고 YAML 매니페스트의 이름을 지정합니다.
kubectl apply -f metrics-server-config.yaml
메트릭 서버 Pod를 다시 시작합니다. 두 개의 메트릭 서버 Pod가 있는데 다음 명령은 이 두 서버를 모두 삭제합니다.
kubectl -n kube-system delete po -l k8s-app=metrics-server
업데이트된 리소스가 적용되었는지 확인하려면 다음 명령을 실행하여 메트릭 서버 VPA 로그를 검토합니다.
kubectl -n kube-system logs metrics-server-pod-name -c metrics-server-vpa
다음 예제 출력은 업데이트된 제한 설정이 적용되었음을 보여 주는 결과와 유사합니다.
ERROR: logging before flag.Parse: I0315 23:12:33.956112 1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server] ERROR: logging before flag.Parse: I0315 23:12:33.956159 1 pod_nanny.go:69] Version: 1.8.14 ERROR: logging before flag.Parse: I0315 23:12:33.956171 1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-545d8b77b7-5nqq9, container: metrics-server. ERROR: logging before flag.Parse: I0315 23:12:33.956175 1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi ERROR: logging before flag.Parse: I0315 23:12:33.957441 1 pod_nanny.go:116] cpu: 100m, extra_cpu: 1m, memory: 100Mi, extra_memory: 8Mi ERROR: logging before flag.Parse: I0315 23:12:33.957456 1 pod_nanny.go:145] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:0 scale:-3} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory
AKS에서 CONfigMap의 유효성을 검사하지 않으므로 baseCPU, cpuPerNode, baseMemory 및 memoryPerNode에 주의하세요. 불필요한 리소스를 사용하지 않도록 점차 이 값을 늘리는 것이 좋습니다. ConfigMap을 업데이트하거나 만들 때 사전에 리소스 사용량을 모니터링합니다. 많은 수의 리소스 요청은 노드에 부정적인 영향을 줄 수 있습니다.
수동으로 메트릭 서버의 자원 배정 현황 구성
메트릭 서버 VPA는 노드 수에 따라 리소스 사용량을 조정합니다. 클러스터가 자주 스케일 업 또는 다운되는 경우 메트릭 서버가 자주 다시 시작될 수 있습니다. 이 경우 VPA를 바이패스하고 리소스 사용량을 수동으로 제어할 수 있습니다. VPA를 구성하는 이 방법은 이전 섹션에서 설명한 단계 외에는 수행되지 않습니다.
메트릭 서버용 VPA를 바이패스하고 리소스 사용량을 수동으로 제어하려면 다음 단계를 수행합니다.
metrics-server-config.yaml이라는 ConfigMap 파일을 만들고 다음 매니페스트에 복사합니다.
apiVersion: v1 kind: ConfigMap metadata: name: metrics-server-config namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration baseCPU: 100m cpuPerNode: 0m baseMemory: 100Mi memoryPerNode: 0Mi
이 ConfigMap 예제에서는 리소스 제한 및 요청을 다음과 같이 변경합니다.
- cpu: 100밀리코어
- 메모리: 100메비바이트
노드 수를 변경해도 자동 크기 조정이 트리거되지 않습니다.
kubectl apply configmap 명령을 사용하여 ConfigMap을 만들고 YAML 매니페스트의 이름을 지정합니다.
kubectl apply -f metrics-server-config.yaml
메트릭 서버 Pod를 다시 시작합니다. 두 개의 메트릭 서버 Pod가 있는데 다음 명령은 이 두 서버를 모두 삭제합니다.
kubectl -n kube-system delete po -l k8s-app=metrics-server
업데이트된 리소스가 적용되었는지 확인하려면 다음 명령을 실행하여 메트릭 서버 VPA 로그를 검토합니다.
kubectl -n kube-system logs metrics-server-pod-name -c metrics-server-vpa
다음 예제 출력은 업데이트된 제한 설정이 적용되었음을 보여 주는 결과와 유사합니다.
ERROR: logging before flag.Parse: I0315 23:12:33.956112 1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server] ERROR: logging before flag.Parse: I0315 23:12:33.956159 1 pod_nanny.go:69] Version: 1.8.14 ERROR: logging before flag.Parse: I0315 23:12:33.956171 1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-545d8b77b7-5nqq9, container: metrics-server. ERROR: logging before flag.Parse: I0315 23:12:33.956175 1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi ERROR: logging before flag.Parse: I0315 23:12:33.957441 1 pod_nanny.go:116] cpu: 100m, extra_cpu: 0m, memory: 100Mi, extra_memory: 0Mi ERROR: logging before flag.Parse: I0315 23:12:33.957456 1 pod_nanny.go:145] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerNode:{i:{value:0 scale:-3} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerNode:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory}]
문제 해결
다음 configmap을 사용하는 경우에는 메트릭 서버 VPA 사용자 지정이 적용되지 않습니다.
baseCPU
에 대한 단위를 추가해야 합니다.apiVersion: v1 kind: ConfigMap metadata: name: metrics-server-config namespace: kube-system labels: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: EnsureExists data: NannyConfiguration: |- apiVersion: nannyconfig/v1alpha1 kind: NannyConfiguration baseCPU: 100 cpuPerNode: 1m baseMemory: 100Mi memoryPerNode: 8Mi
다음 예제 출력은 업데이트된 제한 설정이 적용되지 않았음을 보여 주는 결과와 유사합니다.
ERROR: logging before flag.Parse: I0316 23:32:08.383389 1 pod_nanny.go:68] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=44m --extra-cpu=0.5m --memory=51Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server] ERROR: logging before flag.Parse: I0316 23:32:08.383430 1 pod_nanny.go:69] Version: 1.8.14 ERROR: logging before flag.Parse: I0316 23:32:08.383441 1 pod_nanny.go:85] Watching namespace: kube-system, pod: metrics-server-7d78876589-hcrff, container: metrics-server. ERROR: logging before flag.Parse: I0316 23:32:08.383446 1 pod_nanny.go:86] storage: MISSING, extra_storage: 0Gi ERROR: logging before flag.Parse: I0316 23:32:08.384554 1 pod_nanny.go:192] Unable to decode Nanny Configuration from config map, using default parameters ERROR: logging before flag.Parse: I0316 23:32:08.384565 1 pod_nanny.go:116] cpu: 44m, extra_cpu: 0.5m, memory: 51Mi, extra_memory: 4Mi ERROR: logging before flag.Parse: I0316 23:32:08.384589 1 pod_nanny.go:145] Resources: [{Base:{i:{value:44 scale:-3} d:{Dec:<nil>} s:44m Format:DecimalSI} ExtraPerNode:{i:{value:5 scale:-4} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:53477376 scale:0} d:{Dec:<nil>} s:51Mi Format:BinarySI} ExtraPerNode:{i:{value:4194304 scale:0} d:{Dec:<nil>} s:4Mi Format:BinarySI} Name:memory}]
Kubernetes 버전 1.23 이상 클러스터의 경우 메트릭 서버에 PodDisruptionBudget이 있습니다. 사용 가능한 메트릭 서버 Pod 수가 하나 이상인지 확인합니다.
kubectl -n kube-system get po
를 실행한 후에 이와 비슷한 내용이 표시되는 경우 사용자 지정된 리소스 사용량이 적을 수 있습니다. 이를 해결하려면 계수 값을 늘립니다.metrics-server-679b886d4-pxwdf 1/2 CrashLoopBackOff 6 (36s ago) 6m33s metrics-server-679b886d4-svxxx 1/2 CrashLoopBackOff 6 (54s ago) 6m33s metrics-server-7d78876589-hcrff 2/2 Running 0 37m
다음 단계
메트릭 서버는 핵심 메트릭 파이프라인의 구성 요소입니다. 자세한 내용은 메트릭 서버 API 디자인을 참조하세요.
Azure Kubernetes Service