2025,每天10分钟,跟我学K8S(四十一)- Dashboard

2025,每天10分钟,跟我学K8S(四十一)- Dashboard_kubernetes dashboard-CSDN博客

什么是Kubernetes Dashboard?

        Kubernetes Dashboard 是 Kubernetes 官方提供的可视化 Web 界面,用于简化集群资源管理和监控操作。简单来说,就是我们之前的所有操作,都是通过 kubectl 命令来完成的,为了简便操作,官方提供了一个web控制台,很多操作可以通过控制台来完成。例如通过 Dashboard 部署容器化的应用、监控应用的状态、执行故障排查任务以及管理 Kubernetes 各种资源。

 

一、核心功能与适用场景

  1. 核心功能

    • 资源管理:支持 Pod、Deployment、Service 等资源的创建、删除、更新及弹性伸缩操作。
    • 监控与排障:实时查看资源状态、容器日志及事件告警,支持 Pod 终端访问。
    • 配置管理:通过 YAML 文件或表单直接修改资源配置,支持批量操作。
    • 权限控制:集成 RBAC 机制,可精细化控制用户操作权限。
  2. 适用场景

    • 开发测试:快速验证资源配置,避免频繁使用 kubectl 命令。
    • 运维监控:集中查看集群健康状态,定位资源瓶颈。
    • 多租户管理:通过命名空间隔离不同团队资源,降低误操作风险。

二、安装演示

        目前官方Dashboard 版本为kubernetes-dashboard-7.11.1,而从7版本开始,官方已经只支持helm的方式安装。所以本文也采用helm方式安装。

2.1 添加仓库并安装

官方演示操作为下面步骤

 
  1.  
    # 添加 Helm 仓库并部署
  2.  
    helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
  3.  
     
  4.  
    helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
 

但是由于国内网络问题,可能无法添加官方源,只能去github上将软件包下载到本地

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

 
  1.  
    # 下载
  2.  
    root@k8s-master:~/dashboard# wget https://github.com/kubernetes/dashboard/releases/download/kubernetes-dashboard-7.11.1/kubernetes-dashboard-7.11.1.tgz
  3.  
     
  4.  
    # 解压
  5.  
    root@k8s-master:~/dashboard# tar zxvf kubernetes-dashboard-7.11.1.tgz
  6.  
    kubernetes-dashboard/Chart.yaml
  7.  
     
  8.  
    # 查看目录结构
  9.  
    root@k8s-master:~/dashboard# tree
  10.  
    .
  11.  
    ├── kubernetes-dashboard
  12.  
    │   ├── Chart.lock
  13.  
    │   ├── charts
  14.  
    │   │   ├── cert-manager
  15.  
    │   │   │   ├── Chart.yaml
  16.  
    │   │   │   ├── README.md
  17.  
    ......
 

2.2 修改镜像地址

 
  1.  
    vim kubernetes-dashboard/values.yaml
  2.  
     
  3.  
    repository: docker.io/kubernetesui/dashboard-auth
  4.  
    repository: docker.io/kubernetesui/dashboard-web
  5.  
    repository: docker.io/kubernetesui/dashboard-metrics-scraper
  6.  
    repository: docker.io/kubernetesui/dashboard-api
  7.  
    ====修改为====
  8.  
    repository: m.daocloud.io/docker.io/kubernetesui/dashboard-auth
  9.  
    repository: m.daocloud.io/docker.io/kubernetesui/dashboard-web
  10.  
    repository: m.daocloud.io/docker.io/kubernetesui/dashboard-metrics-scraper
  11.  
    repository: m.daocloud.io/docker.io/kubernetesui/dashboard-api
  12.  
     
  13.  
     
  14.  
     
  15.  
     
  16.  
    vim kubernetes-dashboard/charts/kong/values.yaml
  17.  
    repository: kong
  18.  
    ====修改为====
  19.  
    repository: m.daocloud.io/docker.io/kong
  20.  
     
  21.  
     
  22.  
     
  23.  
     
  24.  
     
  25.  
    # 安装
  26.  
    root@k8s-master:~/dashboard# helm upgrade --install kubernetes-dashboard kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
  27.  
    Release "kubernetes-dashboard" does not exist. Installing it now.
  28.  
    .....
  29.  
    Dashboard will be available at:
  30.  
    https://localhost:8443
  31.  
     
  32.  
     
  33.  
    # 等待所有pod运行正常后,查看svc和pod状态
  34.  
    root@k8s-master:~/dashboard# kubectl get pod -n kubernetes-dashboard
  35.  
    NAME READY STATUS RESTARTS AGE
  36.  
    kubernetes-dashboard-api-7744c84465-z76gq 1/1 Running 0 2m28s
  37.  
    kubernetes-dashboard-auth-5ff6f5889b-74r28 1/1 Running 0 2m28s
  38.  
    kubernetes-dashboard-kong-75dd496684-gf62v 1/1 Running 0 2m28s
  39.  
    kubernetes-dashboard-metrics-scraper-9b9f5c9d5-sgh7j 1/1 Running 0 2m28s
  40.  
    kubernetes-dashboard-web-6c8f4d7666-jskjg 1/1 Running 0 2m28s
  41.  
    root@k8s-master:~/dashboard#
  42.  
    root@k8s-master:~/dashboard# kubectl get svc -n kubernetes-dashboard
  43.  
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  44.  
    kubernetes-dashboard-api ClusterIP 10.102.121.61 <none> 8000/TCP 2m36s
  45.  
    kubernetes-dashboard-auth ClusterIP 10.103.103.175 <none> 8000/TCP 2m36s
  46.  
    kubernetes-dashboard-kong-proxy ClusterIP 10.99.183.86 <none> 443/TCP 2m36s
  47.  
    kubernetes-dashboard-metrics-scraper ClusterIP 10.101.165.125 <none> 8000/TCP 2m36s
  48.  
    kubernetes-dashboard-web NodePort 10.99.103.97 <none> 8000:32528/TCP 2m36s
  49.  
     
 

2.3 创建用户和token

 
  1.  
    # 创建管理员账户
  2.  
    kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
  3.  
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
  4.  
    # 获取 Token
  5.  
    kubectl -n kubernetes-dashboard create token dashboard-admin
 

注意​​:Token 默认有效期 1 小时,可通过 --duration=24h 延长

2.4 登录web界面验证

        由于默认情况下,dashboard是没有开启nodeport对外的,所以需要临时修改端口转发类型

 
  1.  
    # 修改端口类型
  2.  
    kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"}]'
  3.  
     
  4.  
     
  5.  
    # 若需要指定端口,可以指定一个固定的 nodePort,这里修改为30083
  6.  
    kubectl patch svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard --type='json' -p '[{"op":"add","path":"/spec/ports/0/nodePort","value":30083}]'
  7.  
     
 

除了上述的命令行修改,还可以通过编辑配置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

        

 
  1.  
    # 为了避免kuboard-v3-xxxxx 的容器出现 CrashLoopBackOff 的状态
  2.  
    # 给master节点打标
  3.  
    kubectl label nodes your-node-name k8s.kuboard.cn/role=etcd
  4.  
     
  5.  
     
  6.  
    kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
  7.  
    # 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
  8.  
     
  9.  
    # kuboard使用了30080端口,可能会与之前设置的longhorn端口冲突,可以修改一下longhorn的端口为其他
  10.  
    # 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),支持参数化部署和版本管理

 

 

四、适用场景

  1. ​云原生与容器监控​
    与 Kubernetes 深度集成,自动发现 Pod、Service 等资源,监控容器资源使用率(CPU、内存)及微服务性能。

  2. ​微服务架构监控​
    通过服务发现和标签机制,追踪分布式系统中的请求链路、错误率及延迟。

  3. ​基础设施监控​
    收集主机(Node Exporter)、网络设备、存储系统的指标,支持容量规划和故障预警。

  4. ​业务指标监控​
    自定义业务指标(如订单量、用户活跃度),结合 PromQL 实现实时业务分析。

五、优势与局限

  • ​优势​​:

    • ​轻量级​​:单节点部署,不依赖分布式存储。
    • ​高扩展性​​:支持联邦集群(Federation)和远程存储(如 Thanos、Cortex)。
    • ​社区生态​​:CNCF 毕业项目,拥有丰富的 Exporter 和集成工具。
  • ​局限​​:

    • ​数据精度​​:适用于可靠性监控,但不适合需要 100% 准确性的计费场景。
    • ​长期存储​​:原生 TSDB 适合短期数据,长期存储需依赖外部方案。

