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

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: Prometheus Operator 与 kube-prometheus 之二 - 如何监控 1.23+ kubeadm 集群

简介

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。下面是配置示例:

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"
...
YAML

🐾上面的 .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 的监听地址:

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
BASH

Kube Proxy 组件

📝Notes:

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

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

改动如下:

改动前:

...
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 127.0.0.1:10249
...
YAML

改动后:

kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
YAML

并重启:

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

Etcd 配置

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

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

# 在 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
BASH

验证 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 上执行:

$ 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
BASH

通过 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)],所以我们需要明确覆盖这个值。

kubeEtcd:
  enabled: true
  service:
    enabled: true
    port: 2381
    targetPort: 2381
YAML

Controller Manger 相关配置

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

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

kubeControllerManager:
  enabled: true
  ...
  service:
    enabled: true
    port: null
    targetPort: null
  serviceMonitor:
    enabled: true
    ...
    https: null
    insecureSkipVerify: null
    ...
YAML

Kubernetes Scheduler

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

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

kubeScheduler:
  enabled: true
  ...
  service:
    enabled: true
    port: 10259
    targetPort: 10259
  serviceMonitor:
    enabled: true
    ...
    https: true
    insecureSkipVerify: true
    ...
YAML

Kubernetes Proxy

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

kubeProxy:
  enabled: true
  endpoints: []
  service:
    enabled: true
    port: 10249
    targetPort: 10249
  serviceMonitor:
    enabled: true
    ...
    https: false
  ...
YAML

通过 Helm 安装 kube-prometheus-stack

添加 Helm 仓库:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo list
helm repo update prometheus-community
BASH

安装:

helm upgrade --install \
  --namespace prom \
  --create-namespace \
  -f values.yaml \
  monitor prometheus-community/kube-prometheus-stack
BASH

验证

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

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

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

Controller Manager 监控状态

Kube Proxy 监控状态

Kube Scheduler 监控状态

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

etcd Grafana Dashboard

🎉🎉🎉

📚️ 参考文档

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
21天前
|
存储 数据采集 Prometheus
Grafana Prometheus Altermanager 监控系统
Grafana、Prometheus 和 Alertmanager 是一套强大的开源监控系统组合。Prometheus 负责数据采集与存储,Alertmanager 处理告警通知,Grafana 提供可视化界面。本文简要介绍了这套系统的安装配置流程,包括各组件的下载、安装、服务配置及开机自启设置,并提供了访问地址和重启命令。适用于希望快速搭建高效监控平台的用户。
94 20
|
17天前
|
Prometheus 监控 Cloud Native
Prometheus+Grafana监控Linux主机
通过本文的步骤,我们成功地在 Linux 主机上使用 Prometheus 和 Grafana 进行了监控配置。具体包括安装 Prometheus 和 Node Exporter,配置 Grafana 数据源,并导入预设的仪表盘来展示监控数据。通过这种方式,可以轻松实现对 Linux 主机的系统指标监控,帮助及时发现和处理潜在问题。
92 7
|
23天前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
164 3
|
23天前
|
Prometheus 监控 Cloud Native
无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?
Prometheus 是一个完全开源的系统监控和告警工具包,受 Google 内部 BorgMon 系统启发,自2012年由前 Google 工程师在 SoundCloud 开发以来,已被众多公司采用。它拥有活跃的开发者和用户社区,现为独立开源项目,并于2016年加入云原生计算基金会(CNCF)。Prometheus 的主要特点包括多维数据模型、灵活的查询语言 PromQL、不依赖分布式存储、通过 HTTP 拉取时间序列数据等。其架构简单且功能强大,支持多种图形和仪表盘展示模式。安装和使用 Prometheus 非常简便,可以通过 Docker 快速部署,并与 Grafana 等可
124 2
|
1月前
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
72 8
|
2月前
|
存储 Prometheus 监控
监控堆外第三方监控工具Prometheus
监控堆外第三方监控工具Prometheus
58 3
|
2月前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
59 3
|
2月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
323 3
|
5月前
|
Prometheus 监控 Cloud Native
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
|
2月前
|
Prometheus 监控 Cloud Native
在 HBase 集群中,Prometheus 通常监控哪些类型的性能指标?
在 HBase 集群中,Prometheus 监控关注的核心指标包括 Master 和 RegionServer 的进程存在性、RPC 请求数、JVM 内存使用率、磁盘和网络错误、延迟和吞吐量、资源利用率及 JVM 使用信息。通过 Grafana 可视化和告警规则,帮助管理员实时监控集群性能和健康状况。