다음을 통해 공유


AKS(Azure Kubernetes Service)에서 메트릭 서버 VPA 구성

메트릭 서버는 Kubernetes의 기본 제공 자동 크기 조정 파이프라인을 위한 확장 가능하고 효율적인 컨테이너 리소스 메트릭 원본입니다. AKS(Azure Kubernetes Service)를 사용하면 메트릭 서버에서 수직 Pod 자동 크기 조정이 사용됩니다. 메트릭 서버는 일반적으로 Horizontal Pod Autoscaler와 같은 다른 Kubernetes 추가 기능에서 사용됩니다.

VPA(Vertical Pod Autoscaler)를 사용하면 메트릭 서버에서 CPU 및 메모리 리소스 제약이 지속적으로 발생할 때 리소스 제한을 조정할 수 있습니다.

시작하기 전에

AKS 클러스터가 Kubernetes 버전 1.24 이상을 실행해야 함

메트릭 서버 제한

메트릭 서버 제한 속도가 높고 두 Pod의 메모리 사용량이 불균형한 경우 메트릭 서버에 지정된 기본값보다 더 많은 리소스가 필요하다는 의미입니다.

계수 값을 업데이트하려면 오버레이 kube-system 네임스페이스에 ConfigMap을 만들어 메트릭 서버 사양의 값을 재정의합니다. 메트릭 서버를 업데이트하려면 다음 단계를 수행합니다.

  1. 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은 노드 수입니다.

  2. kubectl apply configmap 명령을 사용하여 ConfigMap을 만들고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f metrics-server-config.yaml
    
  3. 메트릭 서버 Pod를 다시 시작합니다. 두 개의 메트릭 서버 Pod가 있는데 다음 명령은 이 두 서버를 모두 삭제합니다.

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. 업데이트된 리소스가 적용되었는지 확인하려면 다음 명령을 실행하여 메트릭 서버 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, baseMemorymemoryPerNode에 주의하세요. 불필요한 리소스를 사용하지 않도록 점차 이 값을 늘리는 것이 좋습니다. ConfigMap을 업데이트하거나 만들 때 사전에 리소스 사용량을 모니터링합니다. 많은 수의 리소스 요청은 노드에 부정적인 영향을 줄 수 있습니다.

수동으로 메트릭 서버의 자원 배정 현황 구성

메트릭 서버 VPA는 노드 수에 따라 리소스 사용량을 조정합니다. 클러스터가 자주 스케일 업 또는 다운되는 경우 메트릭 서버가 자주 다시 시작될 수 있습니다. 이 경우 VPA를 바이패스하고 리소스 사용량을 수동으로 제어할 수 있습니다. VPA를 구성하는 이 방법은 이전 섹션에서 설명한 단계 외에는 수행되지 않습니다.

메트릭 서버용 VPA를 바이패스하고 리소스 사용량을 수동으로 제어하려면 다음 단계를 수행합니다.

  1. 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메비바이트

    노드 수를 변경해도 자동 크기 조정이 트리거되지 않습니다.

  2. kubectl apply configmap 명령을 사용하여 ConfigMap을 만들고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f metrics-server-config.yaml
    
  3. 메트릭 서버 Pod를 다시 시작합니다. 두 개의 메트릭 서버 Pod가 있는데 다음 명령은 이 두 서버를 모두 삭제합니다.

    kubectl -n kube-system delete po -l k8s-app=metrics-server
    
  4. 업데이트된 리소스가 적용되었는지 확인하려면 다음 명령을 실행하여 메트릭 서버 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}]
    

문제 해결

  1. 다음 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}]
    
  2. 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 디자인을 참조하세요.