六、典型工作流程示例

  1. ​数据采集​​:Prometheus Server 定期从 Node Exporter 拉取主机指标。
  2. ​规则评估​​:根据 alert.rules 判断 CPU 使用率是否超阈值。
  3. ​告警触发​​:触发后 Alertmanager 发送邮件通知运维人员。
  4. ​可视化展示​​:通过 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),支持参数化部署和版本管理

 

 

四、适用场景

  1. ​云原生与容器监控​
    与 Kubernetes 深度集成,自动发现 Pod、Service 等资源,监控容器资源使用率(CPU、内存)及微服务性能。

  2. ​微服务架构监控​
    通过服务发现和标签机制,追踪分布式系统中的请求链路、错误率及延迟。

  3. ​基础设施监控​
    收集主机(Node Exporter)、网络设备、存储系统的指标,支持容量规划和故障预警。

  4. ​业务指标监控​
    自定义业务指标(如订单量、用户活跃度),结合 PromQL 实现实时业务分析。

五、优势与局限

  • ​优势​​:

    • ​轻量级​​:单节点部署,不依赖分布式存储。
    • ​高扩展性​​:支持联邦集群(Federation)和远程存储(如 Thanos、Cortex)。
    • ​社区生态​​:CNCF 毕业项目,拥有丰富的 Exporter 和集成工具。
  • ​局限​​:

    • ​数据精度​​:适用于可靠性监控,但不适合需要 100% 准确性的计费场景。
    • ​长期存储​​:原生 TSDB 适合短期数据,长期存储需依赖外部方案。

六、典型工作流程示例

  1. ​数据采集​​:Prometheus Server 定期从 Node Exporter 拉取主机指标。
  2. ​规则评估​​:根据 alert.rules 判断 CPU 使用率是否超阈值。
  3. ​告警触发​​:触发后 Alertmanager 发送邮件通知运维人员。
  4. ​可视化展示​​:通过 Grafana 仪表盘实时查看监控趋势。

工作流程图:

 

        在上一章内容,我们了解了Prometheus 的基础知识点,这一章开始,开始正式学习Prometheus 的安装搭建。

        考虑到并不是所有环境都有安装helm,所以安装的版本就选择kube-prometheus。

Kube-Prometheus 是基于 Operator 的标准化监控堆栈,适合快速部署。

 

 

Kube-Prometheus版本的选择

github上得知,目前kube-prometheus最新版为0.14,并且只支持到K8S1.31

kube-prometheus stack Kubernetes 1.23 Kubernetes 1.24 Kubernetes 1.25 Kubernetes 1.26 Kubernetes 1.27 Kubernetes 1.28 Kubernetes 1.29 Kubernetes 1.30 Kubernetes 1.31
release-0.11 x x x x x x
release-0.12 x x x x x x
release-0.13 x x x x
release-0.14 x
main x x

Kube-Prometheus安装教程

1.下载软件

 
  1.  
    root@k8s-master:~# mkdir -vp prometheus
  2.  
    root@k8s-master:~# cd prometheus
  3.  
    root@k8s-master:~/prometheus# wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/tags/v0.14.0.zip
  4.  
     
  5.  
    root@k8s-master:~/prometheus# unzip v0.14.0.zip
  6.  
    root@k8s-master:~/prometheus# cd kube-prometheus-0.14.0/
  7.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0# tree
  8.  
    .
  9.  
    ├── build.sh
  10.  
    ├── CHANGELOG.md
  11.  
    ├── code-of-conduct.md
  12.  
    ├── CONTRIBUTING.md
  13.  
     
  14.  
    .....
  15.  
     
  16.  
     
  17.  
     
 
bash

2.镜像替换

 

 
  1.  
    manifests/blackboxExporter-deployment.yaml: image: quay.io/prometheus/blackbox-exporter:v0.25.0
  2.  
    manifests/blackboxExporter-deployment.yaml: image: ghcr.io/jimmidyson/configmap-reload:v0.13.1
  3.  
    manifests/blackboxExporter-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
  4.  
    manifests/nodeExporter-daemonset.yaml: image: quay.io/prometheus/node-exporter:v1.8.2
  5.  
    manifests/nodeExporter-daemonset.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
  6.  
    manifests/alertmanager-alertmanager.yaml: image: quay.io/prometheus/alertmanager:v0.27.0
  7.  
    manifests/prometheusOperator-deployment.yaml: image: quay.io/prometheus-operator/prometheus-operator:v0.76.2
  8.  
    manifests/prometheusOperator-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
  9.  
    manifests/kubeStateMetrics-deployment.yaml: image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0
  10.  
    manifests/kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
  11.  
    manifests/kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
  12.  
    manifests/prometheus-prometheus.yaml: image: quay.io/prometheus/prometheus:v2.54.1
  13.  
    manifests/grafana-deployment.yaml: image: grafana/grafana:11.2.0
  14.  
    manifests/prometheusAdapter-deployment.yaml: image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0
  15.  
     
  16.  
    ====修改为====
  17.  
    manifests/blackboxExporter-deployment.yaml: image: quay.m.daocloud.io/prometheus/blackbox-exporter:v0.25.0
  18.  
    manifests/blackboxExporter-deployment.yaml: image: ghcr.m.daocloud.io/jimmidyson/configmap-reload:v0.13.1
  19.  
    manifests/blackboxExporter-deployment.yaml: image: quay.m.daocloud.io/brancz/kube-rbac-proxy:v0.18.1
  20.  
    manifests/nodeExporter-daemonset.yaml: image: quay.m.daocloud.io/prometheus/node-exporter:v1.8.2
  21.  
    manifests/nodeExporter-daemonset.yaml: image: quay.m.daocloud.io/brancz/kube-rbac-proxy:v0.18.1
  22.  
    manifests/alertmanager-alertmanager.yaml: image: quay.m.daocloud.io/prometheus/alertmanager:v0.27.0
  23.  
    manifests/prometheusOperator-deployment.yaml: image: quay.m.daocloud.io/prometheus-operator/prometheus-operator:v0.76.2
  24.  
    manifests/prometheusOperator-deployment.yaml: image: quay.m.daocloud.io/brancz/kube-rbac-proxy:v0.18.1
  25.  
    manifests/kubeStateMetrics-deployment.yaml: image: k8s.m.daocloud.io/kube-state-metrics/kube-state-metrics:v2.13.0
  26.  
    manifests/kubeStateMetrics-deployment.yaml: image: quay.m.daocloud.io/brancz/kube-rbac-proxy:v0.18.1
  27.  
    manifests/kubeStateMetrics-deployment.yaml: image: quay.m.daocloud.io/brancz/kube-rbac-proxy:v0.18.1
  28.  
    manifests/prometheus-prometheus.yaml: image: quay.m.daocloud.io/prometheus/prometheus:v2.54.1
  29.  
    manifests/grafana-deployment.yaml: image: m.daocloud.io/docker.io/grafana/grafana:11.2.0
  30.  
    manifests/prometheusAdapter-deployment.yaml: image: k8s.m.daocloud.io/prometheus-adapter/prometheus-adapter:v0.12.0
 
bash

3 Prometheus持久化准备

        由于默认情况下prometheus的数据是存储在pod里面,当pod重启后,数据就丢失了,这不利于我们分析长期数据,所以需要将数据存储到之前搭建的longhorn中。

3.1 编辑manifests/prometheus-prometheus.yaml

新增如下内容:

 
  1.  
    vim manifests/prometheus-prometheus.yaml
  2.  
    # --持久化保存时间---
  3.  
    retention: 3d # 具体时间根据需求而来,默认1天
  4.  
    #-----storage-----
  5.  
    storage: #这部分为持久化配置
  6.  
    volumeClaimTemplate:
  7.  
    spec:
  8.  
    #storageClassName: prometheus-data-db
  9.  
    storageClassName: longhorn
  10.  
    accessModes: ["ReadWriteOnce"]
  11.  
    resources:
  12.  
    requests:
  13.  
    storage: 10Gi # 存储硬盘大小按照需求来,存储时间场,就调整大点
  14.  
    #-----------------
 
bash

 

红色方框内为新增内容

3.2 grafana持久化准备

        如果Grafana不做数据持久化、那么服务重启以后,Grafana里面配置的Dashboard、账号密码等信息将会丢失;所以Grafana做数据持久化也是很有必要的。原始的数据是以 emptyDir 形式存放在pod里面,生命周期与pod相同;出现问题时,容器重启,在Grafana里面设置的数据就全部消失了。

