2025,每天10分钟,跟我学K8S(四十一)- Dashboard
2025,每天10分钟,跟我学K8S(四十一)- Dashboard_kubernetes dashboard-CSDN博客
什么是Kubernetes Dashboard?
Kubernetes Dashboard 是 Kubernetes 官方提供的可视化 Web 界面,用于简化集群资源管理和监控操作。简单来说,就是我们之前的所有操作,都是通过 kubectl 命令来完成的,为了简便操作,官方提供了一个web控制台,很多操作可以通过控制台来完成。例如通过 Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。
一、核心功能与适用场景
-
核心功能
- 资源管理:支持 Pod、Deployment、Service 等资源的创建、删除、更新及弹性伸缩操作。
- 监控与排障:实时查看资源状态、容器日志及事件告警,支持 Pod 终端访问。
- 配置管理:通过 YAML 文件或表单直接修改资源配置,支持批量操作。
- 权限控制:集成 RBAC 机制,可精细化控制用户操作权限。
-
适用场景
- 开发测试:快速验证资源配置,避免频繁使用
kubectl命令。 - 运维监控:集中查看集群健康状态,定位资源瓶颈。
- 多租户管理:通过命名空间隔离不同团队资源,降低误操作风险。
- 开发测试:快速验证资源配置,避免频繁使用
二、安装演示
目前官方Dashboard 版本为kubernetes-dashboard-7.11.1,而从7版本开始,官方已经只支持helm的方式安装。所以本文也采用helm方式安装。

2.1 添加仓库并安装
官方演示操作为下面步骤
-
# 添加 Helm 仓库并部署
-
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
-
-
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
但是由于国内网络问题,可能无法添加官方源,只能去github上将软件包下载到本地
-
# 下载
-
root@k8s-master:~/dashboard# wget https://github.com/kubernetes/dashboard/releases/download/kubernetes-dashboard-7.11.1/kubernetes-dashboard-7.11.1.tgz
-
-
# 解压
-
root@k8s-master:~/dashboard# tar zxvf kubernetes-dashboard-7.11.1.tgz
-
kubernetes-dashboard/Chart.yaml
-
-
# 查看目录结构
-
root@k8s-master:~/dashboard# tree
-
.
-
├── kubernetes-dashboard
-
│ ├── Chart.lock
-
│ ├── charts
-
│ │ ├── cert-manager
-
│ │ │ ├── Chart.yaml
-
│ │ │ ├── README.md
-
......
2.2 修改镜像地址
-
vim kubernetes-dashboard/values.yaml
-
-
repository: docker.io/kubernetesui/dashboard-auth
-
repository: docker.io/kubernetesui/dashboard-web
-
repository: docker.io/kubernetesui/dashboard-metrics-scraper
-
repository: docker.io/kubernetesui/dashboard-api
-
====修改为====
-
repository: m.daocloud.io/docker.io/kubernetesui/dashboard-auth
-
repository: m.daocloud.io/docker.io/kubernetesui/dashboard-web
-
repository: m.daocloud.io/docker.io/kubernetesui/dashboard-metrics-scraper
-
repository: m.daocloud.io/docker.io/kubernetesui/dashboard-api
-
-
-
-
-
vim kubernetes-dashboard/charts/kong/values.yaml
-
repository: kong
-
====修改为====
-
repository: m.daocloud.io/docker.io/kong
-
-
-
-
-
-
# 安装
-
root@k8s-master:~/dashboard# helm upgrade --install kubernetes-dashboard kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
-
Release "kubernetes-dashboard" does not exist. Installing it now.
-
.....
-
Dashboard will be available at:
-
https://localhost:8443
-
-
-
# 等待所有pod运行正常后,查看svc和pod状态
-
root@k8s-master:~/dashboard# kubectl get pod -n kubernetes-dashboard
-
NAME READY STATUS RESTARTS AGE
-
kubernetes-dashboard-api-7744c84465-z76gq 1/1 Running 0 2m28s
-
kubernetes-dashboard-auth-5ff6f5889b-74r28 1/1 Running 0 2m28s
-
kubernetes-dashboard-kong-75dd496684-gf62v 1/1 Running 0 2m28s
-
kubernetes-dashboard-metrics-scraper-9b9f5c9d5-sgh7j 1/1 Running 0 2m28s
-
kubernetes-dashboard-web-6c8f4d7666-jskjg 1/1 Running 0 2m28s
-
root@k8s-master:~/dashboard#
-
root@k8s-master:~/dashboard# kubectl get svc -n kubernetes-dashboard
-
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-
kubernetes-dashboard-api ClusterIP 10.102.121.61 <none> 8000/TCP 2m36s
-
kubernetes-dashboard-auth ClusterIP 10.103.103.175 <none> 8000/TCP 2m36s
-
kubernetes-dashboard-kong-proxy ClusterIP 10.99.183.86 <none> 443/TCP 2m36s
-
kubernetes-dashboard-metrics-scraper ClusterIP 10.101.165.125 <none> 8000/TCP 2m36s
-
kubernetes-dashboard-web NodePort 10.99.103.97 <none> 8000:32528/TCP 2m36s
-
2.3 创建用户和token
-
# 创建管理员账户
-
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
-
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
-
# 获取 Token
-
kubectl -n kubernetes-dashboard create token dashboard-admin

