你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

使用垂直 Pod 自动缩放程序 (VPA),能够在指标服务器遇到一致的 CPU 和内存资源约束时调整资源限制。

先决条件

  • 具有 Kubernetes 1.24 或更高版本的 AKS 群集。
  • 计算机上安装的 Kubernetes 命令行工具 kubectl ,或使用 Azure Cloud Shell 运行 kubectl 命令。

获取凭据

若要运行 kubectl 这些命令,需要将 AKS 凭据合并到配置文件 .kube/config 的文件中。 将<resourceGroupName><clusterName>替换为您群集的值。

az aks get-credentials --resource-group <resourceGroupName> --name <clusterName>

指标服务器限制

如果指标服务器限制速率很高,并且其两个 Pod 的内存使用率不平衡,则表明指标服务器需要比默认值更多的资源。

若要更新系数值,请在覆盖ConfigMap命名空间中创建一个kube-system以替代 Metrics Server 规范中的值。 执行以下步骤来更新指标服务器。

  1. 创建 ConfigMap 名为 metrics-server-config.yaml 的文件,并将清单代码复制到文件中。

    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 示例中,资源限制和请求更改为以下值,其中 n 节点数为:

    • cpu:(100+1n)毫核
    • memory: (100+8n) mebibytes

    如果使用的是 Cloud Shell,请使用 “管理文件 ”并选择“ 上传 ”,以便在 Bash 会话中提供该文件。

  2. 使用 kubectl apply 命令来创建 ConfigMap 并指定您的 YAML 配置文件的名称:

    kubectl apply -f metrics-server-config.yaml
    
  3. 使用 kubectl rollout restart 重启这两个指标服务器 Pod。 以下命令同时删除这两个 Pod,并创建新 Pod。

    kubectl rollout restart -n kube-system deployment metrics-server
    

    新的指标服务器 Pod 是在旧 Pod 终止之前创建的,因此不会停机。

  4. 使用 kubectl get 列出 Pod,以获取在下一个命令中使用的新指标服务器 Pod 名称。

    kubectl get pods --namespace kube-system
    
    NAME                              READY   STATUS   RESTARTS       AGE
    metrics-server-1a2b333c44-wxyz5   2/2     Running  0              15s
    metrics-server-1a2b333c44-abcd6   2/2     Running  0              15s
    

    如果你发现存在时间值更长的第三个指标服务器 Pod,这是因为终止发生在新 Pod 可用之后。

  5. 若要验证更新的资源对每个 Pod 生效,请运行以下命令以查看指标服务器 VPA 日志。 将 <metrics-server-pod-name> 替换为每个指标服务器 Pod 的名称。

    kubectl -n kube-system logs <metrics-server-pod-name> -c metrics-server-vpa
    

    以下示例输出类似于显示已应用更新的限制设置的结果。

    I0811 19:08:34.930865       1 pod_nanny.go:86] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=150m --extra-cpu=0.5m --memory=100Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server]
    I0811 19:08:34.931128       1 pod_nanny.go:87] Version: 1.8.23
    I0811 19:08:34.931200       1 pod_nanny.go:109] Watching namespace: kube-system, pod: <metrics-server-pod-name>, container: metrics-server.
    I0811 19:08:34.931249       1 pod_nanny.go:110] storage: MISSING, extra_storage: 0Gi
    I0811 19:08:34.932085       1 pod_nanny.go:144] cpu: 100m, extra_cpu: 1m, memory: 100Mi, extra_memory: 8Mi
    I0811 19:08:34.932177       1 pod_nanny.go:278] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerResource:{i:{value:1 scale:-3} d:{Dec:<nil>} s:1m Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerResource:{i:{value:8388608 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory}]
    

请谨慎对待 baseCPUcpuPerNodebaseMemorymemoryPerNode,因为 AKS 不会验证 ConfigMap。 建议的做法是逐步增加值以避免不必要的资源消耗。 在更新或创建 ConfigMap资源时主动监视资源使用情况。 大量资源请求可能会对节点产生负面影响。

手动配置指标服务器资源使用情况

指标服务器 VPA 可按节点数调整资源使用情况。 如果群集经常纵向扩展或缩减,则指标服务器可能会频繁重启。 在这种情况下,可以绕过 VPA 并手动控制其资源使用情况。 除了上一部分中所述的步骤外,不会执行用于配置 VPA 的此方法。

如果要绕过指标服务器的 VPA 并手动控制其资源使用情况,请执行以下步骤。

  1. 创建 ConfigMap 名为 metrics-server-config.yaml 的文件 ,并在以下清单中复制。

    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兆字节

    如果使用的是 Cloud Shell,请使用 “管理文件 ”并选择“ 上传 ”,以便在 Bash 会话中提供该文件。

  2. 使用kubectl apply命令创建ConfigMap,并指定您的YAML清单名称。

    kubectl apply -f metrics-server-config.yaml
    
  3. 使用 kubectl rollout restart 重启这两个指标服务器 Pod。 以下命令将删除这些 Pod,并创建新的 Pod。

    kubectl rollout restart -n kube-system deployment metrics-server
    

    新的指标服务器 Pod 是在旧 Pod 终止之前创建的,因此不会停机。

  4. 使用 kubectl get 列出 Pod,以获取在下一个命令中使用的新指标服务器 Pod 名称。

    kubectl get pods --namespace kube-system
    
    NAME                              READY   STATUS   RESTARTS       AGE
    metrics-server-1a2b333c44-wxyz5   2/2     Running  0              15s
    metrics-server-1a2b333c44-abcd6   2/2     Running  0              15s
    

    如果你发现存在时间值更长的第三个指标服务器 Pod,这是因为终止发生在新 Pod 可用之后。

  5. 若要验证更新的资源对每个 Pod 生效,请运行以下命令以查看指标服务器 VPA 日志。 将 <metrics-server-pod-name> 替换为每个度量服务器 Pod 的名称。

    kubectl -n kube-system logs <metrics-server-pod-name> -c metrics-server-vpa
    

    以下示例输出类似于显示已应用更新的限制设置的结果。

    I0811 19:19:06.235018       1 pod_nanny.go:86] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=150m --extra-cpu=0.5m --memory=100Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server]
    I0811 19:19:06.235105       1 pod_nanny.go:87] Version: 1.8.23
    I0811 19:19:06.235136       1 pod_nanny.go:109] Watching namespace: kube-system, pod: <metrics-server-pod-name>, container: metrics-server.
    I0811 19:19:06.235171       1 pod_nanny.go:110] storage: MISSING, extra_storage: 0Gi
    I0811 19:19:06.235899       1 pod_nanny.go:144] cpu: 100m, extra_cpu: 0m, memory: 100Mi, extra_memory: 0Mi
    I0811 19:19:06.235917       1 pod_nanny.go:278] Resources: [{Base:{i:{value:100 scale:-3} d:{Dec:<nil>} s:100m Format:DecimalSI} ExtraPerResource:{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} ExtraPerResource:{i:{value:0 scale:0} d:{Dec:<nil>} s: Format:BinarySI} Name:memory}]
    

