在 Azure Kubernetes 服务 (AKS) 中配置指标服务器 VPA

指标服务器是面向 Kubernetes 内置自动缩放管道的容器资源指标的高效可缩放源。 使用 Azure Kubernetes 服务 (AKS),将为指标服务器启用垂直 Pod 自动缩放。 指标服务器通常由其他 Kubernetes 加载项使用,例如水平 Pod 自动缩放程序

使用垂直 Pod 自动缩放程序 (VPA),能够在指标服务器遇到一致的 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,并指定 YAML 清单的名称:

    kubectl apply -f metrics-server-config.yaml
    
  3. 重启指标服务器 Pod。 存在两个指标服务器 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
    

请注意 baseCPUcpuPerNodebaseMemorymemoryPerNode,因为 AKS 不会验证 ConfigMap。 建议的做法是逐步增加值以避免不必要的资源消耗。 在更新或创建 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,并指定 YAML 清单的名称:

    kubectl apply -f metrics-server-config.yaml
    
  3. 重启指标服务器 Pod。 存在两个指标服务器 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 设计