注意:Token 默认有效期 1 小时,可通过 --duration=24h 延长
2.4 登录web界面验证
由于默认情况下,dashboard是没有开启nodeport对外的,所以需要临时修改端口转发类型
-
# 修改端口类型
-
kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'
-
-
-
# 若需要指定端口,可以指定一个固定的 nodePort,这里修改为30083:
-
kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard --type='json' -p '[{"op":"add","path":"/spec/ports/0/nodePort","value":30083}]'
-
除了上述的命令行修改,还可以通过编辑配置yaml文件的方式来修改。
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard-kong-proxy

打开web浏览器,通过nodeport来访问。输入刚才获取到的token

输入token后可以进入主界面,由于还没有安装监控,所以这里的负载显示为空。但是至此一步,dashboard已经安装完毕

2025,每天10分钟,跟我学K8S(四十二)- Kuboard _kuboard详解-CSDN博客
上一章,学习了k8s中的dashboard的安装,但是由于网络、厂商差异等原因,其实这个使用率并不高,有很多其他厂家的dashboard也做的挺不错,本章推荐一款国产的dashboard----Kuboard 。
Kuboard for Kubernetes
特点介绍
相较于 Kubernetes Dashboard 等其他 Kubernetes 管理界面,Kuboard 的主要特点有:
-
多种认证方式
-
多集群管理
-
微服务分层展示
-
工作负载的直观展示
-
工作负载编辑
-
存储类型支持
-
丰富的互操作性
-
套件扩展
-
告警配置
-
操作审计
具体内容可以参考官网:Kuboard_Kubernetes教程_K8S安装_管理界面
Kuboard的安装
安装 kuboard
目前Kuboard生产环境已经到了V3版本,可以使用docker单独安装,也可以采用pod的方式安装。本文将采用后者。详细步骤可以参考官网:安装 Kuboard v3 - kubernetes | Kuboard
-
# 为了避免kuboard-v3-xxxxx 的容器出现 CrashLoopBackOff 的状态
-
# 给master节点打标
-
kubectl label nodes your-node-name k8s.kuboard.cn/role=etcd
-
-
-
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
-
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
-
-
# kuboard使用了30080端口,可能会与之前设置的longhorn端口冲突,可以修改一下longhorn的端口为其他
-
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
安装完成后显示如下:

访问 Kuboard
-
在浏览器中打开链接
http://your-node-ip-address:30080 -
输入初始用户名和密码,并登录
- 用户名:
admin - 密码:
Kuboard123
- 用户名:

导入集群后,安装metrics-scraper就可以查看资源指标了

选择国内源

开始安装

查看硬件资质监控指标

同时安装了metrics-scraper也可以在命令行查看pod或者node的资源占用

