• 实战指南:使用 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    另外,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"
    
    • 1
    • 2
    • 3
    安装 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 <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.安装 K3s master

    root@ip-172-31-38-19:~# curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - server --cluster-init
    
    • 1

    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 <
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.安装 K3s worker

    root@ip-172-31-41-39:~# curl -sfL https://get.k3s.io | K3S_TOKEN=SECRET sh -s - agent --server https://:6443
    
    • 1

    现在,每个服务都有可用的侦听器,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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    修改 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 <

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
覆盖 ETCD 配置
kubeEtcd:
  enabled: true
  endpoints:
    - 172.31.38.19
  • 1
  • 2
  • 3
  • 4
持久化存储

生产环境请务必为 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
完整的 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
  • 1
  • 2
  • 3
  • 4
  • 5

如果你修改 values.yaml 文件并需要更新版本,请将 install 更改为 upgrade

# helm -n monitoring upgrade prometheus-community prometheus-community/kube-prometheus-stack -f values.yaml
  • 1

验证安装状态:

# 列出所有 namespace 中的 releases
helm list -A
# 列出 monitoring namespace 中的 releases
helm list -n monitoring

# 检查 prometheus stack release 状态
helm status prometheus-community -n monitoring
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

安装完成后,我们就可以访问 Prometheus、Alertmanager、Grafana 的 UI 来查看 K3s 集群的状态:

总 结

监控是运维工作中的重要一环,能够帮你及时发现和解决潜在问题,提高集群的可用性和效率。按照本文的步骤,你可以轻松地使用 kube-prometheus-stack 监控 K3s 集群,确保其稳定性和性能。借助 Prometheus、Alertmanager 和 Grafana,你可以创建交互式仪表板和可视化,深入了解集群的运行状况,为你的应用程序提供更好的支持和管理。希望本文对你有所帮助,让你更好地运维和管理 K3s 集群。

  • 相关阅读:
    宇视科技通过stm32叠加字符串
    HarmonyOS系统中内核实现MQTT协议开发的方法
    2024rk(案例三)
    吴恩达卷积神经网络 笔记,吴恩达 深度神经网络
    【学习笔记之数据结构】时间复杂度与空间复杂度
    Linux内核4.14版本——drm框架分析(12)——DRM_IOCTL_MODE_SETCRTC(drm_mode_setcrtc)
    浅析安全框架-Shiro和Spring Security
    C#:EXCEL列名、列序号之间互相转换
    Scala第十章
    怎么快速入门一种编程语言
  • 原文地址:https://blog.csdn.net/RancherLabs/article/details/133787804