实战指南:使用 kube-prometheus-stack 监控 K3s 集群

news/2025/2/19 9:41:13/

作者简介
王海龙,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: 10249root@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: traefiknamespace: kube-system
spec:valuesContent: |-ports:metrics:port: 9900exposedPort: 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: trueendpoints:- 172.31.38.19service:enabled: trueport: 10257targetPort: 10257serviceMonitor:enabled: truehttps: falsekubeScheduler:enabled: trueendpoints:- 172.31.38.19service:enabled: trueport: 10259targetPort: 10259serviceMonitor:enabled: truehttps: falsekubeProxy:enabled: trueendpoints:- 172.31.38.19- 172.31.41.39service:enabled: trueport: 10249targetPort: 10249
覆盖 ETCD 配置
kubeEtcd:enabled: trueendpoints:- 172.31.38.19
持久化存储

生产环境请务必为 AlertManager、Grafana 和 Prometheus 使用外部存储。如果不这样做,将使用一个 emptyDir,该目录仅在 Pod 生命周期内有效。

即使使用 K3s local-path storage class  也只能提供节点级别的持久化。本文为了方便演示,使用的是 local-path。生产环境建议使用像 Longhorn 这样成熟的集群存储解决方案。

alertmanager:alertmanagerSpec:storage:volumeClaimTemplate:spec:storageClassName: local-pathaccessModes: ["ReadWriteOnce"]resources:requests:storage: 10Giprometheus:prometheusSpec:storageSpec:## Using PersistentVolumeClaim##volumeClaimTemplate:spec:storageClassName: local-pathaccessModes: ["ReadWriteOnce"]resources:requests:storage: 10Gigrafana:persistence:type: pvcenabled: truestorageClassName: local-pathaccessModes: ["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 集群。


http://www.ppmy.cn/news/1148515.html

相关文章

【数据结构】初始化动态分配的顺序表

初始化静态分配的顺序表 #include<stdio.h> #include<stdlib.h> // 这句是用来引用malloc和free函数的 #define initSize 10 // 注意此处的宏定义命名不能跟下面声明的名称一样&#xff0c;不然报错 /* * 动态分配&#xff0c;用malloc函数&#xff0c; * 但是mal…

第二证券:市净率高好还是低好?

市净率是一个衡量公司股票投资价值的指标&#xff0c;通过比较公司股票价格和公司每股净资产的比值来评估公司股票的估值水平。市净率高好还是低好这个问题并没有一个简单的答案&#xff0c;取决于具体的市场环境和投资者的需求。本文将从多个角度分析市净率高好还是低好。 首…

微信小程序--下拉选择框组件封装,可CV直接使用

一、起因 接到的项目需求,查看ui设计图后,由于微信小程序官方设计的下拉选择框不符合需求,而且常用的第三方库也没有封装类似的,所以选择自己自定义组件。在此记录一下,方便日后复用。 ui设计图如下: 微信官方提供的选择框 对比发现并不能实现我们想要的功能。 二、自定义组件…

2023-2024-1 高级语言程序设计实验一: 选择结构

7-1 古时年龄称谓知多少&#xff1f; 输入一个人的年龄&#xff08;岁&#xff09;&#xff0c;判断出他属于哪个年龄段 &#xff1f; 0-9 &#xff1a;垂髫之年&#xff1b; 10-19&#xff1a; 志学之年&#xff1b; 20-29 &#xff1a;弱冠之年&#xff1b; 30-39 &#…

【Java定时任务】crontab定时任务配置(139)

背景 在日常的开发工作中我们经常会遇到定时任务的相关问题&#xff0c;比如&#xff1a; 信用卡定时每月给用户推送账单数据&#xff1b; 轮训更新某个任务的状态是否完成&#xff1b; 设置一个定时提醒&#xff1b; 邮件或消息设置定时发送&#xff1b; 定时统计某个时间段的…

浅谈智能型电动机控制器在斯里兰卡电厂中的应用

摘要&#xff1a;传统的低压电动机保护是通过继电保护二次回路实现&#xff0c;但是我们结合电厂辅助控制设备的特点及其控制要求&#xff0c;推荐ARD2F智能型电动机控制器。以下综合介绍ARD2F智能型电动机控制器产品的特点及其智能化保护、测量、控制和通讯等。 Abstract: Th…

AndroidStudio报错:Plugin with id ‘kotlin-android‘ not found.

第一步 要在自己的项目的build.gradle的buildscript中添加ext.kotlin_version 1.3.72 第二步 然后在dependencies里添加classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 大体如下&#xff1a; buildscript {ext.kotlin_version 1.3.72r…

软件测试/测试开发丨App自动化测试——显示等待高级使用

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27686 一、Wait 等待 强制等待&#xff1a;sleep 不推荐&#xff08;调试时使用&#xff09; 全局隐式等待 在服务端等待driver.implicitly_wait(TIMEOUT…