Kuboard 是一款专为 Kubernetes 设计的,强大而免费可视化管理工具,支持多集群管理、资源监控、日志聚合、权限控制等功能。相较于 Kubernetes 官方 Dashboard,Kuboard 提供更直观的界面和更丰富的扩展能力,适用于开发、运维及多团队协作场景。本文只是简单举例了它的安装和操作,更多的用户可以参考官网文档。
2025,每天10分钟,跟我学K8S(四十三)- Prometheus(一)_prometheus版本选择-CSDN博客
前面内容,讲述了很多K8S的知识点,也了解了K8S的基础使用。从本章节开始,我们一起来学习下K8S中的监控系统。作为一名合格的devopser,知道监控是生产环境不可或缺的,我们需要时刻了解系统环境的各种指标,不管是node的指标,还是pod中运行的应用的指标,在他们出现问题时候,能第一时间通过告警的方式通知到我们。
而Prometheus作为和K8S都是云原生计算基金会出品的产品,现在基本是是K8S监控的标配了。从本章开始,我们就一起来学习它。
什么是Prometheus
Prometheus 是一款开源的 时序数据库与监控告警系统,专为云原生和分布式环境设计,其核心功能是通过多维数据模型和灵活的查询语言实现对系统、应用及基础设施的全方位监控。它将所有信息都存储为时间序列数据;因此实现一种Profiling监控方式,实时分析系统运行的状态、执行时间、调用次数等,以找到系统的热点,为性能优化提供依据。
一、核心特性
1.多维数据模型
每个监控指标由 指标名称(Metric Name) 和 标签(Labels) 唯一标识,支持从多维度(如请求方法、状态码、服务实例等)对数据进行分析。例如,http_requests_total{method="GET", status="200"} 可细分统计不同请求的成功率。
2.PromQL 查询语言
提供类似 SQL 的语法,支持复杂的数据聚合、数学运算和实时计算。例如,计算 CPU 使用率:
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
种灵活性使其适用于趋势分析和故障排查。
3.主动拉取(Pull)与推送(Push)结合
- 拉取模式:Prometheus Server 定期从配置的目标(如 Exporter、应用程序端点)主动抓取指标。
- 推送模式:通过 Pushgateway 支持短生命周期任务(如批处理作业)的指标上报。
4.动态服务发现
支持 Kubernetes、Consul 等服务发现机制,自动识别并监控动态变化的服务实例,减少手动配置成本。
5.告警管理
Alertmanager 负责处理告警的去重、分组和路由,支持邮件、Webhook、Slack 等多种通知渠道。
二、核心组件
| 组件 | 功能 | 适用场景 |
|---|---|---|
| Prometheus Server | 核心服务,负责数据采集、存储(TSDB 时序数据库)和查询(PromQL) | 长期运行的监控目标(如服务器、容器) |
| Exporter | 将第三方系统(如 MySQL、Redis)的指标转换为 Prometheus 兼容格式 | 间接监控非原生支持的应用或服务 |
| Pushgateway | 临时存储短生命周期任务的指标数据,供 Server 拉取
|
批处理作业、一次性任务 |
| Alertmanager | 处理告警规则触发后的通知逻辑,支持静默、抑制和路由策略 | 告警分级管理、多级通知渠道整合 |
| Grafana | 可视化工具,提供丰富的仪表盘模板展示 Prometheus 数据 | 数据趋势分析、多维度可视化 |
三、版本选择
目前常用的Prometheus 有3个版本提供选择,Prometheus Operator 、 kube-prometheus、kube-prometheus-stack。其内在核心都是 Prometheus ,由不同的人群在维护。
Prometheus Operator
Prometheus Operator: 在 Kubernetes 上手动一步步搭建,然后管理 Prometheus 集群。该项目的目的是简化和自动化基于 Prometheus 的 Kubernetes 集群监控堆栈的配置。适合定制化方案,但是需要一步步的搭建。
kube-prometheus
基于 Prometheus Operator 的预配置方案,包含 Prometheus、Alertmanager、Grafana、kube-state-metrics 等组件,提供开箱即用的监控规则和仪表盘,并且已经安排了一个名为 prometheus-k8s 的 prometheus,默认带有警报和规则,几乎一键搭建,减少用户的配置,并且带有其他 prometheus 需要的组件,如:
- Grafana
- kube-state-metrics
- prometheus adapter
- node exporter
- ...
kube-prometheus-stack
kube-prometheus的helm版本,由社区维护的 Helm Chart,整合了 kube-prometheus 的功能,并增加兼容性优化和扩展组件(如 Thanos),支持参数化部署和版本管理
四、适用场景
-
云原生与容器监控
与 Kubernetes 深度集成,自动发现 Pod、Service 等资源,监控容器资源使用率(CPU、内存)及微服务性能。 -
微服务架构监控
通过服务发现和标签机制,追踪分布式系统中的请求链路、错误率及延迟。 -
基础设施监控
收集主机(Node Exporter)、网络设备、存储系统的指标,支持容量规划和故障预警。 -
业务指标监控
自定义业务指标(如订单量、用户活跃度),结合 PromQL 实现实时业务分析。
五、优势与局限
-
优势:
- 轻量级:单节点部署,不依赖分布式存储。
- 高扩展性:支持联邦集群(Federation)和远程存储(如 Thanos、Cortex)。
- 社区生态:CNCF 毕业项目,拥有丰富的 Exporter 和集成工具。
-
局限:
- 数据精度:适用于可靠性监控,但不适合需要 100% 准确性的计费场景。
- 长期存储:原生 TSDB 适合短期数据,长期存储需依赖外部方案。
六、典型工作流程示例
- 数据采集:Prometheus Server 定期从 Node Exporter 拉取主机指标。
- 规则评估:根据
alert.rules判断 CPU 使用率是否超阈值。 - 告警触发:触发后 Alertmanager 发送邮件通知运维人员。
- 可视化展示:通过 Grafana 仪表盘实时查看监控趋势。
工作流程图:

