4. Metrics Server 部署:安装方式、配置参数、故障排查与资源占用评估
Metrics Server 是 Kubernetes 集群中实现 Resource Metrics API 的核心组件,它为 HPA、VPA 以及 kubectl top 命令提供实时的 CPU 和内存指标数据。本章将系统讲解 Metrics Server 的部署方法、关键配置、常见故障处理以及资源占用评估,确保你能够在生产环境中稳定、高效地运行该组件。
前置条件:确保集群已安装 CoreDNS,且 kubelet 已启用
--authentication--webhook 和 --authorization-mode=Webhook 参数(Kubernetes v1.7+ 默认开启)。
4.1 安装方式对比
Metrics Server 支持多种安装方式,不同方式适用于不同的集群环境和运维习惯。下表对比了三种主流安装路径:
| 安装方式 | 适用场景 | 复杂度 | 版本管理 | 推荐度 |
|---|---|---|---|---|
| YAML 直接部署 | 测试环境、快速验证 | 低 | 手动管理 | ⭐⭐⭐ |
| Helm Chart | 生产环境、参数化部署 | 中 | Chart 版本控制 | ⭐⭐⭐⭐⭐ |
| Addon Manager | kubeadm 集群、自建集群 | 低 | 集群版本绑定 | ⭐⭐⭐ |
4.1.1 YAML 直接部署(快速入门)
使用官方提供的 components.yaml 一键部署,适合快速验证:
# 下载并应用最新稳定版
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 验证 Pod 状态
kubectl get pods -n kube-system -l k8s-app=metrics-server
4.1.2 Helm Chart 部署(生产推荐)
Helm 部署支持细粒度参数配置,便于版本回滚和自动化管理:
# 添加官方 Helm 仓库
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update
# 安装并自定义参数
helm upgrade --install metrics-server metrics-server/metrics-server \
--namespace kube-system \
--set args={"--kubelet-insecure-tls=false","--kubelet-preferred-address-types=InternalIP"} \
--set resources.requests.cpu=50m \
--set resources.requests.memory=100Mi
4.2 核心配置参数详解
Metrics Server 通过启动参数控制行为,以下为生产环境最常用的参数及其说明:
| 参数名 | 默认值 | 说明 | 生产建议 |
|---|---|---|---|
--kubelet-insecure-tls |
false | 是否跳过 kubelet TLS 证书验证 | 测试环境可设为 true;生产必须配置证书或设为 false |
--kubelet-preferred-address-types |
Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP | 连接 kubelet 时优先使用的地址类型 | 建议设为 InternalIP 避免 DNS 解析问题 |
--metric-resolution |
60s | 指标采集周期 | 默认 60s 已满足 HPA 需求;调低会增加 kubelet 负载 |
--kubelet-port |
10250 | kubelet 监听端口 | 保持默认,除非自定义 kubelet 端口 |
--log-level |
0 | 日志级别(0=Info, 4=Debug) | 排查问题时临时设为 4,平时保持 0 |
安全警告:生产环境禁止使用
--kubelet-insecure-tls。请确保 kubelet 证书被集群 CA 信任,或通过 --tls-cert-file 和 --tls-private-key-file 为 Metrics Server 配置独立证书。
4.3 常见故障排查
Metrics Server 部署后最常见的故障集中在网络连通性、证书验证和资源限制三个方面。以下为典型问题及解决方案:
4.3.1 故障现象与根因对照表
| 现象 | 可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
kubectl top node 返回 error: metrics not available yet |
Metrics Server 尚未完成首次采集 | kubectl logs -n kube-system -l k8s-app=metrics-server --tail=50 |
等待 60-120 秒;检查 Pod 是否 CrashLoopBackOff |
日志报错 failed to get node info: x509: certificate signed by unknown authority |
kubelet 证书未被信任 | kubectl describe pod -n kube-system metrics-server-xxx |
添加 --kubelet-insecure-tls(测试)或配置正确证书 |
日志报错 no such host 或 connection refused |
Metrics Server 无法通过主机名解析 kubelet | kubectl exec -n kube-system metrics-server-xxx -- nslookup <node-name> |
设置 --kubelet-preferred-address-types=InternalIP |
Pod 处于 CrashLoopBackOff 状态 |
资源限制过小或启动参数错误 | kubectl logs -n kube-system metrics-server-xxx --previous |
检查资源 requests/limits;验证启动参数拼写 |
4.3.2 核心排查流程
当 Metrics Server 无法正常提供指标时,按以下步骤定位问题:
- 检查 Pod 状态:
kubectl get pods -n kube-system | grep metrics-server - 查看实时日志:
kubectl logs -n kube-system -l k8s-app=metrics-server -f - 验证 API 可用性:
kubectl get --raw /apis/metrics.k8s.io/v1beta1,应返回资源列表 - 测试节点连通性:进入 Pod 内部执行
wget -qO- https://<node-ip>:10250/metrics/cadvisor --no-check-certificate 2>&1 | head -20 - 检查 RBAC 权限:
kubectl describe clusterrole system:metrics-server确认包含nodes/metrics和nodes/stats的 get 权限
经验提示:超过 80% 的 Metrics Server 故障源于 kubelet 地址解析失败。在云环境(AWS、GCP、Azure)中,节点主机名可能无法被 Pod DNS 解析,务必设置
--kubelet-preferred-address-types=InternalIP。
4.4 资源占用评估
Metrics Server 设计为轻量级组件,但实际资源消耗受集群规模、指标采集频率和节点数量影响。以下为基于社区基准测试的推荐配置:
4.4.1 资源推荐表
| 集群节点数 | CPU 请求/限制 | 内存请求/限制 | 典型 Pod 数量 |
|---|---|---|---|
| ≤ 50 | 50m / 100m | 100Mi / 200Mi | ≤ 500 |
| 50 - 200 | 100m / 200m | 200Mi / 400Mi | 500 - 2000 |
| 200 - 1000 | 200m / 500m | 500Mi / 1Gi | 2000 - 10000 |
| > 1000 | 500m / 1 | 1Gi / 2Gi | > 10000 |
4.4.2 资源占用实测数据
以下数据来自 100 节点、1500 Pod 的生产集群(采集周期 60s):
- CPU 平均使用率:35m - 80m(峰值 120m)
- 内存常驻集(RSS):45Mi - 90Mi
- 网络带宽:每个采集周期约 2-5 KB/节点(出站)
- API 请求延迟:P99 < 200ms(从 HPA 发起查询到返回)
优化建议:如果集群规模超过 500 节点,建议将
--metric-resolution 调整为 90s 或 120s,可降低约 30% 的 CPU 和内存消耗,同时仍满足 HPA 的默认伸缩周期(15s 评估间隔)。
4.5 Metrics Server 架构与数据流
下图展示了 Metrics Server 从 kubelet 采集指标到暴露给 HPA 的完整数据流:
4.6 生产部署检查清单
在将 Metrics Server 部署到生产环境前,请逐项确认以下要点:
- 证书配置:kubelet 证书被集群 CA 信任,或使用
--kubelet-certificate-authority指定 CA 文件 - 地址类型:已设置
--kubelet-preferred-address-types=InternalIP - 资源限制:根据集群规模设置合理的 requests/limits(参考 4.4.1 节)
- 高可用:至少运行 2 个副本,配置 PodAntiAffinity 分散到不同节点
- 监控告警:对 Metrics Server 的 Pod 状态、API 响应延迟、采集失败率设置告警
- 网络策略:确保 Metrics Server 可以访问所有节点的 10250 端口(kubelet)
- 版本兼容:Metrics Server 版本与 Kubernetes 集群版本的对应关系(见下表)
4.6.1 版本兼容性矩阵
| Metrics Server 版本 | 兼容的 Kubernetes 版本 | 备注 |
|---|---|---|
| v0.6.x | 1.21+ | 推荐最新稳定版 |
| v0.5.x | 1.19 - 1.24 | 已停止维护 |
| v0.4.x | 1.16 - 1.21 | 仅用于旧集群 |
最佳实践:始终使用 Metrics Server 的最新稳定版,并确保集群版本在其兼容范围内。升级 Metrics Server 前,先在测试环境验证 HPA 行为不受影响。