a.创建manifests/grafana-pvc.yaml

 
  1.  
    manifests/grafana-pvc.yaml
  2.  
    apiVersion: v1
  3.  
    kind: PersistentVolumeClaim
  4.  
    metadata:
  5.  
    name: grafana-pvc
  6.  
    namespace: monitoring
  7.  
    spec:
  8.  
    accessModes:
  9.  
    - ReadWriteOnce
  10.  
    resources:
  11.  
    requests:
  12.  
    storage: 20Gi
  13.  
    storageClassName: longhorn
 
bash

 

b.修改deployment.yaml文件

vim manifests/grafana-deployment.yaml

 
  1.  
    volumes:
  2.  
    - name: grafana-storage
  3.  
    persistentVolumeClaim:
  4.  
    claimName: grafana-pvc
  5.  
    #- emptyDir: {}
  6.  
    # name: grafana-storage
 
bash

修改如下 

 

3.3 暴露prometheus和grafana的端口

grafana 和 prometheus 默认都创建了一个类型为 ClusterIP 的 Service,我们需要暴露端口,以便外部访问,有多种方式选择:

  • ingress方式
  • NodePort .

此处我们通过NodePort方式实现

3.3.1  修改prometheus 的service文件

 
  1.  
    vim manifests/prometheus-service.yaml
  2.  
     
  3.  
    type: NodePort
  4.  
    ports:
  5.  
    - name: web
  6.  
    port: 9090
  7.  
    targetPort: web
  8.  
    nodePort: 32090
  9.  
    - name: reloader-web
  10.  
    port: 8080
  11.  
    targetPort: reloader-web
  12.  
    nodePort: 32080
 
bash

 修改如下:

 

3.3.2 修改grafana的service文件

 
  1.  
    vim manifests/grafana-service.yaml
  2.  
     
  3.  
    type: NodePort
  4.  
    ports:
  5.  
    - name: http
  6.  
    port: 3000
  7.  
    targetPort: http
  8.  
    nodePort: 32000
  9.  
    type: NodePort
 
bash

 修改如下:

4. 安装部署

这里我们直接依次执行下面的命令即可完成安装:

 
  1.  
    # kubectl create -f manifests/setup
  2.  
    # kubectl create -f manifests
 
bash

 

5. 检查

部署完成后,会创建一个名为monitoring的 namespace,所以资源对象对将部署在改命名空间下面,此外 Operator 会自动创建6个 CRD 资源对象

# kubectl get ns monitoring # kubectl get crd
bash

 

我们可以在 monitoring 命名空间下面查看所有的 Pod和SVC资源,其中 alertmanager 和 prometheus 是用 StatefulSet 控制器管理的,其中还有一个比较核心的 prometheus-operator 的 Pod,用来控制其他资源对象和监听对象变化的。

 
  1.  
    kubectl get pod -n monitoring -o wide
  2.  
    kubectl get svc -n monitoring -o wide
 
bash

 查看pod:

 查看svc:

虽然pod和svc已经全部启动成功,但现在还无法访问grafan、prometheus以及alertmanger,因为prometheus operator内部默认配置了NetworkPolicy,需要删除其对应的资源,才可以通过外网访问:

 
  1.  
    kubectl delete -f manifests/prometheus-networkPolicy.yaml
  2.  
    kubectl delete -f manifests/grafana-networkPolicy.yaml
  3.  
    kubectl delete -f manifests/alertmanager-networkPolicy.yaml
 
bash

 

页面检查

grafana界面:

默认密码 admin/admin,输入密码后会提示让用户重新设置一个管理员密码。重复输入2次即可。

但是需要注意的是,由于此时是通过nodeport的形式对外,所以任何人都可以访问这个地址,请设置相关的安全策略保证数据的安全,也包括其他的web页面。

 

Prometheus界面:

 

 

6.其他补充

默认grafana的时区不是北京时间,所以也需要调整后重新apply

修正grafana组件自带dashboard的默认时区

 
  1.  
    grep -i timezone manifests/grafana-dashboardDefinitions.yaml
  2.  
    sed -i 's/UTC/UTC+8/g' manifests/grafana-dashboardDefinitions.yaml
  3.  
    sed -i 's/utc/utc+8/g' manifests/grafana-dashboardDefinitions.yaml
  4.  
    kubectl apply -f manifests/grafana-dashboardDefinitions.yaml
 

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

 
  1.  
    spec:
  2.  
    containers:
  3.  
    - command:
  4.  
    - kube-scheduler
  5.  
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
  6.  
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
  7.  
    - --bind-address=127.0.0.1
  8.  
    ====修改为====
  9.  
    spec:
  10.  
    containers:
  11.  
    - command:
  12.  
    - kube-scheduler
  13.  
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
  14.  
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
  15.  
    - --bind-address=0.0.0.0 #修改这里
 
bash

2.再来查看一下manifests/kubernetesControlPlane-serviceMonitorKubeScheduler.yaml这个文件,这里给它添加上了注释。

 
  1.  
    apiVersion: monitoring.coreos.com/v1 # 定义 CRD 资源类型为 ServiceMonitor
  2.  
    kind: ServiceMonitor
  3.  
    metadata:
  4.  
    labels:
  5.  
    app.kubernetes.io/name: kube-scheduler # 标识监控目标为 kube-scheduler
  6.  
    app.kubernetes.io/part-of: kube-prometheus # 标记属于 kube-prometheus 生态
  7.  
    name: kube-scheduler # ServiceMonitor 资源名称
  8.  
    namespace: monitoring # 部署在 monitoring 命名空间
  9.  
    spec:
  10.  
    endpoints:
  11.  
    - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token # 使用 ServiceAccount Token 认证
  12.  
    interval: 30s # 抓取间隔 30 秒
  13.  
    port: https-metrics # 关联 Service 的端口名称
  14.  
    scheme: https # 使用 HTTPS 协议(需配合 TLS 配置)
  15.  
    tlsConfig:
  16.  
    insecureSkipVerify: true # 跳过 HTTPS 证书验证(生产环境建议配置合法证书)[1](@ref)
  17.  
    - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
  18.  
    interval: 5s # 更高频率的抓取间隔(适用于实时性指标)
  19.  
    metricRelabelings:
  20.  
    - action: drop # 指标重标记:过滤特定指标
  21.  
    regex: process_start_time_seconds # 正则匹配需要丢弃的指标名称
  22.  
    sourceLabels:
  23.  
    - __name__ # 作用于指标名称字段
  24.  
    path: /metrics/slis # 自定义指标路径(服务级别指标)
  25.  
    port: https-metrics
  26.  
    scheme: https
  27.  
    tlsConfig:
  28.  
    insecureSkipVerify: true
  29.  
    jobLabel: app.kubernetes.io/name # 使用标签值作为 Prometheus Job 名称
  30.  
    namespaceSelector:
  31.  
    matchNames:
  32.  
    - kube-system # 仅在 kube-system 命名空间发现目标服务
  33.  
    selector:
  34.  
    matchLabels:
  35.  
    app.kubernetes.io/name: kube-scheduler # 匹配 Service 的标签选择器
 
bash

3.发现最后的matchLabels,表名需要选择标签为 app.kubernetes.io/name: kube-scheduler 的 Service,但是通过kubectl get svc -n kube-system 发现并没有这个svc。

 

 
  1.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0/manifests# kubectl get svc -n kube-system
  2.  
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3.  
    kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 21d
  4.  
    kubelet ClusterIP None <none> 10250/TCP,10255/TCP,4194/TCP 24h
  5.  
    metrics-server ClusterIP 10.105.177.80 <none> 443/TCP 2d
 
bash

 

那我们就创建一个svc,并且绑定对应的标签

 
  1.  
    # kube-scheduler-service.yaml
  2.  
    apiVersion: v1
  3.  
    kind: Service
  4.  
    metadata:
  5.  
    name: kube-scheduler
  6.  
    namespace: kube-system
  7.  
    labels:
  8.  
    k8s-app: kube-scheduler
  9.  
    app.kubernetes.io/name: kube-scheduler
  10.  
    spec:
  11.  
    clusterIP: None # Headless Service
  12.  
    ports:
  13.  
    - name: https-metrics
  14.  
    port: 10259
  15.  
    targetPort: 10259
  16.  
    protocol: TCP
  17.  
    selector:
  18.  
    component: kube-scheduler # 必须与 Pod 的标签匹配
  19.  
     
  20.  
     
  21.  
     
  22.  
     
  23.  
    # 应用这个yaml文件
  24.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0/manifests# kubectl apply -f kube-scheduler-service.yaml
  25.  
    service/kube-scheduler created
  26.  
     
  27.  
     
  28.  
    # 再次查看svc
  29.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0/manifests# kubectl get svc -n kube-system
  30.  
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  31.  
    kube-scheduler ClusterIP None <none> 10259/TCP 67s
  32.  
     
 