前面内容,讲述了很多K8S的知识点,也了解了K8S的基础使用。从本章节开始,我们一起来学习下K8S中的监控系统。作为一名合格的devopser,知道监控是生产环境不可或缺的,我们需要时刻了解系统环境的各种指标,不管是node的指标,还是pod中运行的应用的指标,在他们出现问题时候,能第一时间通过告警的方式通知到我们。
而Prometheus作为和K8S都是云原生计算基金会出品的产品,现在基本是是K8S监控的标配了。从本章开始,我们就一起来学习它。
什么是Prometheus
Prometheus 是一款开源的 时序数据库与监控告警系统,专为云原生和分布式环境设计,其核心功能是通过多维数据模型和灵活的查询语言实现对系统、应用及基础设施的全方位监控。它将所有信息都存储为时间序列数据;因此实现一种Profiling监控方式,实时分析系统运行的状态、执行时间、调用次数等,以找到系统的热点,为性能优化提供依据。
一、核心特性
1.多维数据模型
每个监控指标由 指标名称(Metric Name) 和 标签(Labels) 唯一标识,支持从多维度(如请求方法、状态码、服务实例等)对数据进行分析。例如,http_requests_total{method="GET", status="200"} 可细分统计不同请求的成功率。
2.PromQL 查询语言
提供类似 SQL 的语法,支持复杂的数据聚合、数学运算和实时计算。例如,计算 CPU 使用率:
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
种灵活性使其适用于趋势分析和故障排查。
3.主动拉取(Pull)与推送(Push)结合
- 拉取模式:Prometheus Server 定期从配置的目标(如 Exporter、应用程序端点)主动抓取指标。
- 推送模式:通过 Pushgateway 支持短生命周期任务(如批处理作业)的指标上报。
4.动态服务发现
支持 Kubernetes、Consul 等服务发现机制,自动识别并监控动态变化的服务实例,减少手动配置成本。
5.告警管理
Alertmanager 负责处理告警的去重、分组和路由,支持邮件、Webhook、Slack 等多种通知渠道。
二、核心组件
| 组件 | 功能 | 适用场景 |
|---|---|---|
| Prometheus Server | 核心服务,负责数据采集、存储(TSDB 时序数据库)和查询(PromQL) | 长期运行的监控目标(如服务器、容器) |
| Exporter | 将第三方系统(如 MySQL、Redis)的指标转换为 Prometheus 兼容格式 | 间接监控非原生支持的应用或服务 |
| Pushgateway | 临时存储短生命周期任务的指标数据,供 Server 拉取
|
批处理作业、一次性任务 |
| Alertmanager | 处理告警规则触发后的通知逻辑,支持静默、抑制和路由策略 | 告警分级管理、多级通知渠道整合 |
| Grafana | 可视化工具,提供丰富的仪表盘模板展示 Prometheus 数据 | 数据趋势分析、多维度可视化 |
三、版本选择
目前常用的Prometheus 有3个版本提供选择,Prometheus Operator 、 kube-prometheus、kube-prometheus-stack。其内在核心都是 Prometheus ,由不同的人群在维护。
Prometheus Operator
Prometheus Operator: 在 Kubernetes 上手动一步步搭建,然后管理 Prometheus 集群。该项目的目的是简化和自动化基于 Prometheus 的 Kubernetes 集群监控堆栈的配置。适合定制化方案,但是需要一步步的搭建。
kube-prometheus
基于 Prometheus Operator 的预配置方案,包含 Prometheus、Alertmanager、Grafana、kube-state-metrics 等组件,提供开箱即用的监控规则和仪表盘,并且已经安排了一个名为 prometheus-k8s 的 prometheus,默认带有警报和规则,几乎一键搭建,减少用户的配置,并且带有其他 prometheus 需要的组件,如:
- Grafana
- kube-state-metrics
- prometheus adapter
- node exporter
- ...
kube-prometheus-stack
kube-prometheus的helm版本,由社区维护的 Helm Chart,整合了 kube-prometheus 的功能,并增加兼容性优化和扩展组件(如 Thanos),支持参数化部署和版本管理
四、适用场景
-
云原生与容器监控
与 Kubernetes 深度集成,自动发现 Pod、Service 等资源,监控容器资源使用率(CPU、内存)及微服务性能。 -
微服务架构监控
通过服务发现和标签机制,追踪分布式系统中的请求链路、错误率及延迟。 -
基础设施监控
收集主机(Node Exporter)、网络设备、存储系统的指标,支持容量规划和故障预警。 -
业务指标监控
自定义业务指标(如订单量、用户活跃度),结合 PromQL 实现实时业务分析。
五、优势与局限
-
优势:
- 轻量级:单节点部署,不依赖分布式存储。
- 高扩展性:支持联邦集群(Federation)和远程存储(如 Thanos、Cortex)。
- 社区生态:CNCF 毕业项目,拥有丰富的 Exporter 和集成工具。
-
局限:
- 数据精度:适用于可靠性监控,但不适合需要 100% 准确性的计费场景。
- 长期存储:原生 TSDB 适合短期数据,长期存储需依赖外部方案。
六、典型工作流程示例
- 数据采集:Prometheus Server 定期从 Node Exporter 拉取主机指标。
- 规则评估:根据
alert.rules判断 CPU 使用率是否超阈值。 - 告警触发:触发后 Alertmanager 发送邮件通知运维人员。
- 可视化展示:通过 Grafana 仪表盘实时查看监控趋势。
工作流程图:

