Kubernetes HPA在后端发布拓扑中的弹性伸缩调优 - 第4节

4.1 Metrics Server 的作用与定位

Metrics Server 是 Kubernetes 集群中实现 Resource Metrics API(metrics.k8s.io)的核心组件。它从每个节点上的 kubelet 收集 CPU 和内存使用数据,并通过 API 聚合层暴露给 Horizontal Pod Autoscaler(HPA)、kubectl top 等消费者。

核心作用:Metrics Server 不存储历史数据,只提供实时快照。它是 HPA 弹性伸缩决策的“数据源”,没有 Metrics Server,基于 CPU/内存指标的 HPA 将无法工作。

4.1.1 在 HPA 架构中的位置

下图展示了 Metrics Server 在 HPA 指标采集链路中的桥梁角色:

Metrics Server 在 HPA 指标采集链路中的位置 Horizontal Pod Autoscaler Metrics Server kubelet (Node-1) kubelet (Node-2) kubelet (Node-N) 查询 metrics.k8s.io 说明:Metrics Server 通过 kubelet 的 /metrics/resource 端点采集数据,聚合后通过 API 暴露给 HPA。 HPA 定期(默认 15s)轮询 Metrics Server 获取 Pod 当前资源使用量,计算期望副本数。

4.2 安装步骤

Metrics Server 的安装方式有多种,推荐使用官方 YAML 清单或 Helm Chart。以下以 v0.7.x 版本为例,展示两种主流安装方式。

4.2.1 方式一:使用官方 YAML 清单安装(推荐)

  1. 下载最新发布清单:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  1. 验证 Pod 状态:
kubectl get pods -n kube-system -l k8s-app=metrics-server
  1. (可选)配置 kubelet 证书参数:如果集群使用自签名证书,需要在 Metrics Server 的 Deployment 中添加 --kubelet-insecure-tls 参数。
kubectl edit deployment metrics-server -n kube-system
# 在 spec.template.spec.containers[0].args 中添加:
# - --kubelet-insecure-tls
安全提示:--kubelet-insecure-tls 仅用于测试或内部网络环境。生产环境应配置正确的 kubelet 证书,避免安全风险。

4.2.2 方式二:使用 Helm Chart 安装

# 添加 Helm 仓库
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update

# 安装 Metrics Server
helm upgrade --install metrics-server metrics-server/metrics-server \
  --namespace kube-system \
  --set args={"--kubelet-insecure-tls"} \
  --set resources.requests.cpu=100m \
  --set resources.requests.memory=200Mi

4.2.3 安装参数对比

参数 默认值 说明 推荐场景
--kubelet-preferred-address-types InternalIP,ExternalIP,Hostname 指定 kubelet 通信地址类型优先级 多网卡或云环境需调整
--metric-resolution 60s 指标采集周期 HPA 响应敏感度要求高时可设为 15s-30s
--kubelet-insecure-tls false 跳过 kubelet 证书验证 仅测试环境使用
--kubelet-use-node-status-port true 使用 Node 状态中的端口连接 kubelet 默认开启,兼容大多数集群

4.3 验证指标采集

安装完成后,需要通过以下步骤确认 Metrics Server 正常工作,指标数据可以被 HPA 和 kubectl top 使用。

4.3.1 检查 API 服务可用性

# 检查 API 聚合层是否注册了 metrics.k8s.io
kubectl get apiservice v1beta1.metrics.k8s.io

# 预期输出:
# NAME                     SERVICE                      AVAILABLE   AGE
# v1beta1.metrics.k8s.io   kube-system/metrics-server   True        5m

4.3.2 使用 kubectl top 命令

# 查看所有节点的资源使用
kubectl top nodes

# 查看所有 Pod 的资源使用
kubectl top pods --all-namespaces

# 查看特定命名空间的 Pod
kubectl top pods -n default
验证要点:如果 kubectl top nodes 返回了 CPU 和内存数据(如 500m、1024Mi),说明 Metrics Server 已成功采集并聚合指标。如果返回 error: Metrics API not available,请检查 Metrics Server Pod 日志。

4.3.3 检查 Metrics Server Pod 日志

# 查看 Metrics Server 日志,确认无连接错误
kubectl logs -n kube-system -l k8s-app=metrics-server --tail=50

# 常见错误及解决:
# "unable to fully collect metrics: ..." → 检查 kubelet 地址可达性
# "x509: certificate signed by unknown authority" → 添加 --kubelet-insecure-tls

4.3.4 验证 HPA 能否获取指标

# 创建一个测试 HPA 对象
kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=5

# 查看 HPA 状态,确认指标列有数据
kubectl get hpa

# 预期输出示例:
# NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
# nginx   Deployment/nginx   /50%   1         5         1          10s
# 等待 1-2 个采集周期后,TARGETS 应显示实际 CPU 使用率,如 "10%/50%"

4.4 常见问题与排障

问题现象 可能原因 解决方案
kubectl top nodes 返回空或无数据 Metrics Server 未启动或 kubelet 端口不可达 检查 Pod 状态和日志;确认节点安全组放行 10250 端口
HPA 显示 <unknown> 指标 Metrics Server 未注册 API 或采集超时 检查 apiservice 状态;增加 --metric-resolution 采集频率
Pod 日志报证书错误 kubelet 使用自签名证书 添加 --kubelet-insecure-tls 或配置 CA 证书
Metrics Server 内存持续增长 集群规模大,默认资源限制不足 增加 --kubelet-use-node-status-port=false 减少连接数;调整资源 requests/limits

4.5 生产环境配置建议

  • 资源限制:为 Metrics Server 设置合理的 CPU(100m-200m)和内存(200Mi-500Mi)限制,避免被 OOMKill。
  • 高可用部署:设置 replicas: 2 并配置 PodAntiAffinity,确保 Metrics Server 自身高可用。
  • 采集周期调优:对于需要快速响应的 HPA 场景,将 --metric-resolution 从默认 60s 调整为 15s-30s,但需注意增加 kubelet 负载。
  • 网络策略:确保 Metrics Server 可以访问所有节点的 kubelet 端口(默认 10250),并在网络策略中放行。
最佳实践:在集群初始化阶段就部署 Metrics Server,并作为基础设施组件纳入监控告警。HPA 的弹性伸缩效果直接依赖于 Metrics Server 的稳定性和数据准确性。