「OBSERVABILITY」- kube-prometheus-stack

认识

官网:
文档:https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/README.md
仓库:https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

在任何 Kubernetes 环境中,都可以使用 kube-prometheus-stack 工具栈,包括公共云,私有云和混合云。它主要用于监控 Kubernetes 集群的性能和健康状况,包括节点、服务、应用等的监控。同时,它也可用于业务指标的收集和分析,帮助开发者和运维人员更好地理解和优化应用。

kube-prometheus-stack 是一个 Kubernetes 的监控套装,包括 Prometheus,Alertmanager,Prometheus node-exporter,Grafana,kube-state-metrics 和 Prometheus Operator。这个堆栈为我们提供了一种在 Kubernetes 环境中部署和管理 Prometheus 和相关组件的有效方法。

The prometheus-community/kube-prometheus-stack helm chart provides a similar feature set to kube-prometheus)This chart is maintained by the Prometheus community)For more information, please see the chart’s readme.

该项目是 kube-prometheus 的 Helm Chart 版本,使得我们能够通过 Helm 来部署和管理。

组成

kube-prometheus-stack 主要由以下几个组件组成:

  • Prometheus:提供度量收集和存储的功能。
  • Alertmanager:处理由 Prometheus 生成的警报。
  • Prometheus node-exporter:收集硬件和操作系统的度量标准。
  • Grafana:用于可视化度量数据。
  • kube-state-metrics:用于生成关于 kubernetes 对象状态的度量标准。
  • Prometheus Operator:简化 Prometheus 和 Alertmanager 在 Kubernetes 中的部署和管理。

性质

其提供了完全自动化的部署,适应在 Kubernetes 环境中快速、容易地部署和管理监控系统。它还提供了高度可配置的警报和仪表板,可以根据你的需要定制。

此外,它还支持多种度量数据源,提供了高度灵活性。

nameOverride: “kps”
fullnameOverride: “kps”

提供 Grafana 的配置

其依赖 subChart grafana,所以能够使用 grafana 配置:

提供 kube-state-metrics 配置

针对该组件,其默认使用 registry.k8s.io 仓库,查看 chart 内部,得知修改 kube-state-metrics 镜像地址方法:

kube-state-metrics:
  image:
    registry: registry.devops.example.com/google_containers/registry.k8s.io

# 其相关的其他参数,参考:https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-state-metrics/values.yaml

提供 Prometheus 配置

prometheus.prometheusSpec.storageSpec:

How to apply external labels? · Issue #455 · prometheus-operator/prometheus-operator
prometheus.prometheusSpec.externalLabels 来增加额外的标签,例如向告警消息增加额外的标签,以进行区分来源;

针对 etcd 配置

[kube-prometheus-stack] KubeScheduler & Etcd & CubeController-Manager …
[prometheus-kube-stack] Target Kubelet 0/0 up and others are down · Issue #204
serviceMonitor/default/kube-prometheus-stack-kube-etcd detect …

部署 kube-prometheus-stack 组件,但是无法抓取 etcd 指标。

根据 [prometheus-kube-stack] Target Kubelet 0/0 up and others are down · Issue #204 页面,增加如下配置,依旧无法成功。

kubectl create secret generic etcd-client-cert \
    --from-file=/etc/kubernetes/pki/etcd/ca.crt \
    --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
    --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key

prometheus:
  prometheusSpec:
    secrets: ['etcd-client-cert']

kubeEtcd:
  serviceMonitor:
   scheme: https
   insecureSkipVerify: false
   serverName: localhost
   caFile: /etc/prometheus/secrets/etcd-client-cert/ca.crt
   certFile: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.crt
   keyFile: /etc/prometheus/secrets/etcd-client-cert/healthcheck-client.key

具体问题具体分析,通过 Promethues Web UI 界面,我们发现其抓取 master-node-ip-address:2381 地址,但是 etcd –listen-metrics-urls=http://127.0.0.1:2381 地址,进而导致无法成功抓取。

解决方案,通过 kubeadm 命令,修改 etcd –listen-metrics-urls 参数,使其监听 0.0.0.0(或,节点地址)。

补充说明:部署 kube-prometheus-stack 服务时,其部署 Headless Service kube-system/kube-etcd 服务,然后通过 kubernetes_sd_config.endpoints 来发现 etcd 实例。我们没有调整 kube-prometheus-stack 的方法,所以我们修改 etcd 的指标接口监听配置。

提供 kube-controller-manager 配置

类似 etcd 配置,但是修改 –bind-address 参数。

提供 kube-scheduler 配置

类似 etcd 配置,但是修改 –bind-address 参数。

提供 kube-proxy 配置

修改 ConfigMap 配置,将 metricsBindAddress 设置为 0.0.0.0 并重启 kube-proxy 即可。

提供 kubelet 配置

针对部分云集群,需要关闭 kubelet 监控:

  • kubelet.enabled: false
  • defaultRules.rules.kubelet: false
  • prometheusOperator.kubeletService.enabled: false

注 1:具体配置与 Chart 版本相关,该处仅作参考;

构建

版本选择

# 02/28/2024

在 kube-prometheus-stack 中,我们未找到其版本与 Kubernetes 集群版本的对应关系。

所以,我们直接部署最新版本 kube-prometheus-stack-56.12.0 on Kubernetes v1.25.14

下载文件

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update prometheus-community
helm search repo prometheus-community/kube-prometheus-stack

helm pull prometheus-community/kube-prometheus-stack

应用

服务部署

helm show values kube-prometheus-stack-xxx.tgz > kube-prometheus-stack-xxx.tgz.helm-values.yaml

vim kube-prometheus-stack-xxx.tgz.helm-values.yaml
... Ingress
... StorageClass
... Registry

helm upgrade --install                                     \
    kps                                                    \
    kube-prometheus-stack-xxx.tgz -f kube-prometheus-stack-xxx.tgz.helm-values.yaml

改进

kube-prometheus-stack | 常见问题处理

additionalDatasources not working

[prometheus-kube-stack] Additional datasource are not added to configmap correctly · Issue #2251

在 additionalDataSources 中,添加配置,然后进入 xxx-grafana-0 容器,我们能够看到新增的配置。

但是,Grafana Datasource 并没有更新。

查看 xxx-grafana-0 日志,

logger=authn.service t=2024-03-18T10:56:29.574590713Z level=info msg=”Failed to authenticate request” client=auth.client.basic error=”[password-auth.failed] too many consecutive incorrect login attempts for user – login for user temporarily blocked”

logger=context userId=0 orgId=0 uname= t=2024-03-18T10:56:29.574630286Z level=info msg= error=”[password-auth.failed] too many consecutive incorrect login attempts for user – login for user temporarily blocked” remote_addr=[::1] traceID=

logger=context userId=0 orgId=0 uname= t=2024-03-18T10:56:29.574713358Z level=info msg=”Request Completed” method=POST path=/api/admin/provisioning/dashboards/reload status=401 remote_addr=[::1] time_ms=0 duration=401.017µs size=121 referer= handler=/api/admin/provisioning/dashboards/reload

我们推测是因为执行 datasource reload 的容器没有提供正确的密码。

我们尝试修改 helm chart values.yaml 文件的 adminPassword 字段,问题得以解决。

参考

prometheus-community/helm-charts: Prometheus community Helm charts
从认识、组成、性质、应用、改进方面来介绍 kube-prometheus-stack —— ChatGPT 4.0