2025,每天10分钟,跟我学K8S(四十五)- Prometheus(三)添加系统监控项_prometheus 监控 io-CSDN博客
在上一章节,我们完成了Prometheus的安装,也可以在prometheus的targets管理页面看到了现在已经有一些系统应用指标被监控到了,例如 kube-apiserver,kubelet。但是任然有一些系统应用指标还缺失,例如 kube-scheduler、kube-controller-manager、kube-proxy 这三个系统组件就还没被监控。
如下图所示:

本节内容,我们来一起学习下 Prometheus中系统监控项的添加方式。
配置kube-scheduler监控
1.首先修改 /etc/kubernetes/manifests/kube-scheduler.yaml 文件中的bind IP
-
spec:
-
containers:
-
- command:
-
- kube-scheduler
-
- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
-
- --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
-
- --bind-address=127.0.0.1
-
====修改为====
-
spec:
-
containers:
-
- command:
-
- kube-scheduler
-
- --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
-
- --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
-
- --bind-address=0.0.0.0 #修改这里
2.再来查看一下manifests/kubernetesControlPlane-serviceMonitorKubeScheduler.yaml这个文件,这里给它添加上了注释。
-
apiVersion: monitoring.coreos.com/v1 # 定义 CRD 资源类型为 ServiceMonitor
-
kind: ServiceMonitor
-
metadata:
-
labels:
-
app.kubernetes.io/name: kube-scheduler # 标识监控目标为 kube-scheduler
-
app.kubernetes.io/part-of: kube-prometheus # 标记属于 kube-prometheus 生态
-
name: kube-scheduler # ServiceMonitor 资源名称
-
namespace: monitoring # 部署在 monitoring 命名空间
-
spec:
-
endpoints:
-
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token # 使用 ServiceAccount Token 认证
-
interval: 30s # 抓取间隔 30 秒
-
port: https-metrics # 关联 Service 的端口名称
-
scheme: https # 使用 HTTPS 协议(需配合 TLS 配置)
-
tlsConfig:
-
insecureSkipVerify: true # 跳过 HTTPS 证书验证(生产环境建议配置合法证书)[1](@ref)
-
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
-
interval: 5s # 更高频率的抓取间隔(适用于实时性指标)
-
metricRelabelings:
-
- action: drop # 指标重标记:过滤特定指标
-
regex: process_start_time_seconds # 正则匹配需要丢弃的指标名称
-
sourceLabels:
-
- __name__ # 作用于指标名称字段
-
path: /metrics/slis # 自定义指标路径(服务级别指标)
-
port: https-metrics
-
scheme: https
-
tlsConfig:
-
insecureSkipVerify: true
-
jobLabel: app.kubernetes.io/name # 使用标签值作为 Prometheus Job 名称
-
namespaceSelector:
-
matchNames:
-
- kube-system # 仅在 kube-system 命名空间发现目标服务
-
selector:
-
matchLabels:
-
app.kubernetes.io/name: kube-scheduler # 匹配 Service 的标签选择器
3.发现最后的matchLabels,表名需要选择标签为 app.kubernetes.io/name: kube-scheduler 的 Service,但是通过kubectl get svc -n kube-system 发现并没有这个svc。
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0/manifests# kubectl get svc -n kube-system
-
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 21d
-
kubelet ClusterIP None <none> 10250/TCP,10255/TCP,4194/TCP 24h
-
metrics-server ClusterIP 10.105.177.80 <none> 443/TCP 2d
那我们就创建一个svc,并且绑定对应的标签
-
# kube-scheduler-service.yaml
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: kube-scheduler
-
namespace: kube-system
-
labels:
-
k8s-app: kube-scheduler
-
app.kubernetes.io/name: kube-scheduler
-
spec:
-
clusterIP: None # Headless Service
-
ports:
-
- name: https-metrics
-
port: 10259
-
targetPort: 10259
-
protocol: TCP
-
selector:
-
component: kube-scheduler # 必须与 Pod 的标签匹配
-
-
-
-
-
# 应用这个yaml文件
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0/manifests# kubectl apply -f kube-scheduler-service.yaml
-
service/kube-scheduler created
-
-
-
# 再次查看svc
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0/manifests# kubectl get svc -n kube-system
-
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
-
kube-scheduler ClusterIP None <none> 10259/TCP 67s
-
4.过一会回到页面,即可发现现在已经有了这个监控项

