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 消费的完整链路:

Metrics Server 采集架构与数据流 Metrics Server 采集架构与数据流 HPA (HorizontalPodAutoscaler) metrics.k8s.io API Metrics Server kubelet (Node-1) kubelet (Node-2) kubelet (Node-N) Metrics Server 通过 kubelet 的 /metrics/resource 端点采集数据,聚合后暴露为 metrics.k8s.io API

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 副本数。