Prometheus Operator 与 kube-prometheus 之二 - 如何监控 1.23+ kubeadm 集群

本文最后更新于:2024年7月25日 下午

简介

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
2
3
4
5
6
7
8
9
10
11
12
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
...
controllerManager:
extraArgs:
bind-address: "0.0.0.0"
scheduler:
extraArgs:
bind-address: "0.0.0.0"
...
kubernetesVersion: "v1.23.1"
...

🐾上面的 .scheduler.extraArgs.controllerManager.extraArgs。这样就把 kube-controller-managerkube-scheduler 服务暴露给集群的其他组件。

另外,如果你把 kubernetes 核心组件作为 pods 放在 kube-system namespace,就要确保 kube-prometheus-exporter-kube-schedulerkube-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
2
sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -e "s/- --bind-address=127.0.0.1/- --bind-address=0.0.0.0/" -i /etc/kubernetes/manifests/kube-scheduler.yaml

Kube Proxy 组件

📝Notes:
一般情况下,kube-proxy 总是绑定所有地址的,但是对应的 metricsBindAddress 可能并不一定会 follow 配置。具体如下面的 "改动前"

对于 Kube Proxy 组件,在使用 kubeadm 安装完成之后,需要修改 kube-system 下的 configmap kube-proxy 的 metricsBindAddress.

改动如下:

改动前:

1
2
3
4
5
...
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 127.0.0.1:10249
...

改动后:

1
2
3
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249

并重启:

1
kubectl -n kube-system rollout restart daemonset/kube-proxy

Etcd 配置

Etcd 配置,这里就不详细说明了,可以直接参见: Prometheus Operator 监控 etcd 集群 - 阳明的博客

但是上面链接提到的方法比较麻烦,推荐一个更简单的:可以在 etcd 的配置中加上监听 Metrics URL 的 flag:

1
2
3
# 在 etcd 所在的机器上
master_ip=192.168.1.5
sed -i "s#--listen-metrics-urls=.*#--listen-metrics-urls=http://127.0.0.1:2381,http://$master_ip:2381#" /etc/kubernetes/manifests/etcd.yaml

验证 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
2
3
4
5
6
7
8
9
10
11
12
$ sudo netstat -tulnp | grep -e 10257 -e 10259 -e 10249 -e 2381
tcp 0 0 192.168.1.5:2381 0.0.0.0:* LISTEN 1400/etcd
tcp 0 0 127.0.0.1:2381 0.0.0.0:* LISTEN 1400/etcd
tcp6 0 0 :::10257 :::* LISTEN 1434/kube-controlle
tcp6 0 0 :::10259 :::* LISTEN 1486/kube-scheduler
tcp6 0 0 :::10249 :::* LISTEN 4377/kube-proxy

# 测试etcd指标
curl -k http://localhost:2381/metrics

# 测试 kube-proxy 指标
curl -k http://localhost:10249/metrics

通过 kube-prometheus-stack 安装并定制 helm values

这里直接完成上面提到的 2 步:

在我们用 Helm 安装 kube-prometheus-stack 之前,我们需要创建一个 values.yaml 来调整 kubeadm 集群的默认 chart value。

为 Prometheus 和 AlertManager 配置持久化存储

推荐要为 Prometheus 和 AlertManager 配置持久化存储,而不要直接使用 emptyDir.
存储具体如何配置根据您的集群的实际情况来,这边就不做过多介绍.

etcd 相关配置

Kubeadm etcd 监控的端口是 2381(而不是 Helm chart 中指定的默认值: 2379)],所以我们需要明确覆盖这个值。

1
2
3
4
5
6
kubeEtcd:
enabled: true
service:
enabled: true
port: 2381
targetPort: 2381

Controller Manger 相关配置

这里不需要做太多配置,关于 https 和 端口,如果相关 key 为空或未设置,该值将根据目标 Kubernetes 版本动态确定,原因是默认端口在 Kubernetes 1.22 中的变化。注意下面的: .kubeControllerManager.service.port.kubeControllerManager.service.targetPort 以及 .kubeControllerManager.serviceMonitor.https.kubeControllerManager.serviceMonitor.insecureSkipVerify.

如果配置后监控抓不到或有异常,可以按实际情况调整.

1
2
3
4
5
6
7
8
9
10
11
12
13
kubeControllerManager:
enabled: true
...
service:
enabled: true
port: null
targetPort: null
serviceMonitor:
enabled: true
...
https: null
insecureSkipVerify: null
...

Kubernetes Scheduler

同上,这里不需要做太多配置,关于 https 和 端口,如果相关 key 为空或未设置,该值将根据目标 Kubernetes 版本动态确定,原因是默认端口在 Kubernetes 1.23 中的变化。注意下面的: .kubeScheduler.service.port.kubeScheduler.service.targetPort 以及 .kubeScheduler.serviceMonitor.https.kubeScheduler.serviceMonitor.insecureSkipVerify.

如果配置后监控抓不到或有异常,可以按实际情况调整.

1
2
3
4
5
6
7
8
9
10
11
12
13
kubeScheduler:
enabled: true
...
service:
enabled: true
port: 10259
targetPort: 10259
serviceMonitor:
enabled: true
...
https: true
insecureSkipVerify: true
...

Kubernetes Proxy

也是如此,根据 是否 https 和 端口进行调整,如下:

1
2
3
4
5
6
7
8
9
10
11
12
kubeProxy:
enabled: true
endpoints: []
service:
enabled: true
port: 10249
targetPort: 10249
serviceMonitor:
enabled: true
...
https: false
...

通过 Helm 安装 kube-prometheus-stack

添加 Helm 仓库:

1
2
3
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo list
helm repo update prometheus-community

安装:

1
2
3
4
5
helm upgrade --install \
--namespace prom \
--create-namespace \
-f values.yaml \
monitor prometheus-community/kube-prometheus-stack

验证

这里主要验证 kubeadm 的 Kubernetes 组件有没有正常监控到,可以通过 Prometheus UI 或 Grafana UI 直接查看进行验证.

可以通过 Ingress 或 NodePort 将 Prometheus UI 或 Grafana UI 地址暴露出去,然后访问:

Status -> Targets 查看监控状态,这里举几个组件来进行说明:

Controller Manager 监控状态

Kube Proxy 监控状态

Kube Scheduler 监控状态

Grafana 可以直接登录后查看对应的仪表板,如下图:

etcd Grafana Dashboard

🎉🎉🎉

📚️ 参考文档


Prometheus Operator 与 kube-prometheus 之二 - 如何监控 1.23+ kubeadm 集群
https://ewhisper.cn/posts/3988/
作者
东风微鸣
发布于
2022年8月24日
许可协议