在 Azure Kubernetes 服务 (AKS) 中配置指标服务器 VPA
指标服务器是面向 Kubernetes 内置自动缩放管道的容器资源指标的高效可缩放源。 使用 Azure Kubernetes 服务 (AKS),将为指标服务器启用垂直 Pod 自动缩放。 指标服务器通常由其他 Kubernetes 加载项使用,例如水平 Pod 自动缩放程序。
使用垂直 Pod 自动缩放程序 (VPA),能够在指标服务器遇到一致的 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,并指定 YAML 清单的名称:
kubectl apply -f metrics-server-config.yaml
重启指标服务器 Pod。 存在两个指标服务器 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
请注意 baseCPU、cpuPerNode、baseMemory 和 memoryPerNode,因为 AKS 不会验证 ConfigMap。 建议的做法是逐步增加值以避免不必要的资源消耗。 在更新或创建 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,并指定 YAML 清单的名称:
kubectl apply -f metrics-server-config.yaml
重启指标服务器 Pod。 存在两个指标服务器 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 设计。