- 文档
- 教程
- 云原生
【免费下载链接】follow-me-install-kubernetes-cluster
和我一步步部署 kubernetes 集群
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 不再被维护。其能力被拆分为三类替代方案:
- 用于支持自动扩缩容的 CPU/memory HPA 指标:metrics-server,提供
metrics.k8s.io资源指标 API; - 通用监控方案:使用第三方可以获取 Prometheus 格式监控指标的监控系统,如 Prometheus Operator(本项目对应 08-4.kube-prometheus插件.md);
- 事件传输:使用第三方工具来传输、归档 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 19sPod 达到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-resolution | 30s | 从 kubelet 采集资源指标的周期,默认 60s |
--kubelet-preferred-address-types | InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP | kubelet 访问地址优先级;无 DNS 解析的环境必须将 InternalIP 前置 |
| image | gcr.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 集群
相关推荐
ZeroTermux:Android上的全能Linux终端模拟器深度解析
ZeroTermux:Android上的全能Linux终端模拟器深度解析 ZeroTermux是一款基于Termux二次开发的Android终端模拟器,为移动设
移动开发开发工具Kubernetes Metrics Server 终极指南:掌握 kubectl top 命令实战应用
Kubernetes Metrics Server 终极指南:掌握 kubectl top 命令实战应用 Kubernetes Metrics Server 是
云原生后端容器编排弹性伸缩kube-state-metrics Helm Chart 部署与配置完全指南:Kubernetes 集群指标采集实战
kube state metrics Helm Chart 部署与配置完全指南:Kubernetes 集群指标采集实战 本指南以 Friend 仓库内嵌的 ku
人工智能AI 应用语音移动开发后端桌面应用智能硬件MCP 服务
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考