实战指南:使用 kube-prometheus-stack 监控 K3s 集群
作者简介
王海龙,Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 9 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层操作系统 Linux,还是虚拟化 KVM 或是 Docker 容器技术都有丰富的运维和实践经验。
随着容器化应用的普及,Kubernetes 成为了管理和编排这些容器的首选平台。对于资源受限的生产环境和边缘部署来说,K3s 是一个理想的轻量级 Kubernetes 发行版。然而,为了确保 K3s 集群的稳定性和性能,监控是至关重要的。本文将介绍如何通过 kube-prometheus-stack 来监控 K3s 集群的运行状态。
先决条件
K3s 集群
你必须拥有一个健康的 Rancher K3s 集群。本次示例,将安装两个节点的 K3s 集群:一个 K3s master 节点,一个 K3s worker 节点,并且集群采用嵌入式 etcd 作为数据存储。
本文使用的 K3s 版本为:v1.27.6+k3s1
Helm
如果你尚未安装 Helm3,请参考 Helm 官网文档 安装 Helm。
Kubernetes Storage Class
为了支持集群中任何节点上的监控组件的持久化和调度,你需要提供 Kubernetes Storage Class。
你可以使用像 Longhorn 这样成熟的集群存储解决方案。但为了方便演示,本文使用 K3s 自带的 Local Path Provisioner。
K3s 集群准备
默认情况下,K3s 将其多个管理组件绑定到节点主机的 localhost 127.0.0.1
地址,具体为:Kube Controller Manager、Kube Proxy 和 Kube Scheduler。
但是,为了进行监控,我们需要公开这些 endpoint,以便 Prometheus 可以提取它们的指标。因此,我们需要在 0.0.0.0 地址上公开这些组件的 metrics。
你可以通过将包含以下内容的文件放置在 “/etc/rancher/k3s/config.yaml” 中来更改 K3s master 节点上的这些设置。
# /etc/rancher/k3s/config.yaml kube-controller-manager-arg: - "bind-address=0.0.0.0" kube-proxy-arg: - "metrics-bind-address=0.0.0.0" kube-scheduler-arg: - "bind-address=0.0.0.0" # 公开 etcd metrics etcd-expose-metrics: true
另外,K3s worker 节点上也运行了 Kube Proxy 组件,所以也需要在 K3s worker 节点的 “/etc/rancher/k3s/config.yaml” 中添加如下配置:
# /etc/rancher/k3s/config.yaml kube-proxy-arg: - "metrics-bind-address=0.0.0.0"
安装 K3s 集群
K3s master 节点
1.配置 K3s master(IP:172.31.38.19)
root@ip-172-31-38-19:~# mkdir -p /etc/rancher/k3s/ root@ip-172-31-38-19:~# cat >/etc/rancher/k3s/config.yaml <<EOL # /etc/rancher/k3s/config.yaml kube-controller-manager-arg: - "bind-address=0.0.0.0" kube-proxy-arg: - "metrics-bind-address=0.0.0.0" kube-scheduler-arg: - "bind-address=0.0.0.0" # 公开 etcd metrics etcd-expose-metrics: true EOL
2.安装 K3s master
root@ip-172-31-38-19:~# curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server --cluster-init
K3s worker 节点
1.配置 K3s worker(IP:172.31.41.39)
root@ip-172-31-41-39:~# mkdir -p /etc/rancher/k3s/ root@ip-172-31-41-39:~# cat >/etc/rancher/k3s/config.yaml <<EOL # /etc/rancher/k3s/config.yaml kube-proxy-arg: - "metrics-bind-address=0.0.0.0" EOL
2.安装 K3s worker
root@ip-172-31-41-39:~# curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - agent --server https://<ip or hostname of server>:6443
现在,每个服务都有可用的侦听器,Prometheus 就可以抓取这些 metrics
# kubeControllerManager port: 10257 # kubeScheduler port: 10259 # kubeProxy port: 10249 root@ip-172-31-38-19:~# ss -lntp | grep -E "10257|10259|10249" LISTEN 0 4096 *:10249 *:* users:(("k3s-server",pid=3504,fd=203)) LISTEN 0 4096 *:10259 *:* users:(("k3s-server",pid=3504,fd=201)) LISTEN 0 4096 *:10257 *:* users:(("k3s-server",pid=3504,fd=178))
修改 Traefik Metrics 端口
K3s 使用 Traefik 作为开箱即用的 Ingress 控制器,在启动 K3s 时默认部署。默认配置文件位于 /var/lib/rancher/k3s/server/manifests/traefik.yaml
,Traefik 默认的 metrics 端口为 9100
,并且使用 HostPort 启动,这样就和 node-exporter 的 9100 端口冲突,所以我们需要提前修改 Traefik 的 metrics 端口。
要修改 Traefik 的配置信息,不要手动编辑 traefik.yaml 文件,因为 K3s 会在启动时使用默认值替换该文件。相反,你需要通过在 /var/lib/rancher/k3s/server/manifests
中创建 HelmChartConfig 清单来自定义 Traefik。有关更多详细信息和示例,请参阅使用 HelmChartConfig 自定义打包组件。有关配置 traefik 配置的更多信息,请参阅官方 Traefik Helm 配置参数。
## 本示例将 traefik 的 metrics 端口修改为 9900 root@ip-172-31-38-19:~# cat >/var/lib/rancher/k3s/server/manifests/traefik-config.yaml <<EOL apiVersion: helm.cattle.io/v1 kind: HelmChartConfig metadata: name: traefik namespace: kube-system spec: valuesContent: |- ports: metrics: port: 9900 exposedPort: 9900 EOL
Helm 自定义 values.yaml 文件
在使用 Helm 安装 kube-prometheus-stack 之前,我们需要创建一个自定义 values.yam 文件来调整 K3s 集群的默认 chart 配置。
覆盖管理组件配置
我们放在 K3s master 节点 (172.31.38.19) 上的 config.yaml 文件中公开了 Kube Controller Manager、Kube Proxy 和 Kube Scheduler 上的 metrics,并且在 K3s worker 节点上公开了 Kube Proxy 的 metrics。所以需要在 values.yaml 中指定对应的 endpoints 和 port。如果没有这些显式的设置,kube-prometheus-stack 将无法找到这些 metrics。
endpoints 是一个数组,因此如果你有 3 个 HA master 节点,则需要指定所有 3 个 IP 地址。以下配置中,其实只设置 endpoints 即可,其他参数均为默认值,加上这些配置值是为了更详细的说明配置项。
kubeControllerManager: enabled: true endpoints: - 172.31.38.19 service: enabled: true port: 10257 targetPort: 10257 serviceMonitor: enabled: true https: false kubeScheduler: enabled: true endpoints: - 172.31.38.19 service: enabled: true port: 10259 targetPort: 10259 serviceMonitor: enabled: true https: false kubeProxy: enabled: true endpoints: - 172.31.38.19 - 172.31.41.39 service: enabled: true port: 10249 targetPort: 10249
覆盖 ETCD 配置
kubeEtcd: enabled: true endpoints: - 172.31.38.19
持久化存储
生产环境请务必为 AlertManager、Grafana 和 Prometheus 使用外部存储。如果不这样做,将使用一个 emptyDir,该目录仅在 Pod 生命周期内有效。
即使使用 K3s local-path storage class 也只能提供节点级别的持久化。本文为了方便演示,使用的是 local-path。生产环境建议使用像 Longhorn 这样成熟的集群存储解决方案。
alertmanager: alertmanagerSpec: storage: volumeClaimTemplate: spec: storageClassName: local-path accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi prometheus: prometheusSpec: storageSpec: ## Using PersistentVolumeClaim ## volumeClaimTemplate: spec: storageClassName: local-path accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi grafana: persistence: type: pvc enabled: true storageClassName: local-path accessModes: ["ReadWriteOnce"] size: 1024Mi
完整的 values.yaml 文件
我在 github 中有一个监控 K3s 集群的完整示例 values.yaml 文件。这个示例 values.yaml 文件中包含了 Ingress 和 公开 AlertManager、Grafana 和 Prometheus 的设置,还有一些关于 AlertManager 的告警配置信息,但这些设置并非特定于 K3s。
这个示例中也包含了监控 traefik 的 prometheus 配置,如果大家有需求,也可以参考。
Helm 安装 kube-prometheus-stack
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts # helm repo update # kubectl create namespace monitoring # helm install prometheus-community prometheus-community/kube-prometheus-stack --namespace monitoring -f values.yaml
如果你修改 values.yaml 文件并需要更新版本,请将 install
更改为 upgrade
。
# helm -n monitoring upgrade prometheus-community prometheus-community/kube-prometheus-stack -f values.yaml
验证安装状态:
# 列出所有 namespace 中的 releases helm list -A # 列出 monitoring namespace 中的 releases helm list -n monitoring # 检查 prometheus stack release 状态 helm status prometheus-community -n monitoring
安装完成后,我们就可以访问 Prometheus、Alertmanager、Grafana 的 UI 来查看 K3s 集群的状态:
总 结
监控是运维工作中的重要一环,能够帮你及时发现和解决潜在问题,提高集群的可用性和效率。按照本文的步骤,你可以轻松地使用 kube-prometheus-stack 监控 K3s 集群,确保其稳定性和性能。借助 Prometheus、Alertmanager 和 Grafana,你可以创建交互式仪表板和可视化,深入了解集群的运行状况,为你的应用程序提供更好的支持和管理。希望本文对你有所帮助,让你更好地运维和管理 K3s 集群。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Go接口 - 构建可扩展Go应用
本文深入探讨了Go语言中接口的概念和实际应用场景。从基础知识如接口的定义和实现,到更复杂的实战应用如解耦与抽象、多态、错误处理、插件架构以及资源管理,文章通过丰富的代码示例和详细的解释,展示了Go接口在软件开发中的强大功能和灵活性。 关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 一、引言 为什么要学习Go接口 接口是Go编程语言中一个至关重要的概念,它不仅仅是一种类型抽象,更是一种编程范式和设计思想的体现。理解和掌握Go接口有助于我们更深刻地了解Go语言本身,以及它如何解决软件开发中的一系列核心问题。 Go为什么设定接口 Go语言在设计之初就强调简洁性和高效性。在这个背景下,Go的设计者们引入了接口这一概念。相较于其他编程语言中复杂的继承和多态机制,Go接口提供了一种更为简单、灵活的多态实现方式。 面向行为的编程 在传统的面向对象编程(OOP)中,多态通常是通过继承和覆盖基类方法来实...
- 下一篇
@Scope 注解失效了?咋回事
scope 属性,相信大家都知道,一共有六种: 取值 含义 生效条件 singleton 表示这个 Bean 是单例的,在 Spring 容器中,只会存在一个实例。 prototype 多例模式,每次从 Spring 容器中获取 Bean 的时候,才会创建 Bean 的实例出来。 request 当有一个新的请求到达的时候,会创建一个 Bean 的实例处理。 web 环境下生效 session 当有一个新的会话的时候,会创建一个 Bean 的实例出来。 web 环境下生效 application 这个表示在项目的整个生命周期中,只有一个 Bean。 web 环境下生效 gloablsession 有点类似于 application,但是这个是在 portlet 环境下使用的。 web 环境下生效 这个用法也很简单,通过配置就可以设置一个 Bean 是否为单例模式。 1. 问题呈现 今天我要说的不是基础用法,是另外一个问题,假设我现在有如下两个 Bean: @Service public class UserService { @Autowired UserDao userDao; } ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7