bash

4.过一会回到页面,即可发现现在已经有了这个监控项

配置kube-controller-manager监控

1.首先修改 /etc/kubernetes/manifests/kube-controller-manager.yaml 的bind IP

 
  1.  
    spec:
  2.  
    containers:
  3.  
    - command:
  4.  
    - kube-controller-manager
  5.  
    - --allocate-node-cidrs=true
  6.  
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
  7.  
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
  8.  
    - --bind-address=127.0.0.1
  9.  
    ====修改为====
  10.  
    spec:
  11.  
    containers:
  12.  
    - command:
  13.  
    - kube-controller-manager
  14.  
    - --allocate-node-cidrs=true
  15.  
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
  16.  
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
  17.  
    - --bind-address=0.0.0.0
 
bash

2.查看kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml 文件最后的标签,这里只看最后的matchLabels 是app.kubernetes.io/name: kube-controller-manager

 
  1.  
    # vim manifests/kubernetesControlPlane-serviceMonitorKubeControllerManager.yaml
  2.  
     
  3.  
    apiVersion: monitoring.coreos.com/v1
  4.  
    kind: ServiceMonitor
  5.  
    metadata:
  6.  
    labels:
  7.  
    app.kubernetes.io/name: kube-controller-manager
  8.  
    app.kubernetes.io/part-of: kube-prometheus
  9.  
    name: kube-controller-manager
  10.  
    namespace: monitoring
  11.  
    spec:
  12.  
     
  13.  
    ....
  14.  
    selector:
  15.  
    matchLabels:
  16.  
    app.kubernetes.io/name: kube-controller-manager
 
bash

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

 
  1.  
    # kube-controller-manager-service.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: Service
  5.  
    metadata:
  6.  
    name: kube-controller-manager
  7.  
    namespace: kube-system
  8.  
    labels:
  9.  
    app.kubernetes.io/name: kube-controller-manager # 必须与 ServiceMonitor 的标签匹配
  10.  
    spec:
  11.  
    clusterIP: None
  12.  
    ports:
  13.  
    - name: https-metrics
  14.  
    port: 10257
  15.  
    targetPort: 10257
  16.  
    protocol: TCP
  17.  
    selector:
  18.  
    component: kube-controller-manager
  19.  
    ---
  20.  
    apiVersion: v1
  21.  
    kind: Endpoints
  22.  
    metadata:
  23.  
    name: kube-controller-manager
  24.  
    namespace: kube-system
  25.  
    subsets:
  26.  
    - addresses:
  27.  
    - ip: 172.21.176.3 # 替换为 Controller Manager 实际 IP
  28.  
    ports:
  29.  
    - name: https-metrics
  30.  
    port: 10257
  31.  
     
 
bash

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

 
  1.  
    kubectl -n kube-system get configmap kube-proxy -o yaml | grep metricsBindAddress
  2.  
     
  3.  
    # 使用edit 来修改
  4.  
    kubectl -n kube-system edit configmap kube-proxy
  5.  
     
  6.  
    metricsBindAddress: ""
  7.  
    ====修改为====
  8.  
    metricsBindAddress: "0.0.0.0:10249"
  9.  
     
  10.  
     
  11.  
    #重启kube-proxy
  12.  
    kubectl -n kube-system rollout restart daemonset/kube-proxy
 
bash

2. 创建ServiceMonitor 文件

​说明​​:无需 TLS 配置,因 kube-proxy 默认使用 HTTP 协议

 
  1.  
    # vim manifests/kubernetesControlPlane-serviceMonitorKube-Proxy.yaml
  2.  
     
  3.  
    apiVersion: monitoring.coreos.com/v1
  4.  
    kind: ServiceMonitor
  5.  
    metadata:
  6.  
    name: kube-proxy
  7.  
    namespace: monitoring
  8.  
    spec:
  9.  
    endpoints:
  10.  
    - interval: 30s
  11.  
    port: http-metrics # 与 Service 端口名称一致
  12.  
    scheme: http # 协议为 HTTP
  13.  
    selector:
  14.  
    matchLabels:
  15.  
    k8s-app: kube-proxy
  16.  
    namespaceSelector:
  17.  
    matchNames: [kube-system]
 
bash

 

3.创建Service文件

 
  1.  
    # vim manifests/kube-proxy-service.yaml
  2.  
     
  3.  
    apiVersion: monitoring.coreos.com/v1
  4.  
    kind: ServiceMonitor
  5.  
    metadata:
  6.  
    name: kube-proxy
  7.  
    namespace: monitoring
  8.  
    spec:
  9.  
    endpoints:
  10.  
    - interval: 30s
  11.  
    port: http-metrics # 与 Service 端口名称一致
  12.  
    scheme: http # 协议为 HTTP
  13.  
    selector:
  14.  
    matchLabels:
  15.  
    k8s-app: kube-proxy
  16.  
    namespaceSelector:
  17.  
    matchNames: [kube-system]
  18.  
    ---
  19.  
    apiVersion: v1
  20.  
    kind: Endpoints
  21.  
    metadata:
  22.  
    name: kube-proxy
  23.  
    namespace: kube-system
  24.  
    subsets:
  25.  
    - addresses:
  26.  
    - ip: 172.21.176.3 # 替换为实际节点 IP
  27.  
    ports:
  28.  
    - name: http-metrics
  29.  
    port: 10249
 
bash

4.应用并查看

 
  1.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl apply -f manifests/kubernetesControlPlane-serviceMonitorKube-Proxy.yaml
  2.  
    servicemonitor.monitoring.coreos.com/kube-proxy created
  3.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl apply -f manifests/kube-proxy-service.yaml
  4.  
    service/kube-proxy created
  5.  
     
 
bash

2025,每天10分钟,跟我学K8S(四十六)- Prometheus(三)添加自定义监控项_prometheus自定义监控项-CSDN博客

     上一章,我们学习了Prometheus添加系统监控项,那如何添加自定义监控项呢?例如etcd或者其他自己运行的pod?

        这一章节就来讲解这个问题。

Prometheus监控ETCD

1.编辑监听端口

这里由于是kubeadm创建的,所以默认监听了本地内网IP,这里不做修改

2.创建Service 和 Endpoints 

 
  1.  
    # vim manifests/etcd-Service.yaml
  2.  
     
  3.  
    # Service 定义
  4.  
    apiVersion: v1
  5.  
    kind: Service
  6.  
    metadata:
  7.  
    name: etcd
  8.  
    namespace: kube-system
  9.  
    labels:
  10.  
    k8s-app: etcd
  11.  
    spec:
  12.  
    clusterIP: None # Headless Service
  13.  
    ports:
  14.  
    - name: https-metrics
  15.  
    port: 2379
  16.  
    protocol: TCP # 协议类型需与 Endpoints 一致
  17.  
     
  18.  
    ---
  19.  
    # Endpoints 定义
  20.  
    apiVersion: v1
  21.  
    kind: Endpoints
  22.  
    metadata:
  23.  
    name: etcd
  24.  
    namespace: kube-system
  25.  
    subsets: # 直接定义 subsets,无需嵌套在 spec 下
  26.  
    - addresses:
  27.  
    - ip: 172.21.176.3 # 替换为实际 ETCD 节点 IP 有几台就写几个
  28.  
    ports:
  29.  
    - name: https-metrics # 端口名称需与 Service 一致
  30.  
    port: 2379
  31.  
    protocol: TCP # 必须明确协议类型
 

3.创建ServiceMonitor 

etcd默认是有证书的,所以需要提前将etcd的证书创建成secret,并且挂载到prometheus的pod中去。

3.1 证书挂载​
创建包含 ETCD 证书的 Secret,供 Prometheus 使用

 
  1.  
    kubectl -n monitoring create secret generic etcd-certs \
  2.  
    --from-file=/etc/kubernetes/pki/etcd/ca.crt \
  3.  
    --from-file=/etc/kubernetes/pki/etcd/server.crt \
  4.  
    --from-file=/etc/kubernetes/pki/etcd/server.key
 

