3. Metrics Server 部署与配置:安装、资源限制与启动参数调优
Metrics Server 是 Kubernetes 集群中实现 Resource Metrics API(metrics.k8s.io/v1beta1)的核心组件。HPA 和 kubectl top 均依赖它获取 Pod 与 Node 的实时 CPU / 内存使用数据。本章将覆盖 Metrics Server 的安装方式、资源限制配置以及关键启动参数调优,确保生产集群中 HPA 的指标采集稳定、低延迟。
3.1 安装方式对比
Metrics Server 支持多种安装途径,生产环境推荐使用 Helm Chart 或 官方 YAML 清单。下表列出三种主流方式的适用场景与注意事项:
| 安装方式 | 命令 / 来源 | 适用场景 | 注意事项 |
|---|---|---|---|
| Helm Chart | helm install metrics-server metrics-server/metrics-server |
生产、可定制参数 | 需提前添加 Helm 仓库;支持 values.yaml 覆盖 |
| 官方 YAML | kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml |
快速验证、测试 | 默认参数可能不满足生产安全要求 |
| kubeadm addon | kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability.yaml |
高可用部署 | 需要配置多个副本与反亲和性 |
建议: 生产集群始终使用 Helm 部署,便于版本管理与参数持久化。若集群网络受限,可提前将镜像
registry.k8s.io/metrics-server/metrics-server:v0.7.x 推送到私有仓库。
3.2 资源限制配置
Metrics Server 默认不设置资源请求与限制,在节点压力较大时可能被 OOMKill 或导致 kubelet 响应超时。以下为生产级资源限制配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: metrics-server
namespace: kube-system
spec:
template:
spec:
containers:
- name: metrics-server
image: registry.k8s.io/metrics-server/metrics-server:v0.7.2
resources:
requests:
cpu: 100m
memory: 200Mi
limits:
cpu: 500m
memory: 500Mi
args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
- --metric-resolution=15s
资源规划要点:
- CPU 请求:100m 可满足 100 节点以内的集群;节点数每增加 100,建议增加 50m。
- 内存限制:500Mi 适用于 200 节点规模;超出后需按 Pod 数量线性估算(约 2Ki / Pod)。
- OOM 保护:必须设置
limits.memory,防止 Metrics Server 因内存泄漏影响集群稳定性。
3.3 常见启动参数调优
Metrics Server 的启动参数直接影响采集精度、kubelet 负载与 API 响应速度。以下为生产环境最常用的参数及其调优建议:
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
--metric-resolution |
60s | 15s ~ 30s | 采集间隔;HPA 需要更细粒度时设为 15s,注意增加 kubelet 压力 |
--kubelet-preferred-address-types |
Hostname,InternalDNS,InternalIP,ExternalDNS,ExternalIP | InternalIP | 避免 DNS 解析失败导致采集超时;云环境建议仅保留 InternalIP |
--kubelet-insecure-tls |
false | true(非生产) / 配置 CA(生产) | 跳过 kubelet 证书验证;生产环境应配置 --kubelet-ca-cert |
--kubelet-port |
10250 | 10250 | kubelet 只读端口 10255 已弃用,勿修改 |
--requestheader-allowed-names |
— | front-proxy-client | API 聚合层认证;未配置可能导致 401 错误 |
注意: 在大型集群(>500 节点)中,
--metric-resolution=15s 可能导致 kubelet 频繁响应采集请求,建议先使用 30s 观察 kubelet CPU 变化,再逐步缩短间隔。
3.4 Metrics Server 采集架构与数据流
下图展示了 Metrics Server 从 kubelet 采集指标到 HPA 消费的完整链路:
3.5 启动参数调优实战:高精度采集配置
若业务场景要求 HPA 响应延迟低于 30 秒(例如在线交易、实时游戏),可按以下参数组合部署 Metrics Server:
helm upgrade --install metrics-server metrics-server/metrics-server \
--namespace kube-system \
--set resources.requests.cpu=200m \
--set resources.requests.memory=300Mi \
--set resources.limits.cpu=1 \
--set resources.limits.memory=1Gi \
--set args[0]=--kubelet-preferred-address-types=InternalIP \
--set args[1]=--metric-resolution=15s \
--set args[2]=--kubelet-insecure-tls=false \
--set args[3]=--kubelet-ca-cert=/etc/kubernetes/pki/ca.crt
参数解读:
--metric-resolution=15s:每 15 秒采集一次,HPA 可在 30 秒内感知负载变化。--kubelet-ca-cert:指定 CA 证书路径,启用 TLS 验证,避免安全风险。resources.limits.cpu=1:允许突发使用 1 核 CPU,应对大规模 Pod 采集峰值。
3.6 验证部署与常见问题
部署完成后,执行以下命令验证 Metrics Server 是否正常工作:
# 检查 Pod 状态
kubectl get pods -n kube-system -l app.kubernetes.io/name=metrics-server
# 测试 API 可用性
kubectl get --raw /apis/metrics.k8s.io/v1beta1
# 查看节点指标
kubectl top nodes
# 查看 Pod 指标
kubectl top pods -A
常见问题排查:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
kubectl top nodes 返回空 |
Metrics Server 无法连接 kubelet | 检查 --kubelet-preferred-address-types 是否包含 InternalIP;确认节点网络可达 |
Pod 日志报 401 Unauthorized |
kubelet 证书验证失败 | 配置 --kubelet-ca-cert 或临时使用 --kubelet-insecure-tls |
HPA 始终显示 unknown 指标 |
Metrics Server 未就绪或采集超时 | 检查 Pod 资源限制是否过小;增大 --metric-resolution 至 30s |
生产建议: 在部署 Metrics Server 后,持续观察 kubelet 的 CPU 使用率。若 kubelet CPU 增幅超过 10%,应适当增大
--metric-resolution 或减少 Metrics Server 副本数。