配置kube-controller-manager监控
1.首先修改 /etc/kubernetes/manifests/kube-controller-manager.yaml 的bind IP
-
spec:
-
containers:
-
- command:
-
- kube-controller-manager
-
- --allocate-node-cidrs=true
-
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
-
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
-
- --bind-address=127.0.0.1
-
====修改为====
-
spec:
-
containers:
-
- command:
-
- kube-controller-manager
-
- --allocate-node-cidrs=true
-
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
-
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
-
- --bind-address=0.0.0.0
2.查看kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml 文件最后的标签,这里只看最后的matchLabels 是app.kubernetes.io/name: kube-controller-manager
-
# vim manifests/kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml
-
-
apiVersion: monitoring.coreos.com/v1
-
kind: ServiceMonitor
-
metadata:
-
labels:
-
app.kubernetes.io/name: kube-controller-manager
-
app.kubernetes.io/part-of: kube-prometheus
-
name: kube-controller-manager
-
namespace: monitoring
-
spec:
-
-
....
-
selector:
-
matchLabels:
-
app.kubernetes.io/name: kube-controller-manager
3. 发现最后的matchLabels,表名需要选择标签为 app.kubernetes.io/name: kube-controller-manager 的 Service,但是通过kubectl get svc -n kube-system 发现并没有这个svc。这里直接创建一个对应的svc yaml文件,需要对应标签为 app.kubernetes.io/name: kube-controller-manager,并且指定了endpoint
-
# kube-controller-manager-service.yaml
-
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: kube-controller-manager
-
namespace: kube-system
-
labels:
-
app.kubernetes.io/name: kube-controller-manager # 必须与 ServiceMonitor 的标签匹配
-
spec:
-
clusterIP: None
-
ports:
-
- name: https-metrics
-
port: 10257
-
targetPort: 10257
-
protocol: TCP
-
selector:
-
component: kube-controller-manager
-
---
-
apiVersion: v1
-
kind: Endpoints
-
metadata:
-
name: kube-controller-manager
-
namespace: kube-system
-
subsets:
-
- addresses:
-
- ip: 172.21.176.3 # 替换为 Controller Manager 实际 IP
-
ports:
-
- name: https-metrics
-
port: 10257
-
4.过一会回到页面,即可发现现在已经有了这个监控项

配置kube-proxy
其实在有了上面2个例子,我们就已经弄明白了,系统服务的监控总共分3个步骤
- 修改配置文件监听的端口
- 查看或创建ServiceMonitor 文件,用于 Prometheus 添加监控项
- 查看或创建Service和endpoint文件,对象可以正确获取到 metrics 数据
有了这个共识,继续来监控kube-proxy。
1.修改配置文件监听端口
kube-proxy是以pod的形式运行的,并没有单独的配置文件
使用命令 kubectl -n kube-system get configmap kube-proxy -o yaml | grep metricsBindAddress获取端口,确保输出为 metricsBindAddress: "0.0.0.0:10249",若127.0.0.1 或 空 需修改 ConfigMap
-
kubectl -n kube-system get configmap kube-proxy -o yaml | grep metricsBindAddress
-
-
# 使用edit 来修改
-
kubectl -n kube-system edit configmap kube-proxy
-
-
metricsBindAddress: ""
-
====修改为====
-
metricsBindAddress: "0.0.0.0:10249"
-
-
-
#重启kube-proxy
-
kubectl -n kube-system rollout restart daemonset/kube-proxy
2. 创建ServiceMonitor 文件
说明:无需 TLS 配置,因 kube-proxy 默认使用 HTTP 协议
-
# vim manifests/kubernetesControlPlane-serviceMonitorKube-Proxy.yaml
-
-
apiVersion: monitoring.coreos.com/v1
-
kind: ServiceMonitor
-
metadata:
-
name: kube-proxy
-
namespace: monitoring
-
spec:
-
endpoints:
-
- interval: 30s
-
port: http-metrics # 与 Service 端口名称一致
-
scheme: http # 协议为 HTTP
-
selector:
-
matchLabels:
-
k8s-app: kube-proxy
-
namespaceSelector:
-
matchNames: [kube-system]
3.创建Service文件
-
# vim manifests/kube-proxy-service.yaml
-
-
apiVersion: monitoring.coreos.com/v1
-
kind: ServiceMonitor
-
metadata:
-
name: kube-proxy
-
namespace: monitoring
-
spec:
-
endpoints:
-
- interval: 30s
-
port: http-metrics # 与 Service 端口名称一致
-
scheme: http # 协议为 HTTP
-
selector:
-
matchLabels:
-
k8s-app: kube-proxy
-
namespaceSelector:
-
matchNames: [kube-system]
-
---
-
apiVersion: v1
-
kind: Endpoints
-
metadata:
-
name: kube-proxy
-
namespace: kube-system
-
subsets:
-
- addresses:
-
- ip: 172.21.176.3 # 替换为实际节点 IP
-
ports:
-
- name: http-metrics
-
port: 10249
4.应用并查看
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl apply -f manifests/kubernetesControlPlane-serviceMonitorKube-Proxy.yaml
-
servicemonitor.monitoring.coreos.com/kube-proxy created
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl apply -f manifests/kube-proxy-service.yaml
-
service/kube-proxy created
-

2025,每天10分钟,跟我学K8S(四十六)- Prometheus(三)添加自定义监控项_prometheus自定义监控项-CSDN博客
上一章,我们学习了Prometheus添加系统监控项,那如何添加自定义监控项呢?例如etcd或者其他自己运行的pod?
这一章节就来讲解这个问题。
Prometheus监控ETCD
1.编辑监听端口
这里由于是kubeadm创建的,所以默认监听了本地内网IP,这里不做修改

