Skip to content
SRE运维进阶之路SRE运维进阶之路
github icon
  • kubernetes

    • Kubernetes 学习笔记
      • 集群搭建

        • 使用 ansible 快速搭建 k8s 集群
        • 常见应用安装配置

          • Harbor 安装配置(k8s)
            • Harbor 高可用搭建(docker-compose)
              • Rancher 安装配置
                • Helm 安装配置
                • 容器运行时

                  • k8s 适配 GPU
                    • Kata2 尝试
                    • 存储

                      • Longorn 安装配置
                        • 使用 Rook 快速搭建 Ceph 集群
                        • 服务发现与路由

                          • ingress-nginx 安装配置
                          • 集群网络

                            • CNI
                              • Calico
                              • 监控告警

                                • Prometheus Operator 安装配置
                                  • 一、概述
                                    • Prometheus
                                      • Alertmanager
                                        • ThanosRuler
                                          • ServiceMonitor
                                            • PodMonitor
                                              • Probe
                                                • PrometheusRule
                                                  • AlertmanagerConfig
                                                  • 二、安装
                                                    • Helm 安装配置
                                                      • Prometheus 安装配置
                                                        • 查找 grafana admin 账户密码
                                                        • 三、配置报警
                                                          • 参考链接
                                                        • 实用技巧

                                                          • 运维手册

                                                            • etcd 备份恢复
                                                              • velero 备份恢复
                                                                • k8s 开启审计日志
                                                                  • 内核版本升级
                                                                    • 使用 kubeadm 手动更新证书
                                                                      • 为 k8s node 配置资源预留
                                                                        • 利用LXCFS提升容器资源可见性
                                                                        • 最佳实践

                                                                          • k8s node 配置资源预留
                                                                            • 性能压测指标及方法
                                                                              • CPU 绑核
                                                                              • 集群排障

                                                                                • 如何更新Terminating状态的命名空间
                                                                                  • 卸载 rancher 导致 node 被清空
                                                                                    • lvs 健康检查 k8s apiserver
                                                                                      • k8s 更改apiserver使用强加密算法
                                                                                      • 教程|项目|博客|文章推荐
                                                                                        • 附录

                                                                                          • 快捷命令

                                                                                        Prometheus Operator 安装配置

                                                                                        author iconClaycalendar icon2022年1月6日category icon
                                                                                        • 云原生
                                                                                        tag icon
                                                                                        • Kubernetes
                                                                                        timer icon大约 8 分钟

                                                                                        此页内容
                                                                                        • 一、概述
                                                                                          • Prometheus
                                                                                          • Alertmanager
                                                                                          • ThanosRuler
                                                                                          • ServiceMonitor
                                                                                          • PodMonitor
                                                                                          • Probe
                                                                                          • PrometheusRule
                                                                                          • AlertmanagerConfig
                                                                                        • 二、安装
                                                                                          • Helm 安装配置
                                                                                          • Prometheus 安装配置
                                                                                          • 查找 grafana admin 账户密码
                                                                                        • 三、配置报警
                                                                                        • 参考链接

                                                                                        # Prometheus Operator 安装配置

                                                                                        # 一、概述

                                                                                        首先Prometheus整体监控结构略微复杂,一个个部署并不简单。另外监控Kubernetes就需要访问内部数据,必定需要进行认证、鉴权、准入控制,

                                                                                        那么这一整套下来将变得难上加难,而且还需要花费一定的时间,如果你没有特别高的要求,还是建议选用开源比较好的一些方案。

                                                                                        在k8s初期使用Heapster+cAdvisor方式监控,这是Prometheus Operator出现之前的k8s监控方案。后来出现了Prometheus Operator,但是目前Prometheus Operator已经不包含完整功能,完整的解决方案已经变为kube-prometheus。项目地址为:

                                                                                        https://github.com/prometheus-operator/kube-prometheus

                                                                                        关于kube-prometheus目前应该是开源最好的方案了,该存储库收集Kubernetes清单,Grafana仪表板和Prometheus规则,以及文档和脚本,以使用Prometheus Operator 通过Prometheus提供易于操作的端到端Kubernetes集群监视。以容器的方式部署到k8s集群,而且还可以自定义配置,非常的方便。

                                                                                        首先我们先来了解下 Prometheus Operator 的架构图:

                                                                                        promtheus opeator

                                                                                        上图是 Prometheus-Operator 官方提供的架构图,各组件以不同的方式运行在 Kubernetes 集群中,其中 Operator 是最核心的部分,作为一个控制器,他会去创建 Prometheus、ServiceMonitor、AlertManager 以及 PrometheusRule 等 CRD 资源对象,然后会一直 Watch 并维持这些资源对象的状态。

                                                                                        在最新版本的 Operator 中提供了一下几个 CRD 资源对象:

                                                                                        • Prometheus
                                                                                        • Alertmanager
                                                                                        • ServiceMonitor
                                                                                        • PodMonitor
                                                                                        • Probe
                                                                                        • ThanosRuler
                                                                                        • PrometheusRule
                                                                                        • AlertmanagerConfig

                                                                                        # Prometheus

                                                                                        该 CRD 声明定义了 Prometheus 期望在 Kubernetes 集群中运行的配置,提供了配置选项来配置副本、持久化、报警实例等。

                                                                                        对于每个 Prometheus CRD 资源,Operator 都会以 StatefulSet 形式在相同的命名空间下部署对应配置的资源,Prometheus Pod 的配置是通过一个包含 Prometheus 配置的名为 <prometheus-name> 的 Secret 对象声明挂载的。

                                                                                        该 Secret 以 prometheus.yaml.gz 为 key 的方式保存使用配置文件。

                                                                                        该 CRD 根据标签选择来指定部署的 Prometheus 实例应该覆盖哪些 ServiceMonitors,然后 Operator 会根据包含的 ServiceMonitors 生成配置,并在包含配置的 Secret 中进行更新。

                                                                                        如果未提供对 ServiceMonitor 的选择,则 Operator 会将 Secret 的管理留给用户,这样就可以提供自定义配置,同时还能享受 Operator 管理 Operator 的设置能力。

                                                                                        # Alertmanager

                                                                                        该 CRD 定义了在 Kubernetes 集群中运行的 Alertmanager 的配置,同样提供了多种配置,包括持久化存储。

                                                                                        对于每个 Alertmanager 资源,Operator 都会在相同的命名空间中部署一个对应配置的 StatefulSet,Alertmanager Pods 被配置为包含一个名为 <alertmanager-name> 的 Secret,该 Secret 以 alertmanager.yaml 为 key 的方式保存使用的配置文件。

                                                                                        当有两个或更多配置的副本时,Operator 会在高可用模式下运行 Alertmanager 实例。

                                                                                        # ThanosRuler

                                                                                        该 CRD 定义了一个 Thanos Ruler 组件的配置,以方便在 Kubernetes 集群中运行。通过 Thanos Ruler,可以跨多个Prometheus 实例处理记录和警报规则。

                                                                                        一个 ThanosRuler 实例至少需要一个 queryEndpoint,它指向 Thanos Queriers 或 Prometheus 实例的位置。queryEndpoints 用于配置 Thanos 运行时的 --query 参数,更多信息也可以在 Thanos 文档open in new window中找到。

                                                                                        # ServiceMonitor

                                                                                        该 CRD 定义了如何监控一组动态的服务,使用标签选择来定义哪些 Service 被选择进行监控。这可以让团队制定一个如何暴露监控指标的规范,然后按照这些规范自动发现新的服务,而无需重新配置。

                                                                                        为了让 Prometheus 监控 Kubernetes 内的任何应用,需要存在一个 Endpoints 对象,Endpoints 对象本质上是IP地址的列表,通常 Endpoints 对象是由 Service 对象来自动填充的,Service 对象通过标签选择器匹配 Pod,并将其添加到Endpoints 对象中。一个 Service 可以暴露一个或多个端口,这些端口由多个 Endpoints 列表支持,这些端点一般情况下都是指向一个 Pod。

                                                                                        Prometheus Operator 引入的这个 ServiceMonitor 对象就会发现这些 Endpoints 对象,并配置 Prometheus 监控这些 Pod。ServiceMonitorSpec 的 endpoints 部分就是用于配置这些 Endpoints 的哪些端口将被 scrape 指标的。

                                                                                        ⚠️ endpoints(小写)是 ServiceMonitor CRD 中的字段,而 Endpoints(大写)是 Kubernetes 的一种对象。

                                                                                        ServiceMonitors 以及被发现的目标都可以来自任何命名空间,这对于允许跨命名空间监控的场景非常重要。使用 PrometheusSpec 的 ServiceMonitorNamespaceSelector,可以限制各自的 Prometheus 服务器选择的 ServiceMonitors 的命名空间。使用 ServiceMonitorSpec 的 namespaceSelector,可以限制 Endpoints 对象被允许从哪些命名空间中发现,要在所有命名空间中发现目标,namespaceSelector 必须为空:

                                                                                        spec:
                                                                                          namespaceSelector:
                                                                                            any: true
                                                                                        
                                                                                        1
                                                                                        2
                                                                                        3

                                                                                        # PodMonitor

                                                                                        该 CRD 用于定义如何监控一组动态 pods,使用标签选择来定义哪些 pods 被选择进行监控。同样团队中可以制定一些规范来暴露监控的指标。

                                                                                        Pod 是一个或多个容器的集合,可以在一些端口上暴露 Prometheus 指标。

                                                                                        由 Prometheus Operator 引入的 PodMonitor 对象会发现这些 Pod,并为 Prometheus 服务器生成相关配置,以便监控它们。

                                                                                        PodMonitorSpec 中的 PodMetricsEndpoints 部分,用于配置 Pod 的哪些端口将被 scrape 指标,以及使用哪些参数。

                                                                                        PodMonitors 和发现的目标可以来自任何命名空间,这同样对于允许跨命名空间的监控用例是很重要的。使用 PodMonitorSpec 的 namespaceSelector,可以限制 Pod 被允许发现的命名空间,要在所有命名空间中发现目标,namespaceSelector 必须为空:

                                                                                        spec:
                                                                                          namespaceSelector:
                                                                                            any: true
                                                                                        
                                                                                        1
                                                                                        2
                                                                                        3

                                                                                        PodMonitor 和 ServieMonitor 最大的区别就是不需要有对应的 Service。

                                                                                        # Probe

                                                                                        该 CRD 用于定义如何监控一组 Ingress 和静态目标。除了 target 之外,Probe 对象还需要一个 prober,它是监控的目标并为 Prometheus 提供指标的服务。例如可以通过使用 blackbox-exporteropen in new window 来提供这个服务。

                                                                                        # PrometheusRule

                                                                                        用于配置 Prometheus 的 Rule 规则文件,包括 recording rules 和 alerting,可以自动被 Prometheus 加载。

                                                                                        # AlertmanagerConfig

                                                                                        在以前的版本中要配置 Alertmanager 都是通过 Configmap 来完成的,在 v0.43 版本后新增该 CRD,可以将 Alertmanager 的配置分割成不同的子对象进行配置,允许将报警路由到自定义 Receiver 上,并配置抑制规则。

                                                                                        AlertmanagerConfig 可以在命名空间级别上定义,为 Alertmanager 提供一个聚合的配置。

                                                                                        这样我们要在集群中监控什么数据,就变成了直接去操作 Kubernetes 集群的资源对象了,是这样比之前手动的方式就方便很多了。

                                                                                        # 二、安装

                                                                                        我们可以使用 Prometheus 社区维护的 Helm 图表来部署 Prometheus Operator,他进一步简化了安装,默认封装好了 etcd,scheduler,controller-manager 的 svc,拆分了 PrometheusRule 等,所以我们安装 Prometheus Operator 可以用 helm chart,后续的维护 直接新建 crd 的yaml 文件进行更新。

                                                                                        https://github.com/prometheus-community/helm-charts

                                                                                        # Helm 安装配置

                                                                                        添加 helm repo

                                                                                        helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
                                                                                        
                                                                                        1

                                                                                        下拉压缩包

                                                                                        helm pull prometheus-community/kube-prometheus-stack --version 23.3.2
                                                                                        tar -xvf kube-prometheus-stack-23.3.2.tgz
                                                                                        cd kube-prometheus-stack/
                                                                                        
                                                                                        1
                                                                                        2
                                                                                        3

                                                                                        # Prometheus 安装配置

                                                                                        为 prometheus 创建 Namespace

                                                                                        kubectl create namespace cattle-prometheus
                                                                                        
                                                                                        1

                                                                                        修改 kube-proxy 的configmap

                                                                                        将 metricsBindAddress 修改为 "0.0.0.0:10249"

                                                                                        kubectl -n kube-system edit configmaps kube-proxy
                                                                                        kubectl rollout restart ds kube-proxy -n kube-system
                                                                                        
                                                                                        1
                                                                                        2

                                                                                        由于 现状 本来就使用的https ,所以要新增认证,如果是新建的,可以使用http,具体步骤见下 "etcd http 模式"

                                                                                        # etcd https 模式

                                                                                        新增 etcd secret

                                                                                        kubectl create secret generic etcd-certs -n cattle-prometheus --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
                                                                                        
                                                                                        1

                                                                                        部署

                                                                                        helm install monitoring -n cattle-prometheus  --set kubeEtcd.serviceMonitor.scheme=https --set kubeEtcd.serviceMonitor.caFile=/etc/prometheus/secrets/etcd-certs/ca.crt --set kubeEtcd.serviceMonitor.certFile=/etc/prometheus/secrets/etcd-certs/healthcheck-client.crt --set kubeEtcd.serviceMonitor.keyFile=/etc/prometheus/secrets/etcd-certs/healthcheck-client.key --set prometheus.prometheusSpec.secrets={etcd-certs} --set prometheusOperator.admissionWebhooks.patch.image.sha=null ./
                                                                                        
                                                                                        1

                                                                                        在 node 上下拉镜像

                                                                                        由于镜像在国外kube-state-metrics:v2.2.4、kube-webhook-certgen:v1.0,我拉取下来放到 内部harbor上

                                                                                        # etcd http 模式

                                                                                        将 --listen-metrics-urls= 值 改为 http://ip:2381

                                                                                        部署

                                                                                        helm install monitoring -n cattle-prometheus --set kubeEtcd.service.port=2381 --set kubeEtcd.service.targetPort=2381 --set prometheusOperator.admissionWebhooks.patch.image.sha=null ./
                                                                                        
                                                                                        1

                                                                                        # 查找 grafana admin 账户密码

                                                                                        kubectl -n cattle-prometheus get secrets monitoring-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
                                                                                        
                                                                                        1

                                                                                        # 三、配置报警

                                                                                        altermanager 配置 告警 的 webhook

                                                                                        新建alertmanager.yaml

                                                                                        global:
                                                                                          resolve_timeout: 5m
                                                                                          http_config:
                                                                                            follow_redirects: true
                                                                                          smtp_hello: localhost
                                                                                          smtp_require_tls: true
                                                                                        route:
                                                                                          receiver: "null"
                                                                                          group_by:
                                                                                          - alertname
                                                                                          - xxx_deploy_appid
                                                                                          - label_xxx_deploy_appid
                                                                                          routes:
                                                                                          - receiver: xxx-service
                                                                                            continue: true
                                                                                          - receiver: alertsnitch
                                                                                            continue: false
                                                                                          group_wait: 30s
                                                                                          group_interval: 5m
                                                                                          repeat_interval: 12h
                                                                                        inhibit_rules:
                                                                                        - source_match:
                                                                                            severity: critical
                                                                                          target_match:
                                                                                            severity: warning
                                                                                          equal:
                                                                                          - alertname
                                                                                          - instance
                                                                                        receivers:
                                                                                        - name: alertsnitch
                                                                                          webhook_configs:
                                                                                          - send_resolved: true
                                                                                            http_config:
                                                                                              follow_redirects: true
                                                                                            url: http://alertsnitch.ad.xxx.cn/webhook
                                                                                            max_alerts: 0
                                                                                        - name: "null"
                                                                                        - name: xxx-service
                                                                                          webhook_configs:
                                                                                          - send_resolved: true
                                                                                            http_config:
                                                                                              follow_redirects: true
                                                                                            url: http://xxx-service.xx.cn/api/v1/monitor/alarm/send_prometheus
                                                                                            max_alerts: 0
                                                                                        templates:
                                                                                        - /data/alertmanager/*.tmpl
                                                                                        
                                                                                        1
                                                                                        2
                                                                                        3
                                                                                        4
                                                                                        5
                                                                                        6
                                                                                        7
                                                                                        8
                                                                                        9
                                                                                        10
                                                                                        11
                                                                                        12
                                                                                        13
                                                                                        14
                                                                                        15
                                                                                        16
                                                                                        17
                                                                                        18
                                                                                        19
                                                                                        20
                                                                                        21
                                                                                        22
                                                                                        23
                                                                                        24
                                                                                        25
                                                                                        26
                                                                                        27
                                                                                        28
                                                                                        29
                                                                                        30
                                                                                        31
                                                                                        32
                                                                                        33
                                                                                        34
                                                                                        35
                                                                                        36
                                                                                        37
                                                                                        38
                                                                                        39
                                                                                        40
                                                                                        41
                                                                                        42
                                                                                        43
                                                                                        44
                                                                                        45
                                                                                        46
                                                                                        kubectl delete secret alertmanager-monitoring-kube-prometheus-alertmanager -n cattle-prometheus && kubectl create secret generic alertmanager-monitoring-kube-prometheus-alertmanager -n cattle-prometheus --from-file=alertmanager.yaml
                                                                                        kubectl delete secret alertmanager-monitoring-kube-prometheus-alertmanager-generated -n cattle-prometheus && kubectl create secret generic alertmanager-monitoring-kube-prometheus-alertmanager-generated -n cattle-prometheus --from-file=alertmanager.yaml
                                                                                        
                                                                                        1
                                                                                        2

                                                                                        # 参考链接

                                                                                        • https://tech.meipian.cn/k8sjian-kong-zhong-ji-jie-jue-fang-an/
                                                                                        • https://www.qikqiak.com/k8strain2/monitor/operator/install/
                                                                                        • https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/alerting.md
                                                                                        edit icon编辑此页open in new window
                                                                                        上次编辑于: 2022/9/15 10:31:37
                                                                                        贡献者: clay-wangzhi
                                                                                        备案号:冀ICP备2021007336号
                                                                                        Copyright © 2023 Clay