k8s中Metrics Server组件安装

Metrics Server是一个特殊的集群级别(Cluster-Level)组件,而不是一个普通的命名空间级别(Namespace-Level)的工作负载应用

|---------------|----------------------------------------------|-----------------------------------------------------------------------------------------------|
| 特性 | 普通应用Pod (如Nginx) | Metrics Server |
| 作用域 | 命名空间级别:属于特定Namespace,仅对该Namespace内的资源可见。 | 集群级别:服务于整个集群,收集所有Namespace下的Node和Pod的性能指标。 |
| 安装目标Namespace | 可以是任何Namespace(如zxx, default)。 | 必须 安装在 kube-system​ 命名空间。这是Kubernetes生态的约定俗成,集群核心组件都放在这里。 |
| 功能依赖 | ​通常被同一Namespace内的Service或Ingress访问。 | 其API(metrics.k8s.io)被
Horizontal Pod Autoscaler (HPA)
​ 和 **kubectl top**​ 命令等集群级功能依赖。 |

目录

[正确安装与验证 Metrics Server](#正确安装与验证 Metrics Server)

[1.正确安装 Metrics Server](#1.正确安装 Metrics Server)

2.验证安装是否成功

诊断步骤

[1. 查看 Pod 详细信息和事件](#1. 查看 Pod 详细信息和事件)

2.查看容器日志(最可能找到原因)

3.检查就绪探针配置

[解决:直接修改 Pod 镜像(快速修复)](#解决:直接修改 Pod 镜像(快速修复))

[新问题:看到两个 Metrics Server Pod!](#新问题:看到两个 Metrics Server Pod!)

[步骤 1:直接删除这两个有问题的Pod](#步骤 1:直接删除这两个有问题的Pod)

[步骤 2:立即检查新Pod的状态和事件](#步骤 2:立即检查新Pod的状态和事件)

[步骤 3:完全卸载当前的 Metrics Server](#步骤 3:完全卸载当前的 Metrics Server)

[步骤 4:使用国内镜像源重新安装](#步骤 4:使用国内镜像源重新安装)

[步骤 5:等待并验证安装](#步骤 5:等待并验证安装)

最后一个问题:

查看详细的应用日志(最关键)

[方法一 通过 Patch 命令快速修复(推荐)](#方法一 通过 Patch 命令快速修复(推荐))

[方法二 编辑 Deployment 配置文件(更直观)](#方法二 编辑 Deployment 配置文件(更直观))


正确安装与验证 Metrics Server

请按照以下步骤操作:

1.正确安装 Metrics Server

推荐使用官方提供的YAML文件进行安装,这会自动将其部署到kube-system命名空间。

复制代码
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

注意 :在某些环境(特别是使用自签名证书的私有集群),你可能需要编辑这个YAML文件,在Metrics Server的Deployment参数中添加--kubelet-insecure-tls以跳过TLS验证。

2.验证安装是否成功

安装后,检查kube-system命名空间下的Metrics Server Pod是否正常运行:

复制代码
kubectl get pods -n kube-system | grep metrics-server

等待片刻(约1-2分钟),让Metrics Server完成数据采集,然后测试命令:

复制代码
# 查看集群节点的资源使用情况
kubectl top nodes
# 查看指定命名空间(如zxx)下Pod的资源使用情况
kubectl top pods -n zxx

遇到镜像问题,网络原因一直拉取不过来:

诊断步骤

1. 查看 Pod 详细信息和事件

复制代码
# 查看 Pod 详细信息,特别是 Events 部分
kubectl describe pod metrics-server-856f767b-s6m2m -n kube-system

重点关注:

  • Events:查看是否有警告或错误事件

  • Readiness Probe:查看就绪探针的配置

  • Conditions:查看 Pod 的各项条件状态

2.查看容器日志(最可能找到原因)

复制代码
# 查看容器日志(这是最关键的一步)
kubectl logs metrics-server-856f767b-s6m2m -n kube-system

# 如果上面命令没输出,尝试指定容器名
kubectl logs metrics-server-856f767b-s6m2m -n kube-system -c metrics-server

Metrics Server 无法从官方镜像仓库拉取镜像 ,导致 Pod 无法启动。这是一个网络连接问题,不是 Pod 配置或健康检查的问题。

3.检查就绪探针配置

复制代码
# 查看 Deployment 配置
kubectl get deployment metrics-server -n kube-system -o yaml | grep -A 10 "readinessProbe"

解决:直接修改 Pod 镜像(快速修复)

如果您只需要临时解决这个问题:镜像加速器:https://console.ucloud.cn/

复制代码
# 1. 编辑 Deployment
kubectl edit deployment metrics-server -n kube-system

# 2. 找到 image 字段,修改为:
#    image: registry.aliyuncs.com/google_containers/metrics-server:v0.8.0

# 3. 保存并退出,Pod 会自动重启

新问题:看到两个 Metrics Server Pod!

这是 Kubernetes Deployment 滚动更新和故障恢复的正常现象 ,但两个Pod都处于 0/1 Running状态说明当前的部署是有问题的。

步骤 1:直接删除这两个有问题的Pod

Deployment 控制器会发现 Pod 被删除,并立即尝试用当前最新的配置重新创建一个全新的Pod。

复制代码
kubectl delete pod metrics-server-856f767b-s6m2m metrics-server-5f4646758d-9wwzx -n kube-system

步骤 2:立即检查新Pod的状态和事件

删除后,马上运行以下命令查看是否生成了新Pod,以及它卡在哪一步。

复制代码
# 查看新Pod是否生成
kubectl get pods -n kube-system -l k8s-app=metrics-server -w
# 按 Ctrl+C 停止监视

# 查看新Pod的详细事件,这是诊断的关键
kubectl describe pod -n kube-system -l k8s-app=metrics-server

重点关注 Events:部分,看是否还是 Failed to pull image

**步骤 3:**完全卸载当前的 Metrics Server

复制代码
# 1. 删除 Deployment
kubectl delete deployment metrics-server -n kube-system

# 2. 删除 Service
kubectl delete service metrics-server -n kube-system

# 3. 删除所有相关资源(更彻底的方式)
kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml 2>/dev/null || true

# 4. 强制删除所有残留的 Pod(如果还有)
kubectl delete pod -n kube-system -l k8s-app=metrics-server --force --grace-period=0 2>/dev/null || true

# 5. 验证是否已完全删除
kubectl get all -n kube-system | grep -i metrics

步骤 4:使用国内镜像源重新安装

这是关键步骤!我们将使用镜像替代官方镜像:

复制代码
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

修改代码中image地址为镜像加速后的地址:

复制代码
# 3. 应用修改后的配置文件
kubectl apply -f components-modified.yaml

# 4. 删除临时文件
rm -f components.yaml components-modified.yaml

步骤 5:等待并验证安装

复制代码
# 等待 Pod 启动(大约30-60秒)
echo "等待 Metrics Server 启动..."
sleep 30

# 检查 Pod 状态(应该只有一个 Pod,且状态为 Running 1/1)
kubectl get pods -n kube-system -l k8s-app=metrics-server

# 查看详细状态
kubectl describe pod -n kube-system -l k8s-app=metrics-server

# 等待一段时间让 Metrics Server 收集数据
echo "等待数据收集(约30秒)..."
sleep 30

# 测试功能
kubectl top nodes 2>/dev/null && echo "Metrics Server 安装成功!" || echo "仍在初始化,请稍后再试"

最后一个问题:

Readiness probe failed: HTTP probe failed with statuscode: 500这个错误说明 Metrics Server 容器已成功启动,但内部的 HTTP 健康检查接口返回了 500 内部服务器错误。

查看详细的应用日志(最关键)

复制代码
# 查看 Metrics Server 的详细日志
kubectl logs -n kube-system deployment/metrics-server --tail=100

# 或者查看特定 Pod 的日志
kubectl logs -n kube-system metrics-server-5f4646758d-4kxhk
  • 根本问题:Kubernetes 节点的 kubelet 使用了自签名的、不包含 IP SAN 的证书,导致 Metrics Server 无法与其建立安全连接。

  • 解决方案 :通过在 Metrics Server 的启动命令中添加 --kubelet-insecure-tls参数,使其跳过证书验证。

方法一 通过 Patch 命令快速修复(推荐)

执行以下命令,为现有的 Metrics Server Deployment 添加必要的参数:

复制代码
# 这个命令将向 Metrics Server 添加三个关键参数:
# 1. --kubelet-insecure-tls: 跳过 TLS 验证(解决证书问题)
# 2. --kubelet-preferred-address-types=InternalIP: 优先使用节点内网IP连接
# 3. --metric-resolution=30s: 设置指标采集间隔
kubectl patch deployment metrics-server -n kube-system --type='json' -p='
[
  {
    "op": "add",
    "path": "/spec/template/spec/containers/0/args/-",
    "value": "--kubelet-insecure-tls"
  },
  {
    "op": "add",
    "path": "/spec/template/spec/containers/0/args/-",
    "value": "--kubelet-preferred-address-types=InternalIP"
  },
  {
    "op": "add",
    "path": "/spec/template/spec/containers/0/args/-",
    "value": "--metric-resolution=30s"
  }
]'

方法二 编辑 Deployment 配置文件(更直观)

复制代码
kubectl edit deployment metrics-server -n kube-system

spec.template.spec.containers[0].args部分,确保包含以下参数:

复制代码
args:
- --cert-dir=/tmp
- --secure-port=443
- --kubelet-insecure-tls        # 新增:跳过TLS验证
- --kubelet-preferred-address-types=InternalIP  # 新增:使用内网IP
- --metric-resolution=30s       # 新增:采集间隔
相关推荐
阿里云云原生2 小时前
研发数据不出域,安全合规再升级!云效 Region 版发布
安全·阿里云·云原生·云计算·云效
Y.O.U..2 小时前
Kubernetes-安全参数
安全·kubernetes
Yawesh_best3 小时前
摆脱命令行!Docker Compose UI + 内网穿透,随时随地管理容器
ui·docker·容器
燃于AC之乐3 小时前
【C++手撕STL】Vector模拟实现:从零到一的容器设计艺术
开发语言·c++·容器·stl·vector·底层·模板编程
飞翔沫沫情3 小时前
K8s私有云:Nginx真实客户端IP透传全攻略(HAProxy + Ingress 实战)
云原生·kubernetes
江湖有缘3 小时前
自托管在线演示文稿平台:PPTist + Docker 部署实战
docker·容器·eureka
进击的雷神3 小时前
现代软件架构全景解析:从B/S到云原生的演进之路
云原生·系统架构
2401_840192273 小时前
ZooKeeper 集群部署指南(Kubernetes StatefulSet 方式)
分布式·zookeeper·kubernetes
春日见3 小时前
三分钟安装window Docker,并与Ubuntu(WSL)建立连接
linux·人工智能·windows·驱动开发·机器学习·docker·容器