K8s 安装Metrics Server

这个错误信息:

1
2
3
4
Warning FailedGetResourceMetric horizontal-pod-autoscaler 
failed to get cpu utilization: unable to get metrics for resource cpu:
unable to fetch metrics from resource metrics API:
the server could not find the requested resource (get pods.metrics.k8s.io)

表明 Kubernetes 的 Horizontal Pod Autoscaler (HPA) 无法从 Metrics Server 获取 CPU(或其他资源)使用率指标。根本原因是:Metrics Server 没有正确部署或不可用


🔍 错误原因分析

pods.metrics.k8s.io 是由 Metrics Server 提供的 Kubernetes 资源指标 API。HPA 在基于 CPU 或内存进行自动扩缩容时,依赖该 API 来获取当前 Pod 的资源使用情况。

如果出现上述错误,通常是因为:

  1. Metrics Server 未安装
    • 很多裸金属或自建 K8s 集群默认不安装 Metrics Server。
  2. Metrics Server 安装失败或 CrashLoopBackOff
    • Pod 无法正常运行(如镜像拉取失败、权限不足、网络问题等)。
  3. API 服务未注册或不可达
    • metrics.k8s.io API 未在 API Server 中注册,或者 APIService 对象状态异常。
  4. Istio 不是直接原因,但可能干扰监控(较少见)
    • Istio 本身不提供指标给 HPA,HPA 仍依赖 Metrics Server。不过某些 sidecar 注入配置可能影响资源上报(极少见)。

✅ 解决方案

步骤 1:确认 Metrics Server 是否已安装

1
kubectl get apiservice v1beta1.metrics.k8s.io
  • 如果返回 NotFound,说明未安装。
  • 如果存在,检查其状态是否为 Available=True
1
kubectl get apiservice v1beta1.metrics.k8s.io -o yaml

查看 status.conditions 字段。

步骤 2:安装或修复 Metrics Server

官方安装方式(推荐):

1
2
3
4
5
# 克隆官方仓库(可选)
git clone https://github.com/kubernetes-sigs/metrics-server.git

# 或直接应用 YAML(注意版本兼容性)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

⚠️ 注意:某些云环境(如 AWS EKS、GKE)可能需要额外参数,例如跳过 TLS 验证(仅测试环境):

args 中添加:

1
2
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname

kubectl edit deploy metrics-server -n kube-system
在 spec.template.spec.containers[0].args 中加入该参数

检查 Metrics Server Pod 状态:

1
2
kubectl get pods -n kube-system | grep metrics-server
kubectl logs -n kube-system <metrics-server-pod-name>

确保 Pod 处于 Running 状态,且无频繁重启。

步骤 3:验证指标是否可获取

安装成功后,等待 1-2 分钟,然后运行:

1
2
kubectl top nodes
kubectl top pods

如果能正常输出 CPU/内存使用情况,说明 Metrics Server 已工作。

再检查 HPA:

1
kubectl describe hpa <your-hpa-name>

应不再出现 FailedGetResourceMetric 警告。


🛠️ 补充建议(尤其在 Istio 环境中)

  • Istio 不影响 HPA 对 Metrics Server 的调用,因为 HPA 是控制平面组件,直接与 API Server 通信,不经过 Pod 内的 sidecar。
  • 但如果你在 虚拟机或边缘节点 上运行 workload,需确保 kubelet 的指标端口(通常是 10250 或 10255)可被 Metrics Server 访问。
  • 若使用 Prometheus + Adapter 替代 Metrics Server(如 custom metrics),则需配置 custom.metrics.k8s.io,但本错误明确指向 resource metrics(即 CPU/MEM),必须由 Metrics Server 提供。

✅ 总结

问题 原因 解决方法
HPA 无法获取 CPU 指标 缺少或故障的 Metrics Server 安装/修复 Metrics Server,确保 v1beta1.metrics.k8s.io API 可用

💡 小贴士:在 Minikube 中启用 Metrics Server:

1
minikube addons enable metrics-server

完成以上步骤后,HPA 应能正常工作,自动扩缩容基于实际 CPU 使用率进行。