疑难解答

ConfigMap 错误

如果应用以下内容 ConfigMap,指标服务器 VPA 的自定义设置将不会生效。 需要为 baseCPU 添加一个单元,类似于 baseCPU: 100m,它包括 m 单元。

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

以下示例输出类似于显示未应用更新的限制设置的结果。

I0811 19:25:33.992691       1 pod_nanny.go:86] Invoked by [/pod_nanny --config-dir=/etc/config --cpu=150m --extra-cpu=0.5m --memory=100Mi --extra-memory=4Mi --poll-period=180000 --threshold=5 --deployment=metrics-server --container=metrics-server]
I0811 19:25:33.992890       1 pod_nanny.go:87] Version: 1.8.23
I0811 19:25:33.992918       1 pod_nanny.go:109] Watching namespace: kube-system, pod: <metrics-server-pod-name>, container: metrics-server.
I0811 19:25:33.992937       1 pod_nanny.go:110] storage: MISSING, extra_storage: 0Gi
I0811 19:25:33.993586       1 pod_nanny.go:217] Unable to decode Nanny Configuration from config map, using default parameters
I0811 19:25:33.993602       1 pod_nanny.go:144] cpu: 150m, extra_cpu: 0.5m, memory: 100Mi, extra_memory: 4Mi
I0811 19:25:33.993610       1 pod_nanny.go:278] Resources: [{Base:{i:{value:150 scale:-3} d:{Dec:<nil>} s:150m Format:DecimalSI} ExtraPerResource:{i:{value:5 scale:-4} d:{Dec:<nil>} s: Format:DecimalSI} Name:cpu} {Base:{i:{value:104857600 scale:0} d:{Dec:<nil>} s:100Mi Format:BinarySI} ExtraPerResource:{i:{value:4194304 scale:0} d:{Dec:<nil>} s:4Mi Format:BinarySI} Name:memory}]

PodDisruptionBudget

对于 Kubernetes 版本 1.23 及更高版本的群集,指标服务器有一个 PodDisruptionBudget。 它确保可用指标服务器 Pod 的数目至少为一个。 如果在运行 kubectl get pods --namespace kube-system 后收到类似于此项的内容,则可能是自定义资源使用量较小。 可增加系数值以解决该问题。

metrics-server-1a2b333c44-wxyz5       1/2     CrashLoopBackOff   6 (36s ago)   6m33s
metrics-server-1a2b333c44-abcd6       1/2     CrashLoopBackOff   6 (54s ago)   6m33s
metrics-server-5d69966543-hcrff       2/2     Running            0             37m

Next steps

指标服务器是核心指标管道中的组件。 有关详细信息,请参阅 指标服务器 API 设计