☰
自建 Kubernetes 集群部署 metrics-server:打通 kubectl top 与 HPA 的资源指标链路
2026/10/5 2:06:33 网站建设 项目流程
  • 文档
  • 教程
  • 云原生

【免费下载链接】follow-me-install-kubernetes-cluster

和我一步步部署 kubernetes 集群

项目地址:https://gitcode.com/gh_mirrors/fo/follow-me-install-kubernetes-cluster
点击查看免费下载

metrics-server 是 Kubernetes 资源指标(Resource Metrics)的标准实现,它以 kube-apiserver 为入口发现集群中的 Node 与 Pod,通过 HTTPS 调用各节点 kubelet 的 API(底层由内嵌的 cadvisor 提供数据),聚合出 CPU、内存等核心使用指标。本文以「和我一步步部署 kubernetes 集群」项目(Kubernetes v1.16.6,三节点集群 zhangjun-k8s-01/02/03)为背景,完整演示 metrics-server v0.3.6 的部署过程、关键参数调优、metrics.k8s.io API 原始输出验证与 kubectl top 的使用方法,并解释它与 kube-prometheus 中 k8s-prometheus-adapter 的分工关系。读完本文,你将掌握资源指标链路的工作原理,并能在自己的集群中独立完成 metrics-server 的安装与排障。

为什么需要 metrics-server:Heapster 退役后的指标方案

metrics-server 通过 kube-apiserver 发现集群内所有节点,然后调用各节点的 kubelet APIs(HTTPS 接口)获得 Node 和 Pod 的 CPU、Memory 等资源使用情况。它聚合后的数据通过metrics.k8s.ioAPI 对外暴露,成为kubectl top与水平自动扩缩容(HPA)的数据来源。

从 Kubernetes 1.12 开始,kubernetes 的安装脚本移除了 Heapster;从 1.13 开始完全移除了对 Heapster 的支持,Heapster 不再被维护。其能力被拆分为三类替代方案:

  1. 用于支持自动扩缩容的 CPU/memory HPA 指标:metrics-server,提供metrics.k8s.io资源指标 API;
  2. 通用监控方案:使用第三方可以获取 Prometheus 格式监控指标的监控系统,如 Prometheus Operator(本项目对应 08-4.kube-prometheus插件.md);
  3. 事件传输:使用第三方工具来传输、归档 kubernetes events。

本项目在 00.组件版本和配置策略.md 中明确将 metrics-server(0.3.6,2019-10-15 发布)列为集群 Metric 插件的选型,并约定「使用 https 访问 kubelet 安全端口」——这与本仓库集群的严格安全基线完全一致:kubelet 关闭了非安全 http 端口,只保留 10250 安全端口接收 https 请求。

未安装 metrics-server 时的表现

没有安装 metrics-server 或 heapster 时,kubectl top命令将不能使用:

$ kubectl top node Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)

报错说明kubectl top此时试图向后端指标服务(历史上是 heapster 对应的服务)取数,但集群中并不存在该资源。安装 metrics-server 后,kubectl top会改从metrics.k8s.ioAPI 获取数据。

安装 metrics-server

1. 克隆源码并进入部署目录

在部署机上(本项目所有操作均在 zhangjun-k8s-01 节点执行,环境变量定义见 manifests/environment.sh):

$ cd /opt/k8s/work/ $ git clone https://github.com/kubernetes-incubator/metrics-server.git $ cd metrics-server/deploy/1.8+/

deploy/1.8+目录下的部署清单兼容 Kubernetes 1.8 及以上的集群版本,本集群使用的 Kubernetes v1.16.6 完全满足要求。

2. 修改 Deployment 清单,添加关键启动参数

修改metrics-server-deployment.yaml文件,为 metrics-server 添加三个命令行参数。先备份原文件再做差异对比:

$ cp metrics-server-deployment.yaml metrics-server-deployment.yaml.orig $ diff metrics-server-deployment.yaml.orig metrics-server-deployment.yaml 32c32 < image: k8s.gcr.io/metrics-server-amd64:v0.3.6 --- > image: gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.6 35a36,37 > - --metric-resolution=30s > - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP

改动说明:

  • 镜像替换:使用微软 grc(Azure China)的镜像源gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.6,便于国内环境拉取;镜像 tag v0.3.6 与 00.组件版本和配置策略.md 中规划的 metrics-server 版本一致;
  • --metric-resolution=30s:从 kubelet 采集数据的周期(metrics 聚合分辨率),默认值为 60s,设置为 30s 可以更快反映节点与 Pod 的资源变化;
  • --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP:优先使用InternalIP访问 kubelet,避免节点名称没有 DNS 解析记录时,通过节点名称调用节点 kubelet API 失败(这是未配置该参数时的默认情况)。本项目集群节点名称为zhangjun-k8s-01/02/03,若环境中未配置对应的 DNS 解析,就必须通过该参数让 metrics-server 改用 InternalIP 直连。

3. 部署 metrics-server

$ cd /opt/k8s/work/metrics-server/deploy/1.8+/ $ kubectl create -f .

kubectl create -f .会创建该目录下的全部清单对象,包括 Deployment、Service、ClusterRole/ClusterRoleBinding 等 RBAC 规则,赋予 metrics-server 读取节点状态和调用 kubelet API 的权限。

查看运行情况

$ kubectl -n kube-system get all -l k8s-app=metrics-server NAME READY STATUS RESTARTS AGE pod/metrics-server-77df59848f-sjjbd 1/1 Running 0 18s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/metrics-server 1/1 1 1 19s NAME DESIRED CURRENT READY AGE replicaset.apps/metrics-server-77df59848f 1 1 1 19s