更新 Prometheus 新增配置以挂载证书:

 
  1.  
    # 修改 manifests/prometheus-prometheus.yaml
  2.  
    spec:
  3.  
    secrets:
  4.  
    - etcd-certs
  5.  
     
  6.  
     
  7.  
    # 应用
  8.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl apply -f /opt/prometheus/kube-prometheus/manifests/prometheus-prometheus.yaml
  9.  
    Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
  10.  
    prometheus.monitoring.coreos.com/k8s configured
  11.  
     
  12.  
    更新完毕后,我们就可以在Prometheus Pod中查看到对象的目录,这一步需要的时间比较长,需要等待一会才会复制进去
  13.  
    root@k8s-master:~/prometheus/kube-prometheus-0.14.0# kubectl exec -it -n monitoring prometheus-k8s-0 -- /bin/sh
  14.  
    /prometheus $
  15.  
    /prometheus $ ls /etc/prometheus/secrets/etcd-certs/
  16.  
    ca.crt server.crt server.key
 

3.2 ServiceMonitor 配置

定义 HTTPS 抓取规则,引用证书路径

 
  1.  
    # vim manifests/etcd-ServiceMonitor.yaml
  2.  
     
  3.  
    apiVersion: monitoring.coreos.com/v1
  4.  
    kind: ServiceMonitor
  5.  
    metadata:
  6.  
    name: etcd
  7.  
    namespace: monitoring
  8.  
    spec:
  9.  
    endpoints:
  10.  
    - interval: 30s
  11.  
    port: https-metrics
  12.  
    scheme: https
  13.  
    tlsConfig:
  14.  
    caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
  15.  
    certFile: /etc/prometheus/secrets/etcd-certs/server.crt
  16.  
    keyFile: /etc/prometheus/secrets/etcd-certs/server.key
  17.  
    selector:
  18.  
    matchLabels:
  19.  
    k8s-app: etcd
  20.  
    namespaceSelector:
  21.  
    matchNames: [kube-system]
 

 4.应用yaml文件

 
  1.  
    kubectl apply -f manifests/etcd-Service.yaml
  2.  
    service/etcd created
  3.  
     
  4.  
     
  5.  
    kubectl apply -f manifests/etcd-ServiceMonitor.yaml
  6.  
    servicemonitor.monitoring.coreos.com/etcd created
 

 

5.配置报警规则

上面etcd的监控项已经出现了,但是只监控,不设置预警显然是不合理的。

创建 manifests/etcd-serviceMonitorRule.yaml  预警规则

这里参考:https://github.com/samber/awesome-prometheus-alerts, 这里有各种应用的监控报警规则。

 
  1.  
    # vim manifests/etcd-serviceMonitorRule.yaml
  2.  
     
  3.  
    apiVersion: monitoring.coreos.com/v1
  4.  
    kind: PrometheusRule
  5.  
    metadata:
  6.  
    labels:
  7.  
    prometheus: k8s
  8.  
    role: alert-rules
  9.  
    name: prometheus-k8s-etcd-rules
  10.  
    namespace: monitoring
  11.  
    spec:
  12.  
    groups:
  13.  
    - name: etcd
  14.  
    rules:
  15.  
    - alert: EtcdInsufficientMembers
  16.  
    expr: count(etcd_server_id) % 2 == 0
  17.  
    for: 5m
  18.  
    labels:
  19.  
    severity: critical
  20.  
    annotations:
  21.  
    summary: "Etcd insufficient Members (instance {{ $labels.instance }})"
  22.  
    description: "Etcd cluster should have an odd number of members\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  23.  
    - alert: EtcdNoLeader
  24.  
    expr: etcd_server_has_leader == 0
  25.  
    for: 5m
  26.  
    labels:
  27.  
    severity: critical
  28.  
    annotations:
  29.  
    summary: "Etcd no Leader (instance {{ $labels.instance }})"
  30.  
    description: "Etcd cluster have no leader\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  31.  
    - alert: EtcdHighNumberOfLeaderChanges
  32.  
    expr: increase(etcd_server_leader_changes_seen_total[1h]) > 3
  33.  
    for: 5m
  34.  
    labels:
  35.  
    severity: warning
  36.  
    annotations:
  37.  
    summary: "Etcd high number of leader changes (instance {{ $labels.instance }})"
  38.  
    description: "Etcd leader changed more than 3 times during last hour\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  39.  
    - alert: EtcdHighNumberOfFailedGrpcRequests
  40.  
    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
  41.  
    for: 5m
  42.  
    labels:
  43.  
    severity: warning
  44.  
    annotations:
  45.  
    summary: "Etcd high number of failed GRPC requests (instance {{ $labels.instance }})"
  46.  
    description: "More than 1% GRPC request failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  47.  
    - alert: EtcdHighNumberOfFailedGrpcRequests
  48.  
    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
  49.  
    for: 5m
  50.  
    labels:
  51.  
    severity: critical
  52.  
    annotations:
  53.  
    summary: "Etcd high number of failed GRPC requests (instance {{ $labels.instance }})"
  54.  
    description: "More than 5% GRPC request failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  55.  
    - alert: EtcdGrpcRequestsSlow
  56.  
    expr: histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{grpc_type="unary"}[5m])) by (grpc_service, grpc_method, le)) > 0.15
  57.  
    for: 5m
  58.  
    labels:
  59.  
    severity: warning
  60.  
    annotations:
  61.  
    summary: "Etcd GRPC requests slow (instance {{ $labels.instance }})"
  62.  
    description: "GRPC requests slowing down, 99th percentil is over 0.15s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  63.  
     
  64.  
    - alert: EtcdHighNumberOfFailedHttpRequests
  65.  
    expr: sum(rate(etcd_http_failed_total[5m])) BY (method) / sum(rate(etcd_http_received_total[5m])) BY (method) > 0.01
  66.  
    for: 5m
  67.  
    labels:
  68.  
    severity: warning
  69.  
    annotations:
  70.  
    summary: "Etcd high number of failed HTTP requests (instance {{ $labels.instance }})"
  71.  
    description: "More than 1% HTTP failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  72.  
    - alert: EtcdHighNumberOfFailedHttpRequests
  73.  
    expr: sum(rate(etcd_http_failed_total[5m])) BY (method) / sum(rate(etcd_http_received_total[5m])) BY (method) > 0.05
  74.  
    for: 5m
  75.  
    labels:
  76.  
    severity: critical
  77.  
    annotations:
  78.  
    summary: "Etcd high number of failed HTTP requests (instance {{ $labels.instance }})"
  79.  
    description: "More than 5% HTTP failure detected in Etcd for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  80.  
    - alert: EtcdHttpRequestsSlow
  81.  
    expr: histogram_quantile(0.99, rate(etcd_http_successful_duration_seconds_bucket[5m])) > 0.15
  82.  
    for: 5m
  83.  
    labels:
  84.  
    severity: warning
  85.  
    annotations:
  86.  
    summary: "Etcd HTTP requests slow (instance {{ $labels.instance }})"
  87.  
    description: "HTTP requests slowing down, 99th percentil is over 0.15s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  88.  
    - alert: EtcdMemberCommunicationSlow
  89.  
    expr: histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket[5m])) > 0.15
  90.  
    for: 5m
  91.  
    labels:
  92.  
    severity: warning
  93.  
    annotations:
  94.  
    summary: "Etcd member communication slow (instance {{ $labels.instance }})"
  95.  
    description: "Etcd member communication slowing down, 99th percentil is over 0.15s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  96.  
    - alert: EtcdHighNumberOfFailedProposals
  97.  
    expr: increase(etcd_server_proposals_failed_total[1h]) > 5
  98.  
    for: 5m
  99.  
    labels:
  100.  
    severity: warning
  101.  
    annotations:
  102.  
    summary: "Etcd high number of failed proposals (instance {{ $labels.instance }})"
  103.  
    description: "Etcd server got more than 5 failed proposals past hour\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  104.  
    - alert: EtcdHighFsyncDurations
  105.  
    expr: histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) > 0.5
  106.  
    for: 5m
  107.  
    labels:
  108.  
    severity: warning
  109.  
    annotations:
  110.  
    summary: "Etcd high fsync durations (instance {{ $labels.instance }})"
  111.  
    description: "Etcd WAL fsync duration increasing, 99th percentil is over 0.5s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  112.  
    - alert: EtcdHighCommitDurations
  113.  
    expr: histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) > 0.25
  114.  
    for: 5m
  115.  
    labels:
  116.  
    severity: warning
  117.  
    annotations:
  118.  
    summary: "Etcd high commit durations (instance {{ $labels.instance }})"
  119.  
    description: "Etcd commit duration increasing, 99th percentil is over 0.25s for 5 minutes\n VALUE = {{ $value }}\n LABELS: {{ $labels }}"
  120.  
     
  121.  
    #apply 应用
  122.  
    kubectl apply -f manifests/etcd-serviceMonitorRule.yaml
  123.  
    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的自动发现规则。

        前面我们学习了K8S中Prometheus 的各种监控配置,但是有了这些告警,怎么让监控人员及时发现并处理,总不能让监控人员一直盯着prometheus的页面吧,如何将告警内容发布出来,这就是接下来要学习的。        

        前面的课程中我们知道我们可以通过 AlertManager 的配置文件去配置各种报警接收器,那应该怎样去修改配置呢?

        查看 AlertManager  Dashboard 的 status页面下的config,发现这里的值和kube-prometheus/manifests/alertmanager-secret.yaml 下面的内容一样,我们这边采用钉钉报警,钉钉在2020年7月进行升级了。需要配置sign才可以发送消息

 

