前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Prometheus Operator与kube-prometheus之二-如何监控1.23+ kubeadm集群

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

作者头像
东风微鸣
发布2022-12-01 16:13:46
5780
发布2022-12-01 16:13:46
举报

简介

•系列文章: 标签 - Prometheus - 东风微鸣技术博客 (ewhisper.cn)[1]•Prometheus Operator 的上一篇: Prometheus Operator 与 kube-prometheus 之一 - 简介 - 东风微鸣技术博客 (ewhisper.cn)[2]

kube-prometheus-stack[3]捆绑了监控Kubernetes 集群所需的Prometheus Operator、Exporter、Rule、Grafana 和 AlertManager。

但要为使用kubeadm[4]构建的Kubernetes集群定制Helm安装,还是有必要进行定制。

这一次结合近期比较新的 Kubernetes 版本 v1.23+, 以及较为常见的安装方式 kubeadm[5], 来实战说明:

•kubeadm 需要哪些特殊配置•如何安装 Prometheus Operator: 通过 kube-prometheus-stack helm chart[6]•如何配置对 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[7]。下面是配置示例:

代码语言:javascript
复制
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 的监听地址:

代码语言:javascript
复制
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.

改动如下:

改动前:

代码语言:javascript
复制
...
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 127.0.0.1:10249
...

改动后:

代码语言:javascript
复制
kind: KubeProxyConfiguration
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249

并重启:

代码语言:javascript
复制
kubectl -n kube-system rollout restart daemonset/kube-proxy

Etcd 配置

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

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

代码语言:javascript
复制
# 在 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 上执行:

代码语言:javascript
复制
$ 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 步:

•如何安装 Prometheus Operator: 通过 kube-prometheus-stack helm chart[9]•如何配置对 kubeadm 安装的集群的组件监控

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

为 Prometheus 和 AlertManager 配置持久化存储

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

•Prometheus 的配置改这里[11]•AlertManager 的配置改这里[12]

etcd 相关配置

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

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
kubeScheduler:
  enabled: true
  ...
  service:
    enabled: true
    port: 10259
    targetPort: 10259
  serviceMonitor:
    enabled: true
    ...
    https: true
    insecureSkipVerify: true
    ...

Kubernetes Proxy

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

代码语言:javascript
复制
kubeProxy:
  enabled: true
  endpoints: []
  service:
    enabled: true
    port: 10249
    targetPort: 10249
  serviceMonitor:
    enabled: true
    ...
    https: false
  ...

通过 Helm 安装 kube-prometheus-stack

添加 Helm 仓库:

代码语言:javascript
复制
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo list
helm repo update prometheus-community

安装:

代码语言:javascript
复制
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

🎉🎉🎉

References

[1] 标签 - Prometheus - 东风微鸣技术博客 (ewhisper.cn): https://ewhisper.cn/tags/Prometheus/ [2] Prometheus Operator 与 kube-prometheus 之一 - 简介 - 东风微鸣技术博客 (ewhisper.cn): https://ewhisper.cn/posts/14778/ [3] kube-prometheus-stack: https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack [4] kubeadm: https://kubernetes.io/docs/reference/setup-tools/kubeadm/ [5] kubeadm: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ [6] kube-prometheus-stack helm chart: https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack [7] kubeadm config file: https://kubernetes.io/docs/reference/generated/kubeadm/#config-file [8] Prometheus Operator 监控 etcd 集群-阳明的博客: https://www.qikqiak.com/post/prometheus-operator-monitor-etcd/ [9] kube-prometheus-stack helm chart: https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack [10] values.yaml: https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml [11] Prometheus 的配置改这里: https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml#L2595 [12] AlertManager 的配置改这里: https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml#L546 [13] 默认值: 2379: https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml#L1288 [14] Deploy to kubeadm - Prometheus Operator (prometheus-operator.dev): https://prometheus-operator.dev/docs/kube/kube-prometheus-on-kubeadm/ [15] Prometheus: installing kube-prometheus-stack on a kubeadm cluster | Fabian Lee : Software Engineer: https://fabianlee.org/2022/07/08/prometheus-installing-kube-prometheus-stack-on-a-kubeadm-cluster/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 前提条件
  • kubeadm 需要哪些特殊配置
    • Controller Manager 和 Scheduler 组件
      • Kube Proxy 组件
        • Etcd 配置
          • 验证 kubeadm 配置
          • 通过 kube-prometheus-stack 安装并定制 helm values
            • 为 Prometheus 和 AlertManager 配置持久化存储
              • etcd 相关配置
                • Controller Manger 相关配置
                  • Kubernetes Scheduler
                    • Kubernetes Proxy
                      • 通过 Helm 安装 kube-prometheus-stack
                        • 验证
                          • References
                          相关产品与服务
                          容器服务
                          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档