Pod 达到1/1 Running即部署成功。若 Pod 处于 CrashLoopBackOff,优先检查上一节的三个参数:镜像是否能拉取、--kubelet-preferred-address-types是否导致解析失败(可用kubectl -n kube-system logs <pod>查看日志确认)。

查看 metrics-server 输出的 metrics

metrics-server 聚合后的数据通过metrics.k8s.io/v1beta1API 暴露。可以直接使用kubectl get --raw读取原始 JSON,并用 jq 美化输出:

kubectl get --raw https://172.27.138.251:6443/apis/metrics.k8s.io/v1beta1/nodes | jq . kubectl get --raw https://172.27.138.251:6443/apis/metrics.k8s.io/v1beta1/pods | jq . kubectl get --raw https://172.27.138.251:6443/apis/metrics.k8s.io/v1beta1/nodes/<node-name> | jq . kubectl get --raw https://172.27.138.251:6443/apis/metrics.k8s.io/v1beta1/namespace/<namespace-name>/pods/<pod-name> | jq .

要点:

  • 将<xxx>替换为实际内容,例如<node-name>替换为zhangjun-k8s-01;
  • /apis/metrics.k8s.io/v1beta1/nodes与/apis/metrics.k8s.io/v1beta1/pods返回的usage字段中包含 CPU 和 Memory 两类指标,对应 06-4.kubelet.md 中描述的 kubelet 内嵌 cadvisor 所统计的节点与容器资源数据;
  • 地址中的 6443 是本集群 kube-apiserver 的安全端口(见 00.组件版本和配置策略.md:apiserver 关闭非安全端口 8080,仅在安全端口 6443 接收 https 请求);由于 metrics-server 已成功注册metrics.k8s.ioAPI,这些--raw请求会被 apiserver 代理转发到 metrics-server 后端。

使用 kubectl top 命令查看集群节点资源使用情况

kubectl top命令从 metrics-server 获取集群节点基本的指标信息:

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% zhangjun-k8s-01 177m 2% 9267Mi 58% zhangjun-k8s-02 364m 4% 10338Mi 65% zhangjun-k8s-03 185m 2% 5950Mi 37%

输出中的CPU(cores)为毫核(m)单位,CPU%为相对于节点总 CPU 的占用百分比;MEMORY(bytes)为 Mi 单位的内存占用,MEMORY%为相对于节点总内存的占用百分比。同样地,kubectl top pods可查看各命名空间下 Pod 的指标。这些数据正是 HPA(Horizontal Pod Autoscaler)在计算扩缩容策略时读取metrics.k8s.ioAPI 所依赖的数据源。

与 kube-prometheus 的分工与共存关系

需要特别注意 metrics-server 与 kube-prometheus 的关系。本项目 08-4.kube-prometheus插件.md 明确说明:kube-prometheus 中的 k8s-prometheus-adapter 使用 Prometheus 实现了metrics.k8s.io和custom.metrics.k8s.ioAPI,因此部署了 kube-prometheus 的集群不需要再部署 metrics-server;反之,如果要单独部署 metrics-server,则应参考本文对应的 C.metrics-server插件.md。

换句话说,metrics-server 是满足 HPA 与kubectl top需求的最小化资源指标方案,而 kube-prometheus 提供的是包含 Prometheus、Grafana、Alertmanager、node-exporter、kube-state-metrics 在内的完整监控体系。生产环境可按需二选一,或以后者为监控底座、前者为轻量资源指标出口。

关键参数速查

参数取值(本文)作用
--metric-resolution30s从 kubelet 采集资源指标的周期,默认 60s
--kubelet-preferred-address-typesInternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIPkubelet 访问地址优先级;无 DNS 解析的环境必须将 InternalIP 前置
imagegcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.6国内可拉取的镜像源,版本与项目规划一致

深入原理:metrics-server 如何安全地访问 kubelet

metrics-server 能采集到数据,依赖本集群 kubelet 的安全配置。在 06-4.kubelet.md 中,kubelet 通过KubeletConfiguration关闭了只读端口(readOnlyPort: 0),仅在安全端口 10250 接收 https 请求,并配置authentication.anonymous.enabled: false、authentication.x509.clientCAFile与authentication.webhook.enabled: true,拒绝匿名访问;metrics-server 作为集群内部组件,其 Deployment 清单中的 ServiceAccount 与 RBAC ClusterRoleBinding 使其获得调用 kubelet/metrics等端点的合法身份,从而完成 HTTPS 数据采集。若集群配置了节点级网络策略,还需保证 kube-apiserver 所在节点到各节点 10250 端口的路由可达(本项目集群网络由 calico 插件提供,详见 06-6.calico.md)。

参考

  • 指标链路与 kubelet API 认证授权:本文档对应仓库 C.metrics-server插件.md,以及 kubelet 侧的 06-4.kubelet.md
  • metrics-server 与 kube-prometheus 的关系:见 08-4.kube-prometheus插件.md
  • 组件版本选型与安全策略:见 00.组件版本和配置策略.md
  • 集群环境变量(节点 IP、主机名、CIDR 等):见 manifests/environment.sh
  • metrics-server RBAC 与参数解析的社区讨论(kube-apiserver 安全端口访问方式):参考 A.浏览器访问kube-apiserver安全端口.md
  • 文档
  • 教程
  • 云原生

【免费下载链接】follow-me-install-kubernetes-cluster

和我一步步部署 kubernetes 集群

项目地址:https://gitcode.com/gh_mirrors/fo/follow-me-install-kubernetes-cluster
点击查看免费下载
上一篇:终极MapleStory游戏编辑器:如何用Harepacker-resurrected打造你的专属冒险世界
下一篇:React Native Skia 中 Vertices 组件详解:顶点绘制、纹理映射与索引三角形的完整实践

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询