一、部署核心组件​

​1. 创建钉钉机器人​

        自动2020年钉钉机器人改版后,现在​的机器人只选择「加签」或「自定义关键词」安全验证方式。

1.1、在钉钉群中创建自定义机器人,选择「加签」或「自定义关键词」安全验证方式。

选择加签模式,并且记录好这里的加签内容

SEC8b2e7abdb0f5243d04f527d2a3a66d7e53e1a66462936ef84c1aeb3978e96df5

 

 

1.2、记录生成的 Webhook URL(如 https://oapi.dingtalk.com/robot/send?access_token=xxx)和加签密钥(如有)。

https://oapi.dingtalk.com/robot/send?access_token=3037cf6879c4749684e2a99b916a749fcfeb6fde835151bd84758636f5fbb04b

​2. 部署钉钉 Webhook 插件​

使用 Kubernetes YAML 部署 prometheus-webhook-dingtalk(推荐官方镜像 timonwong/prometheus-webhook-dingtalk:v2.1.0):

 
  1.  
    # cat dingtalk-webhook-deploy.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: Service
  5.  
    metadata:
  6.  
    name: dingtalk
  7.  
    namespace: monitoring
  8.  
    labels:
  9.  
    app: dingtalk
  10.  
    spec:
  11.  
    selector:
  12.  
    app: dingtalk
  13.  
    ports:
  14.  
    - name: dingtalk
  15.  
    port: 8060
  16.  
    protocol: TCP
  17.  
    targetPort: 8060
  18.  
     
  19.  
    ---
  20.  
    apiVersion: apps/v1
  21.  
    kind: Deployment
  22.  
    metadata:
  23.  
    name: dingtalk
  24.  
    namespace: monitoring
  25.  
    spec:
  26.  
    replicas: 2
  27.  
    selector:
  28.  
    matchLabels:
  29.  
    app: dingtalk
  30.  
    template:
  31.  
    metadata:
  32.  
    name: dingtalk
  33.  
    labels:
  34.  
    app: dingtalk
  35.  
    spec:
  36.  
    containers:
  37.  
    - name: dingtalk
  38.  
    image: docker.1ms.run/timonwong/prometheus-webhook-dingtalk:v2.1.0
  39.  
    imagePullPolicy: IfNotPresent
  40.  
    args:
  41.  
    - --web.listen-address=:8060
  42.  
    - --config.file=/etc/prometheus-webhook-dingtalk/config.yml
  43.  
    ports:
  44.  
    - containerPort: 8060
  45.  
    volumeMounts:
  46.  
    - name: config
  47.  
    mountPath: /etc/prometheus-webhook-dingtalk
  48.  
    volumes:
  49.  
    - name: config
  50.  
    configMap:
  51.  
    name: prometheus-webhook-dingtalk-config
 
bash

 

​3. 配置钉钉插件​

创建 dingtalk-configmap.yaml 和 自定义告警模板 

记得替换这里的access_token和secret

 
  1.  
    # cat dingtalk-configmap.yaml
  2.  
    apiVersion: v1
  3.  
    kind: ConfigMap
  4.  
    metadata:
  5.  
    name: prometheus-webhook-dingtalk-config
  6.  
    namespace: monitoring
  7.  
    data:
  8.  
    config.yml: |-
  9.  
    templates:
  10.  
    - /etc/prometheus-webhook-dingtalk/default.tmpl
  11.  
    targets:
  12.  
    webhook1:
  13.  
    url: https://oapi.dingtalk.com/robot/send?access_token=3037cf6879c4749684e2a99b916a749fcfeb6fde835151bd84758636f5fbb04b #修改为钉钉机器人的webhook
  14.  
    secret: SEC8b2e7abdb0f5243d04f527d2a3a66d7e53e1a66462936ef84c1aeb3978e96df5 #修改钉钉机器人的加签
  15.  
    mention:
  16.  
    all: true
  17.  
    message:
  18.  
    text: '{{ template "default.tmpl" . }}'
  19.  
     
  20.  
    default.tmpl: |
  21.  
    {{ define "default.tmpl" }}
  22.  
     
  23.  
    {{- if gt (len .Alerts.Firing) 0 -}}
  24.  
    {{- range $index, $alert := .Alerts -}}
  25.  
     
  26.  
    ============ = **<font color='#FF0000'>告警</font>** = ============= #红色字体
  27.  
     
  28.  
    **告警名称:** {{ $alert.Labels.alertname }}
  29.  
    **告警级别:** {{ $alert.Labels.severity }} 级
  30.  
    **告警状态:** {{ .Status }}
  31.  
    **告警实例:** {{ $alert.Labels.instance }} {{ $alert.Labels.device }}
  32.  
    **告警概要:** {{ .Annotations.summary }}
  33.  
    **告警详情:** {{ $alert.Annotations.message }}{{ $alert.Annotations.description}}
  34.  
    **故障时间:** {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
  35.  
    ============ = end = =============
  36.  
    {{- end }}
  37.  
    {{- end }}
  38.  
     
  39.  
    {{- if gt (len .Alerts.Resolved) 0 -}}
  40.  
    {{- range $index, $alert := .Alerts -}}
  41.  
     
  42.  
    ============ = <font color='#00FF00'>恢复</font> = ============= #绿色字体
  43.  
     
  44.  
    **告警实例:** {{ .Labels.instance }}
  45.  
    **告警名称:** {{ .Labels.alertname }}
  46.  
    **告警级别:** {{ $alert.Labels.severity }} 级
  47.  
    **告警状态:** {{ .Status }}
  48.  
    **告警概要:** {{ $alert.Annotations.summary }}
  49.  
    **告警详情:** {{ $alert.Annotations.message }}{{ $alert.Annotations.description}}
  50.  
    **故障时间:** {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
  51.  
    **恢复时间:** {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
  52.  
     
  53.  
    ============ = **end** = =============
  54.  
    {{- end }}
  55.  
    {{- end }}
  56.  
    {{- end }}
 
bash

 

​二、配置 Alertmanager​

​1. 修改 Alertmanager 配置​

 
  1.  
    # cat alertmanager.yaml
  2.  
     
  3.  
    global:
  4.  
    resolve_timeout: 15s
  5.  
    inhibit_rules: ##静默规则:当同一个job内,出现多个告警时,只将高级别告警发送出来
  6.  
    - source_match: ##发送的告警标签
  7.  
    severity: 'critical'
  8.  
    target_match: ##被抑制的告警标签
  9.  
    severity: 'warning'
  10.  
    equal: ['alertname','namespace'] ##匹配的标签,即当同一个job出现多个告警的时候,会优先发出级别为critical的告警
  11.  
     
  12.  
    route: ##顶级路由,可以通过制定不同的路由,将不同的告警信息发送给不同的人,这里顶级路由需要匹配所有的告警
  13.  
    group_by: ['alertname','namespace'] ##分组,需要匹配所有的告警,所以这里可以用监控namespace分组
  14.  
    group_wait: 30s ## 分组等待的时间
  15.  
    group_interval: 5m ## 上下两组发送告警的间隔时间
  16.  
    repeat_interval: 1h ## 重复发送告警时间。默认1h
  17.  
    receiver: webhook ## 默认的发送人 这里选择webhook,即钉钉
  18.  
    routes: ## 子路由
  19.  
    - match:
  20.  
    alertname: warning ## 将warning的告警发送给webhook工作组
  21.  
    receiver: webhook
  22.  
    receivers: #定义谁来通知报警
  23.  
    - name: 'webhook' ##钉钉样式
  24.  
    webhook_configs:
  25.  
    #- url: 'http://webhook-dingtalk:8060/dingtalk/webhook1/send'
  26.  
    - url: 'http://dingtalk.monitoring.svc.cluster.local:8060/dingtalk/webhook1/send'
  27.  
    send_resolved: true
 
bash

​2. 应用配置​

  • 更新 Alertmanager 配置后重启服务:
 
  1.  
    # 删除旧secret
  2.  
    kubectl delete secret alertmanager-main -n monitoring
  3.  
     
  4.  
    # 创建新secret
  5.  
    kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml -n monitoring
 
bash

 

​三、配置 Prometheus 告警规则​

​1. 定义告警规则​

在manifests/alertmanager-prometheusRule.yaml 中新增一下自定义规则

规则内容为当pod重启3次后报警

 
  1.  
    # vim alertmanager-prometheusRule.yaml
  2.  
     
  3.  
    - name: pod-alerts
  4.  
    rules:
  5.  
    - alert: PodCrashLooping
  6.  
    expr: kube_pod_container_status_restarts_total > 3
  7.  
    for: 5m
  8.  
    labels:
  9.  
    severity: critical
  10.  
    annotations:
  11.  
    summary: "Pod {{ $labels.pod }} 进入崩溃循环"
  12.  
    description: "命名空间 {{ $labels.namespace }} 的 Pod {{ $labels.pod }} 已重启 {{ $value }} 次"
 
bash

2. 触发测试加载规则

curl -X POST http://<SVC下prometheus-k8s的IP>:9090/-/reload  # 热加载配置
bash

 

四、验证

默认告警

自定义告警

由于我们自定义的警告是一个pod重启3次即告警,那创建一个不停重启的pod就可以了.

记得修改镜像地址,不然去默认地址拉取的话会一直卡在初始化拉取镜像

 
  1.  
    # vim crash_pod.yaml
  2.  
     
  3.  
    apiVersion: v1
  4.  
    kind: Pod
  5.  
    metadata:
  6.  
    name: crash-test-pod
  7.  
    spec:
  8.  
    containers:
  9.  
    - name: crash-container
  10.  
    image: m.daocloud.io/docker.io/library/busybox:latest
  11.  
    command: ["sh", "-c", "exit 1"] # 容器启动后立即退出
  12.  
    restartPolicy: OnFailure # 退出后自动重启
  13.  
     
  14.  
     
  15.  
    # kubectl apply -f crash_pod.yaml
 
bash

通过Prometheus的web页面去查询重启次数大于3次的

 

再去钉钉查看报警

 

五、他人写好的告警规则

很多其他的自定义规则报警,可以参考之前提到的github中的内容

https://github.com/samber/awesome-prometheus-alerts

 

2025,每天10分钟,跟我学K8S(四十九)- 日志收集-CSDN博客

        在日常k8s的使用中,由于应用都是运行在pod中的,所以日志文件也一般都会存储在pod中,那如何收集这一块的日志内容?K8S官方给了以下三种方案。

        

三种收集方案的优缺点:

 

        三种方案各有自己的优缺点,但是综合比较下来,一般都是建议使用第二种方案,也是官方推荐的一种。

        在同一个pod中运行2个容器,第一个容器运行业务程序,第二个容器运行日志收集程序,两个容器共享一个日志目录,当第一个业务程序将日志写入到日志目录后,日志收集程序将共享目录中的日志源文件进行收集并上传。

        本章内容,就来一起了解下这种方案的具体操作过程。市面上日志收集处理的工具有很多,本文采用filebeat + elasticsearch的组合。大部分情况可以在filebeat 后面增加一个redis/kafka+logstash,来缓存数据和处理数据,得到想要的数据类型再进行上传到es中。这种后面有机会的话再来单章分析。

 

 

1.部署elasticsearch

创建es.yaml文件,用来创建es后端服务

 
  1.  
    root@k8s-master:~/tmp/root/elk# cat es.yaml
  2.  
     
  3.  
    #pvc create longhorn pvc
  4.  
    apiVersion: v1
  5.  
    kind: PersistentVolumeClaim
  6.  
    metadata:
  7.  
    name: es-pv-claim
  8.  
    labels:
  9.  
    type: longhorn
  10.  
    app: es
  11.  
    spec:
  12.  
    storageClassName: longhorn
  13.  
    accessModes:
  14.  
    - ReadWriteOnce
  15.  
    resources:
  16.  
    requests:
  17.  
    storage: 10Gi
  18.  
    ---
  19.  
    #ConfigMap create es config
  20.  
    apiVersion: v1
  21.  
    kind: ConfigMap
  22.  
    metadata:
  23.  
    name: es
  24.  
    data:
  25.  
    elasticsearch.yml: |
  26.  
    cluster.name: my-cluster
  27.  
    node.name: node-1
  28.  
    node.max_local_storage_nodes: 3
  29.  
    network.host: 0.0.0.0
  30.  
    http.port: 9200
  31.  
    discovery.seed_hosts: ["127.0.0.1", "[::1]"]
  32.  
    cluster.initial_master_nodes: ["node-1"]
  33.  
    http.cors.enabled: true
  34.  
    http.cors.allow-origin: /.*/
  35.  
    ---
  36.  
    #Deployment create es pod
  37.  
    apiVersion: apps/v1
  38.  
    kind: Deployment
  39.  
    metadata:
  40.  
    name: elasticsearch
  41.  
    spec:
  42.  
    selector:
  43.  
    matchLabels:
  44.  
    name: elasticsearch
  45.  
    replicas: 1
  46.  
    template:
  47.  
    metadata:
  48.  
    labels:
  49.  
    name: elasticsearch
  50.  
    spec:
  51.  
    securityContext:
  52.  
    fsGroup: 1000 # 关键:适配 Elasticsearch 用户组
  53.  
    initContainers:
  54.  
    - name: init-sysctl
  55.  
    image: m.daocloud.io/docker.io/busybox:latest
  56.  
    command:
  57.  
    - sysctl
  58.  
    - -w
  59.  
    - vm.max_map_count=262144
  60.  
    securityContext:
  61.  
    privileged: true
  62.  
    containers:
  63.  
    - name: elasticsearch
  64.  
    image: m.daocloud.io/docker.io/elasticsearch:7.6.2
  65.  
    imagePullPolicy: IfNotPresent
  66.  
    resources:
  67.  
    limits:
  68.  
    cpu: 1000m
  69.  
    memory: 2Gi
  70.  
    requests:
  71.  
    cpu: 100m
  72.  
    memory: 1Gi
  73.  
    env:
  74.  
    - name: ES_JAVA_OPTS
  75.  
    value: -Xms512m -Xmx512m
  76.  
    ports:
  77.  
    - containerPort: 9200
  78.  
    - containerPort: 9300
  79.  
    volumeMounts:
  80.  
    - name: elasticsearch-data
  81.  
    mountPath: /usr/share/elasticsearch/data/
  82.  
    - name: es-config
  83.  
    mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
  84.  
    subPath: elasticsearch.yml
  85.  
    volumes:
  86.  
    - name: elasticsearch-data
  87.  
    persistentVolumeClaim:
  88.  
    claimName: es-pv-claim
  89.  
    - name: es-config
  90.  
    configMap:
  91.  
    name: es
  92.  
    ---
  93.  
    #Service create es Service
  94.  
    apiVersion: v1
  95.  
    kind: Service
  96.  
    metadata:
  97.  
    name: elasticsearch
  98.  
    labels:
  99.  
    name: elasticsearch
  100.  
    spec:
  101.  
    type: NodePort
  102.  
    ports:
  103.  
    - name: web-9200
  104.  
    port: 9200
  105.  
    targetPort: 9200
  106.  
    protocol: TCP
  107.  
    nodePort: 30105
  108.  
    - name: web-9300
  109.  
    port: 9300
  110.  
    targetPort: 9300
  111.  
    protocol: TCP
  112.  
    nodePort: 30106
  113.  
    selector:
  114.  
    name: elasticsearch
  115.  
     
  116.  
     
  117.  
     
  118.  
     
  119.  
    # kubectl apply -f es.yaml
  120.  
    persistentvolumeclaim/es-pv-claim created
  121.  
    configmap/es created
  122.  
    deployment.apps/elasticsearch created
  123.  
    service/elasticsearch created
 
bash

2.创建一个nginx的pod

同一个pod中运行2个容器,第一个容器运行业务程序,第二个容器运行日志收集程序,两个容器共享一个日志目录,当第一个业务程序将日志写入到日志目录后,日志收集程序将共享目录中的日志源文件进行收集并上传。

2.1 创建config

 
  1.  
    # cat nginx_test_configmap.yaml
  2.  
    ---
  3.  
    # Filebeat 配置文件 ConfigMap
  4.  
    apiVersion: v1
  5.  
    kind: ConfigMap
  6.  
    metadata:
  7.  
    name: filebeat-config
  8.  
    data:
  9.  
    filebeat.yml: |
  10.  
    filebeat.inputs:
  11.  
    - type: log
  12.  
    enabled: true
  13.  
    paths:
  14.  
    - /var/log/nginx/access.log
  15.  
    - /var/log/nginx/error.log
  16.  
    fields:
  17.  
    app: nginx
  18.  
    fields_under_root: true
  19.  
     
  20.  
    processors:
  21.  
    - add_kubernetes_metadata:
  22.  
    matchers:
  23.  
    - logs_path:
  24.  
    logs_path: "/var/log/containers/"
  25.  
     
  26.  
    output.elasticsearch:
  27.  
    hosts: ["elasticsearch.default.svc.cluster.local:9200"]
  28.  
    indices:
  29.  
    - index: "nginx-logs-%{+yyyy.MM.dd}"
 
bash

2.2 创建rbac

这里是由于默认的filebeat容器是使用非root用户,所以需要给对应的容器创建sa用户,赋予权限

 
  1.  
    # cat nginx_test_rbac.yaml
  2.  
    ---
  3.  
    apiVersion: v1
  4.  
    kind: ServiceAccount
  5.  
    metadata:
  6.  
    name: filebeat-sa
  7.  
    ---
  8.  
    apiVersion: rbac.authorization.k8s.io/v1
  9.  
    kind: ClusterRoleBinding
  10.  
    metadata:
  11.  
    name: filebeat-role-binding
  12.  
    subjects:
  13.  
    - kind: ServiceAccount
  14.  
    name: filebeat-sa
  15.  
    namespace: default
  16.  
    roleRef:
  17.  
    kind: ClusterRole
  18.  
    name: view
  19.  
    apiGroup: rbac.authorization.k8s.io
 
bash

2.3 创建deployment和service

这里是关键步骤,一个deployment下面运行了两个containers,一个是nginx,用于模拟后台;一个是filebeat,用于收集日志。 两个containers共享了nginx-logs 这个存储卷,所以filebeat才能访问到nginx的日志

 
  1.  
    # cat nginx_test_deploy.yaml
  2.  
    apiVersion: apps/v1
  3.  
    kind: Deployment
  4.  
    metadata:
  5.  
    name: nginx-with-filebeat
  6.  
    spec:
  7.  
    replicas: 1
  8.  
    selector:
  9.  
    matchLabels:
  10.  
    app: nginx-with-filebeat
  11.  
    template:
  12.  
    metadata:
  13.  
    labels:
  14.  
    app: nginx-with-filebeat
  15.  
    spec:
  16.  
    # 使用上面rbac创建的sa用户来作为容器中的用户
  17.  
    serviceAccountName: filebeat-sa
  18.  
    containers:
  19.  
    # Nginx 主容器
  20.  
    - name: nginx
  21.  
    image: m.daocloud.io/docker.io/nginx:latest
  22.  
    ports:
  23.  
    - containerPort: 80
  24.  
    volumeMounts:
  25.  
    - name: nginx-logs
  26.  
    mountPath: /var/log/nginx
  27.  
    # Filebeat 日志采集 Sidecar 容器
  28.  
    - name: filebeat
  29.  
    image: docker.elastic.co/beats/filebeat:7.6.2
  30.  
    args: ["-c", "/etc/filebeat.yml", "-e"]
  31.  
    volumeMounts:
  32.  
    - name: nginx-logs
  33.  
    mountPath: /var/log/nginx
  34.  
    - name: filebeat-config
  35.  
    mountPath: /etc/filebeat.yml
  36.  
    subPath: filebeat.yml
  37.  
    securityContext:
  38.  
    runAsUser: 0 # 以 root 运行(避免日志文件权限问题)
  39.  
     
  40.  
    # 共享存储卷定义
  41.  
    volumes:
  42.  
    - name: nginx-logs
  43.  
    emptyDir: {} # 日志存储(可根据需求改为 PVC,但是上传到了es就没必要再存在pv了)
  44.  
    - name: filebeat-config
  45.  
    configMap:
  46.  
    name: filebeat-config
 
bash

3.部署kibana查看数据

 
  1.  
    # cat kibana.yaml
  2.  
    # Kibana Deployment
  3.  
    apiVersion: apps/v1
  4.  
    kind: Deployment
  5.  
    metadata:
  6.  
    name: kibana
  7.  
    namespace: default
  8.  
    spec:
  9.  
    replicas: 1
  10.  
    selector:
  11.  
    matchLabels:
  12.  
    app: kibana
  13.  
    template:
  14.  
    metadata:
  15.  
    labels:
  16.  
    app: kibana
  17.  
    spec:
  18.  
    containers:
  19.  
    - name: kibana
  20.  
    image: docker.elastic.co/kibana/kibana:7.6.2 # 版本需与 Elasticsearch 一致
  21.  
    env:
  22.  
    - name: ELASTICSEARCH_HOSTS # 关键配置:指向 Elasticsearch 地址
  23.  
    value: "http://elasticsearch.default.svc.cluster.local:9200"
  24.  
    ports:
  25.  
    - containerPort: 5601
  26.  
    resources:
  27.  
    limits:
  28.  
    memory: 1Gi
  29.  
    cpu: "1"
  30.  
    requests:
  31.  
    memory: 512Mi
  32.  
    cpu: "0.5"
  33.  
    ---
  34.  
    # Kibana Service
  35.  
    apiVersion: v1
  36.  
    kind: Service
  37.  
    metadata:
  38.  
    name: kibana
  39.  
    namespace: default
  40.  
    spec:
  41.  
    type: NodePort # 生产环境建议使用 Ingress
  42.  
    ports:
  43.  
    - port: 5601
  44.  
    targetPort: 5601
  45.  
    nodePort: 30601 # 自定义端口范围(30000-32767)
  46.  
    selector:
  47.  
    app: kibana
 
bash

4.应用

 
  1.  
    kubectl apply -f es.yaml
  2.  
     
  3.  
    kubectl apply -f nginx_test_configmap.yaml
  4.  
    kubectl apply -f nginx_test_deploy.yaml
  5.  
    kubectl apply -f nginx_test_rbac.yaml
  6.  
     
  7.  
    kubectl apply -f kibana.yaml
 
bash

5.验证日志数据

5.1 手动创造日志

获取nginx的IP,通过curl请求模拟一次访问,创建一条日志

 
  1.  
    # kubectl get pod -o wide
  2.  
    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3.  
    elasticsearch-66c4f5c466-gtv2q 1/1 Running 0 49m 10.244.85.253 k8s-node01 <none> <none>
  4.  
    kibana-88964bcb7-glxhc 1/1 Running 0 32m 1/1 Running 0 49m 10.244.85.254 k8s-node01 <none> <none>
  5.  
    nginx-with-filebeat-59b5d795fd-fpv8b 2/2 Running 0 3m57s 10.244.85.219 k8s-node01 <none> <none>
  6.  
     
  7.  
     
  8.  
    # curl 10.244.85.219
  9.  
    <!DOCTYPE html>
  10.  
    <html>
  11.  
    <head>
  12.  
    <title>Welcome to nginx!</title>
  13.  
    <style>
  14.  
    ....
 
bash

5.2 验证日志

1. 登录kibana,点击左上角的discover,出来的页面右侧创建索引模式,输入nginx-logs-*,这样可以匹配所有以nginx-logs- 开头的日志

2.下一步后添加一个时间字段,完成创建

3. 再次点击左上角discover 即可看到nginx的日志

 

 

 

 

 
 

 

posted @ 2025-07-17 13:37  CharyGao  阅读(163)  评论(0)    收藏  举报