你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
指标服务器是面向 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 规范中的值。 执行以下步骤来更新指标服务器。
创建
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 会话中提供该文件。
使用 kubectl apply 命令来创建
ConfigMap并指定您的 YAML 配置文件的名称:kubectl apply -f metrics-server-config.yaml使用 kubectl rollout restart 重启这两个指标服务器 Pod。 以下命令同时删除这两个 Pod,并创建新 Pod。
kubectl rollout restart -n kube-system deployment metrics-server新的指标服务器 Pod 是在旧 Pod 终止之前创建的,因此不会停机。
使用 kubectl get 列出 Pod,以获取在下一个命令中使用的新指标服务器 Pod 名称。
kubectl get pods --namespace kube-systemNAME READY STATUS RESTARTS AGE metrics-server-1a2b333c44-wxyz5 2/2 Running 0 15s metrics-server-1a2b333c44-abcd6 2/2 Running 0 15s如果你发现存在时间值更长的第三个指标服务器 Pod,这是因为终止发生在新 Pod 可用之后。
若要验证更新的资源对每个 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}]
请谨慎对待 baseCPU、cpuPerNode、baseMemory 和 memoryPerNode,因为 AKS 不会验证 ConfigMap。 建议的做法是逐步增加值以避免不必要的资源消耗。 在更新或创建 ConfigMap资源时主动监视资源使用情况。 大量资源请求可能会对节点产生负面影响。
手动配置指标服务器资源使用情况
指标服务器 VPA 可按节点数调整资源使用情况。 如果群集经常纵向扩展或缩减,则指标服务器可能会频繁重启。 在这种情况下,可以绕过 VPA 并手动控制其资源使用情况。 除了上一部分中所述的步骤外,不会执行用于配置 VPA 的此方法。
如果要绕过指标服务器的 VPA 并手动控制其资源使用情况,请执行以下步骤。
创建
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 会话中提供该文件。
使用kubectl apply命令创建
ConfigMap,并指定您的YAML清单名称。kubectl apply -f metrics-server-config.yaml使用 kubectl rollout restart 重启这两个指标服务器 Pod。 以下命令将删除这些 Pod,并创建新的 Pod。
kubectl rollout restart -n kube-system deployment metrics-server新的指标服务器 Pod 是在旧 Pod 终止之前创建的,因此不会停机。
使用 kubectl get 列出 Pod,以获取在下一个命令中使用的新指标服务器 Pod 名称。
kubectl get pods --namespace kube-systemNAME READY STATUS RESTARTS AGE metrics-server-1a2b333c44-wxyz5 2/2 Running 0 15s metrics-server-1a2b333c44-abcd6 2/2 Running 0 15s如果你发现存在时间值更长的第三个指标服务器 Pod,这是因为终止发生在新 Pod 可用之后。
若要验证更新的资源对每个 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 设计。