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 指标采集链路中的桥梁角色:
4.2 安装步骤
Metrics Server 的安装方式有多种,推荐使用官方 YAML 清单或 Helm Chart。以下以 v0.7.x 版本为例,展示两种主流安装方式。
4.2.1 方式一:使用官方 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
- (可选)配置 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 的稳定性和数据准确性。