2.创建Service 和 Endpoints
-
# vim manifests/etcd-Service.yaml
-
-
# Service 定义
-
apiVersion: v1
-
kind: Service
-
metadata:
-
name: etcd
-
namespace: kube-system
-
labels:
-
k8s-app: etcd
-
spec:
-
clusterIP: None # Headless Service
-
ports:
-
- name: https-metrics
-
port: 2379
-
protocol: TCP # 协议类型需与 Endpoints 一致
-
-
---
-
# Endpoints 定义
-
apiVersion: v1
-
kind: Endpoints
-
metadata:
-
name: etcd
-
namespace: kube-system
-
subsets: # 直接定义 subsets,无需嵌套在 spec 下
-
- addresses:
-
- ip: 172.21.176.3 # 替换为实际 ETCD 节点 IP 有几台就写几个
-
ports:
-
- name: https-metrics # 端口名称需与 Service 一致
-
port: 2379
-
protocol: TCP # 必须明确协议类型
3.创建ServiceMonitor
etcd默认是有证书的,所以需要提前将etcd的证书创建成secret,并且挂载到prometheus的pod中去。
3.1 证书挂载
创建包含 ETCD 证书的 Secret,供 Prometheus 使用
-
kubectl -n monitoring create secret generic etcd-certs \
-
--from-file=/etc/kubernetes/pki/etcd/ca.crt \
-
--from-file=/etc/kubernetes/pki/etcd/server.crt \
-
--from-file=/etc/kubernetes/pki/etcd/server.key
更新 Prometheus 新增配置以挂载证书:
-
# 修改 manifests/prometheus-prometheus.yaml
-
spec:
-
secrets:
-
- etcd-certs
-
-
-
# 应用
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl apply -f /opt/prometheus/kube-prometheus/manifests/prometheus-prometheus.yaml
-
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
-
prometheus.monitoring.coreos.com/k8s configured
-
-
更新完毕后,我们就可以在Prometheus Pod中查看到对象的目录,这一步需要的时间比较长,需要等待一会才会复制进去
-
root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl exec -it -n monitoring prometheus-k8s-0 -- /bin/sh
-
/prometheus $
-
/prometheus $ ls /etc/prometheus/secrets/etcd-certs/
-
ca.crt server.crt server.key
3.2 ServiceMonitor 配置
定义 HTTPS 抓取规则,引用证书路径
-
# vim manifests/etcd-ServiceMonitor.yaml
-
-
apiVersion: monitoring.coreos.com/v1
-
kind: ServiceMonitor
-
metadata:
-
name: etcd
-
namespace: monitoring
-
spec:
-
endpoints:
-
- interval: 30s
-
port: https-metrics
-
scheme: https
-
tlsConfig:
-
caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
-
certFile: /etc/prometheus/secrets/etcd-certs/server.crt
-
keyFile: /etc/prometheus/secrets/etcd-certs/server.key
-
selector:
-
matchLabels:
-
k8s-app: etcd
-
namespaceSelector:
-
matchNames: [kube-system]
4.应用yaml文件
-
kubectl apply -f manifests/etcd-Service.yaml
-
service/etcd created
-
-
-
kubectl apply -f manifests/etcd-ServiceMonitor.yaml
-
servicemonitor.monitoring.coreos.com/etcd created

