Prometheus Operator 与 kube-prometheus 之二 - 如何监控 1.23+ kubeadm 集群
本文最后更新于:2024年7月24日 晚上
简介
- 系列文章: 标签 - Prometheus - 东风微鸣技术博客 (ewhisper.cn)
- Prometheus Operator 的上一篇: Prometheus Operator 与 kube-prometheus 之一 - 简介 - 东风微鸣技术博客 (ewhisper.cn)
kube-prometheus-stack捆绑了监控 Kubernetes 集群所需的 Prometheus Operator、Exporter、Rule、Grafana 和 AlertManager。
但要为使用 kubeadm 构建的 Kubernetes 集群定制 Helm 安装,还是有必要进行定制。
这一次结合近期比较新的 Kubernetes 版本 v1.23+, 以及较为常见的安装方式 kubeadm, 来实战说明:
- kubeadm 需要哪些特殊配置
- 如何安装 Prometheus Operator: 通过 kube-prometheus-stack helm chart
- 如何配置对 kubeadm 安装的集群的组件监控
开始!
前提条件
- kubeadm
- helm3
kubeadm 需要哪些特殊配置
为了后面能够正常通过 Prometheus Operator 获取到 kubeadm 搭建的 Kubernetes v1.23+ 集群的指标, 需要对 kubeadm 做一些特殊配置.
默认情况下,kubeadm 将它的几个管理组件绑定到 node 的 localhost
127.0.0.1
地址上, 涉及到: Kube Controller Manager、Kube Proxy 和 Kube Scheduler。
然而,对于监控来说,我们需要这些端点的暴露,以便他们的指标可以被 Prometheus 提取。因此,我们需要将这些组件暴露在他们的 0.0.0.0 地址上。
当登录到 kubeadm 主节点时,运行以下修改:
Controller Manager 和 Scheduler 组件
默认情况下,kubeadm
并没有公开我们要监控的两个服务(kube-controller-manager 和 kube-scheduler)。因此,为了充分利用kube-prometheus-stack
helm chart,我们需要对 Kubernetes 集群做一些快速调整。后面我们会监控 kube-controller-manager 和 kube-scheduler,我们必须将它们的地址端口暴露给集群。
默认情况下,kubeadm 在你的主机上运行这些 pod,并绑定到 127.0.0.1。有几种方法可以改变这一点。建议改变这些配置的方法是使用 kubeadm config file。下面是配置示例:
1 |
|
🐾上面的 .scheduler.extraArgs
和 .controllerManager.extraArgs
。这样就把 kube-controller-manager
和 kube-scheduler
服务暴露给集群的其他组件。
另外, 如果你把 kubernetes 核心组件作为 pods 放在 kube-system namespace,就要确保 kube-prometheus-exporter-kube-scheduler
和 kube-prometheus-exporter-kube-controller-manager
service (这 2 个 service 是 kube-prometheus-stack 创建出来用于 Prometheus Operator 通过 ServiceMonitor 监控这两个组件用的) 的spec.selector
值与 pods 的值一致。
如果你已经有一个部署了 kubeadm 的 Kubernetes,可以直接 kube-controller-manager 和 kube-scheduler 的监听地址:
1 |
|
Kube Proxy 组件
📝Notes:
一般情况下, kube-proxy 总是绑定所有地址的, 但是对应的metricsBindAddress
可能并不一定会 follow 配置. 具体如下面的 " 改动前 "
对于 Kube Proxy 组件, 在使用 kubeadm 安装完成之后, 需要修改 kube-system 下的 configmap kube-proxy 的 metricsBindAddress
.
改动如下:
改动前:
1 |
|
改动后:
1 |
|
并重启:
1 |
|
Etcd 配置
Etcd 配置, 这里就不详细说明了, 可以直接参见: Prometheus Operator 监控 etcd 集群 - 阳明的博客
但是上面链接提到的方法比较麻烦, 推荐一个更简单的: 可以在 etcd 的配置中加上监听 Metrics URL 的 flag:
1 |
|
验证 kubeadm 配置
小结一下, 通过之前的这些配置, Kubernetes 组件的 Metrics 监听端口分别为:
- Controller Manager: (Kubernetes v1.23+)
- 端口: 10257
- 协议: https
- Scheduler: (Kubernetes v1.23+)
- 端口: 10259
- 协议: https
- Kube Proxy
- 端口: 10249
- 协议: http
- etcd
- 端口: 2381
- 协议: http
可以通过 netstat
命令查看之前的配置是否全部生效:
在 master 和 etcd node 上执行:
1 |
|
通过 kube-prometheus-stack 安装并定制 helm values
这里直接完成上面提到的 2 步:
- 如何安装 Prometheus Operator: 通过 kube-prometheus-stack helm chart
- 如何配置对 kubeadm 安装的集群的组件监控
在我们用 Helm 安装 kube-prometheus-stack 之前,我们需要创建一个 values.yaml 来调整 kubeadm 集群的默认 chart value。
为 Prometheus 和 AlertManager 配置持久化存储
推荐要为 Prometheus 和 AlertManager 配置持久化存储, 而不要直接使用 emptyDir.
存储具体如何配置根据您的集群的实际情况来, 这边就不做过多介绍.
etcd 相关配置
Kubeadm etcd 监控的端口是 2381(而不是 Helm chart 中指定的 默认值: 2379)],所以我们需要明确覆盖这个值。
1 |
|
Controller Manger 相关配置
这里不需要做太多配置, 关于 https 和 端口, 如果相关 key 为空或未设置,该值将根据目标 Kubernetes 版本动态确定,原因是默认端口在 Kubernetes 1.22 中的变化。注意下面的: .kubeControllerManager.service.port
和 .kubeControllerManager.service.targetPort
以及 .kubeControllerManager.serviceMonitor.https
和 .kubeControllerManager.serviceMonitor.insecureSkipVerify
.
如果配置后监控抓不到或有异常, 可以按实际情况调整.
1 |
|
Kubernetes Scheduler
同上, 这里不需要做太多配置, 关于 https 和 端口, 如果相关 key 为空或未设置,该值将根据目标 Kubernetes 版本动态确定,原因是默认端口在 Kubernetes 1.23 中的变化。注意下面的: .kubeScheduler.service.port
和 .kubeScheduler.service.targetPort
以及 .kubeScheduler.serviceMonitor.https
和 .kubeScheduler.serviceMonitor.insecureSkipVerify
.
如果配置后监控抓不到或有异常, 可以按实际情况调整.
1 |
|
Kubernetes Proxy
也是如此, 根据 是否 https 和 端口进行调整, 如下:
1 |
|
通过 Helm 安装 kube-prometheus-stack
添加 Helm 仓库:
1 |
|
安装:
1 |
|
验证
这里主要验证 kubeadm 的 Kubernetes 组件有没有正常监控到, 可以通过 Prometheus UI 或 Grafana UI 直接查看进行验证.
可以通过 Ingress 或 NodePort 将 Prometheus UI 或 Grafana UI 地址暴露出去, 然后访问:
Status -> Targets 查看监控状态, 这里举几个组件来进行说明:
Grafana 可以直接登录后查看对应的仪表板, 如下图:
🎉🎉🎉
📚️ 参考文档
- helm-charts/charts/kube-prometheus-stack at main · prometheus-community/helm-charts (github.com)
- Deploy to kubeadm - Prometheus Operator (prometheus-operator.dev)
- Prometheus Operator 监控 etcd 集群 - 阳明的博客
- Prometheus: installing kube-prometheus-stack on a kubeadm cluster | Fabian Lee : Software Engineer