5.配置报警规则
上面etcd的监控项已经出现了,但是只监控,不设置预警显然是不合理的。
创建 manifests/etcd-serviceMonitorRule.yaml 预警规则
这里参考:https://github.com/samber/awesome-prometheus-alerts, 这里有各种应用的监控报警规则。
-
# vim manifests/etcd-serviceMonitorRule.yaml
-
-
apiVersion: monitoring.coreos.com/v1
-
kind: PrometheusRule
-
metadata:
-
labels:
-
prometheus: k8s
-
role: alert-rules
-
name: prometheus-k8s-etcd-rules
-
namespace: monitoring
-
spec:
-
groups:
-
- name: etcd
-
rules:
-
- alert: EtcdInsufficientMembers
-
expr: count(etcd_server_id) % 2 == 0
-
for: 5m
-
labels:
-
severity: critical
-
annotations:
-
summary: "Etcd insufficient Members (instance {{ $labels.instance }})"
-
description: "Etcd cluster should have an odd number of members\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdNoLeader
-
expr: etcd_server_has_leader == 0
-
for: 5m
-
labels:
-
severity: critical
-
annotations:
-
summary: "Etcd no Leader (instance {{ $labels.instance }})"
-
description: "Etcd cluster have no leader\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighNumberOfLeaderChanges
-
expr: increase(etcd_server_leader_changes_seen_total[1h]) > 3
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd high number of leader changes (instance {{ $labels.instance }})"
-
description: "Etcd leader changed more than 3 times during last hour\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighNumberOfFailedGrpcRequests
-
expr: sum(rate(grpc_server_handled_total{grpc_code!="OK",grpc_method !="Watch"}[5m])) BY (grpc_service, grpc_method) / sum(rate(grpc_server_handled_total[5m])) BY (grpc_service, grpc_method) > 0.01
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd high number of failed GRPC requests (instance {{ $labels.instance }})"
-
description: "More than 1% GRPC request failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighNumberOfFailedGrpcRequests
-
expr: sum(rate(grpc_server_handled_total{grpc_code!="OK",grpc_method !="Watch"}[5m])) BY (grpc_service, grpc_method) / sum(rate(grpc_server_handled_total[5m])) BY (grpc_service, grpc_method) > 0.05
-
for: 5m
-
labels:
-
severity: critical
-
annotations:
-
summary: "Etcd high number of failed GRPC requests (instance {{ $labels.instance }})"
-
description: "More than 5% GRPC request failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdGrpcRequestsSlow
-
expr: histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{grpc_type="unary"}[5m])) by (grpc_service, grpc_method, le)) > 0.15
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd GRPC requests slow (instance {{ $labels.instance }})"
-
description: "GRPC requests slowing down, 99th percentil is over 0.15s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
-
- alert: EtcdHighNumberOfFailedHttpRequests
-
expr: sum(rate(etcd_http_failed_total[5m])) BY (method) / sum(rate(etcd_http_received_total[5m])) BY (method) > 0.01
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd high number of failed HTTP requests (instance {{ $labels.instance }})"
-
description: "More than 1% HTTP failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighNumberOfFailedHttpRequests
-
expr: sum(rate(etcd_http_failed_total[5m])) BY (method) / sum(rate(etcd_http_received_total[5m])) BY (method) > 0.05
-
for: 5m
-
labels:
-
severity: critical
-
annotations:
-
summary: "Etcd high number of failed HTTP requests (instance {{ $labels.instance }})"
-
description: "More than 5% HTTP failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHttpRequestsSlow
-
expr: histogram_quantile(0.99, rate(etcd_http_successful_duration_seconds_bucket[5m])) > 0.15
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd HTTP requests slow (instance {{ $labels.instance }})"
-
description: "HTTP requests slowing down, 99th percentil is over 0.15s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdMemberCommunicationSlow
-
expr: histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket[5m])) > 0.15
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd member communication slow (instance {{ $labels.instance }})"
-
description: "Etcd member communication slowing down, 99th percentil is over 0.15s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighNumberOfFailedProposals
-
expr: increase(etcd_server_proposals_failed_total[1h]) > 5
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd high number of failed proposals (instance {{ $labels.instance }})"
-
description: "Etcd server got more than 5 failed proposals past hour\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighFsyncDurations
-
expr: histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) > 0.5
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd high fsync durations (instance {{ $labels.instance }})"
-
description: "Etcd WAL fsync duration increasing, 99th percentil is over 0.5s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
- alert: EtcdHighCommitDurations
-
expr: histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) > 0.25
-
for: 5m
-
labels:
-
severity: warning
-
annotations:
-
summary: "Etcd high commit durations (instance {{ $labels.instance }})"
-
description: "Etcd commit duration increasing, 99th percentil is over 0.25s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
-
-
#apply 应用
-
kubectl apply -f manifests/etcd-serviceMonitorRule.yaml
-
prometheusrule.monitoring.coreos.com/prometheus-k8s-etcd-rules created
web页面点击alerts 查看刚才配置的报警规则是否生效

6.通过grafana查看图表
Grafana 是一款开源的数据可视化与监控平台,支持 30+ 数据源(如 Prometheus、InfluxDB、MySQL、Elasticsearch 等),可动态展示实时数据并生成交互式仪表盘。最重要的是,导入数据源后,网上有很多大神做好的模板可以开箱即用。下面的etcd就直接采用网上的模板直接拿来用。
6.1选择 构建一个新的表盘

6.2导入表盘

6.3 个人监控etcd喜欢用3070这个别人做好的表盘,点击右侧导入

6.4取名后导入

6.5查看数据

至此,一个完整的ETCD的监控预警就完成了。我们来梳理一下流程
1.创建对应的 service和endpoint
2.创建对应的 ServiceMonitor 对象来进行监控
3.创建对应的rule规则来进行设置阈值,这个可以去上面给的github地址里面搜索,常见的基本都有
4.设置grafana的图表,这个可以参考网上的模板
看起来真麻烦,如果我有几百个pod,不是要创建几百个ServiceMonitor 对象来进行监控?有没有简单的方法?甚至能不能让他做到通过一些规则自动来监控?下一章节我们一起来学习prometheus的自动发现规则。

https://github.com/kubernetes/dashboard/releases/download/kubernetes-dashboard-7.11.1/kubernetes-dashboard-7.11.1.tgz






















浙公网安备 33010602011771号