k8s搭建Prometheus Grafana Alertmanager组件

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
可观测监控 Prometheus 版,每月50GB免费额度
简介: k8s搭建Prometheus Grafana Alertmanager组件

搭建过程

  1. 获取kube-prometheus项目
git clone https://github.com/prometheus-operator/kube-prometheus.git
AI 代码解读

复制代码

  1. 修改Prometheus资源文件信息

找到文件:kube-prometheus/manifests/prometheus-prometheus.yaml文件,修改如下信息

找到manifests/prometheus-prometheus.yaml文件,修改如下的信息

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 2.35.0
  name: k8s
  namespace: monitoring
spec:
  alerting:
    alertmanagers:
    - apiVersion: v2
      name: alertmanager-main
      namespace: monitoring
      port: web
  enableFeatures: []
  externalLabels: {}
  image: quay.io/prometheus/prometheus:v2.35.0
  nodeSelector:
    kubernetes.io/os: linux
  podMetadata:
    labels:
      app.kubernetes.io/component: prometheus
      app.kubernetes.io/instance: k8s
      app.kubernetes.io/name: prometheus
      app.kubernetes.io/part-of: kube-prometheus
      app.kubernetes.io/version: 2.35.0
  podMonitorNamespaceSelector: {}
  podMonitorSelector: {}
  probeNamespaceSelector: {}
  probeSelector: {}
  replicas: 2  #副本数量,为了做高可用的
  resources:
    requests:
      memory: 400Mi
  ruleNamespaceSelector: {}
  ruleSelector: {}
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceAccountName: prometheus-k8s
  serviceMonitorNamespaceSelector: {}
  serviceMonitorSelector: {}
  version: 2.35.0
AI 代码解读

#新增加的配置信息####################################################

retention: '15d'  #指标保留的天数 24h:24小时  10d:10天 12w:12周 2y:2storage: #持久化存储的配置
    volumeClaimTemplate:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: prometheus-data
        labels:
          app: prometheus
      spec:
        storageClassName: csi-nas #kubectl get sc获取storeClass的名字
        accessModes:
          - ReadWriteMany  #访问方式,ReadWriteMany或者是ReadWriteOnce
        resources:
          requests:
            storage: 300Gi  #按照自己的监控的指标每天的数据量和保留的天数配置
AI 代码解读

#挂载本地机器的时间配置,处理pod里面的时区不一致的问题(这个要保证机器的时间要一致,之前碰到过有个机器node重启,导致快了30分钟,但是就算是不设置时区,两个prometheus也会差距30分钟)

volumes:
    - name: date-config
      hostPath:
        path: /etc/localtime
  volumeMounts:
    - mountPath: /etc/localtime
      name: date-config
AI 代码解读

如果不做持久化,那就不配置storage信息,但是当Prometheus被驱逐的时候,数据会丢失掉

  1. 执行安装命令

进入kube-prometheus目录,之后执行如下的命令,请按照顺序执行

kubectl create -f manifests/setup/

kubectl create -f manifests/
AI 代码解读
  1. 查看结果

等待五分钟作用(根据镜像下载的速度来定),通过如下命令查看结果:

kubectl get pods -n monitoring
AI 代码解读
NAME                                             READY   STATUS             RESTARTS         AGE
alertmanager-main-0                              2/2     Running            0                37m
alertmanager-main-1                              2/2     Running            0                37m
alertmanager-main-2                              2/2     Running            0                37m
alertmanager-relay-deployment-795859b658-pzzcq   1/1     Running            0                14m
blackbox-exporter-7d89b9b799-2pr2v               3/3     Running            0                8d
grafana-6bd85b474-74hsk                          1/1     Running            9 (7d18h ago)    27d
kube-state-metrics-d5754d6dc-64wnj               3/3     Running            0                8d
node-exporter-46qw2                              2/2     Running            4 (67d ago)      118d
node-exporter-48zlb                              2/2     Running            47 (2d6h ago)    106d
node-exporter-6pkck                              2/2     Running            4 (8d ago)       106d
node-exporter-8n2ms                              2/2     Running            51 (83m ago)     2d19h
node-exporter-94k6t                              2/2     Running            0                55d
node-exporter-9qrcb                              2/2     Running            19 (29d ago)     118d
node-exporter-c5nkc                              2/2     Running            0                4d2h
node-exporter-fbbpx                              2/2     Running            0                26d
node-exporter-flk4l                              2/2     Running            6 (27d ago)      106d
node-exporter-kpnzq                              2/2     Running            10               118d
node-exporter-tmjtq                              2/2     Running            10 (7d18h ago)   76d
node-exporter-ztvjc                              2/2     Running            2 (84d ago)      86d
prometheus-adapter-6998fcc6b5-7cvsv              1/1     Running            0                19d
prometheus-adapter-6998fcc6b5-zsnvw              1/1     Running            0                8d
prometheus-k8s-0                                 2/2     Running            9 (2m52s ago)    66m
prometheus-k8s-1                                 2/2     Running            0                71m
prometheus-operator-59647c66cf-pl92j             2/2     Running            0                38m
AI 代码解读

复制代码
如果都是处于Running状态,那么就代表部署成功了,可以看到部署了node_exporter,prometheus,grafana,alertmanager,blackbox-exporter等组件

  1. 注意点

一定要仔细查看每个步骤执行之后是否有错误信息,不然后面会出现各种各样的问题,如果有错误信息,直接执行如下命令做彻底删除动作

kubectl delete -f manifests/setup/

kubectl delete -f manifests/
AI 代码解读
  1. 具体使用

部署的Grafana是已经配置好了Prometheus作为数据源的,不需要自己手动配置了,具体怎么使用dashboard在grafana上面显示,不在本文档的介绍范围当中,请参考Grafana的官网和Dashboard的官网:Grafana Dashboards - discover and share dashboards for Grafana. | Grafana Labs
kube-prometheus的逻辑
逻辑图

例子
下面通过构建一个redis-exporter的监控来讲解如何使用kube-prometheus的自定义资源来做配置监控数据被Prometheus抓取!
下面三个文件直接使用:kubectl apply -f 文件名的方式执行,执行顺序为Deployment->Service->ServiceMonitor

  1. 部署redis_exporter的Deployment

redis-exporter的deployment的部署配置


apiVersion: apps/v1
kind: Deployment
metadata:
  name:  redis-exporter
  namespace: monitoring
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: redis-exporter
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 1.37.0
spec:
  selector:
    matchLabels:
      app.kubernetes.io/component: exporter
      app.kubernetes.io/name: redis-exporter
      app.kubernetes.io/part-of: kube-prometheus
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/component: exporter
        app.kubernetes.io/name: redis-exporter
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 1.37.0
    spec:
      containers:
        - name: redis-exporter
          image: oliver006/redis_exporter:v1.37.0
          args: ["-redis.addr","redis://redis的IP或者域名:6379","-redis.password","密码"]
          resources:
            requests:
              cpu: 20m
              memory: 20Mi
            limits:
              cpu: 100m
              memory: 30Mi
          ports:
            - containerPort: 9121
              name: http
          volumeMounts:
            - name: localtime
              mountPath: /etc/localtime
      volumes:
        - name: localtime
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
      restartPolicy: Always
AI 代码解读

2.构建Service资源对象

配置redis-exporter的service


apiVersion: v1
kind: Service
metadata:
  name: redis-exporter
  namespace: monitoring
  #labels定义很重要,后面的ServiceMonitor资源需要使用到
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: redis-exporter
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 1.37.0
spec:
  selector:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: redis-exporter
    app.kubernetes.io/part-of: kube-prometheus
  type: ClusterIP
  ports:
    - name: http
      port: 9121
      targetPort: http
AI 代码解读
  1. 构建ServiceMonitor对象

ServiceMonitor资源是kube-prometheus自定的资源的(CRD)

创建Redis-exporter的服务监控对象资源


apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    app.kubernetes.io/component: exporter
    app.kubernetes.io/name: redis-exporter
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 1.37.0
  name: redis-exporter
  namespace: monitoring
spec:
  endpoints:  #抓取的配置
    - interval: 15s #每间隔15秒抓取一次指标数据
      port: http    #Service定义的port的名字
      relabelings:  #指标的重写
        - action: replace
          regex: (.*)
          replacement: $1
          sourceLabels:
            - __meta_kubernetes_pod_node_name
          targetLabel: instance
      scheme: http
  jobLabel: app.kubernetes.io/name
  selector: #选择器,这个地方要配置对应Service的labels信息
    matchLabels:
      app.kubernetes.io/component: exporter
      app.kubernetes.io/name: redis-exporter
      app.kubernetes.io/part-of: kube-prometheus
AI 代码解读

执行逻辑

ServiceMonitor对象创建执行会被prometheus-operator监控到,并翻译成prometheus的配置信息,翻译结果如下:

- job_name: serviceMonitor/monitoring/redis-exporter/0
  honor_timestamps: true
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  follow_redirects: true
  enable_http2: true
  relabel_configs:
  - source_labels: [job]
    separator: ;
    regex: (.*)
    target_label: __tmp_prometheus_job_name
    replacement: $1
    action: replace
    ......指标重写的操作省略
  kubernetes_sd_configs:
  - role: endpoints
    kubeconfig_file: ""
    follow_redirects: true
    enable_http2: true
    namespaces:
      own_namespace: false
      names:
      - monitoring
AI 代码解读

prometheus根据配置信息按照endpoints进行信息抓取,这个endpoints的选取方式如下:首先根据ServiceMonitor定义的选择器属性:

selector: #选择器,这个地方要配置对应Service的labels信息
    matchLabels:
      app.kubernetes.io/component: exporter
      app.kubernetes.io/name: redis-exporter
      app.kubernetes.io/part-of: kube-prometheus
AI 代码解读

复制代码
按照上面的标签从monitoring命名空间下面选择服务条件的Service对象(注意是Service对象)

然后根据Service对象获取这个Service关联的Endpoints信息(也就是pod),所以如果在其他的命名空间创建ServiceMonitor对象,可能会出现Prometheus配置没问题,也没有报错,但是就是抓不到监控数据信息,解决方案如下,配置Role和RoleBinding对象,假设新命名空间为 logs:

定义角色,也就是说在本服务的命名空间内定义Role对象


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: prometheus-k8s  #Role的名字
  namespace: logs    #Role所在的命名空间
AI 代码解读

rules: #Role授权

- apiGroups: [""] #不知道啥意思,看官网都是这么使用
    resources: #授权的资源对象
      - services  #对应Service对象
      - endpoints #对应Endpoint对象
      - pods      #对应Pod对象
    verbs:  #对以上资源对象的动作授权,这表示:拥有这个角色可以对default空间的Service,Endpoint,Pod
      - get    #进行get list watch操作
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
AI 代码解读

绑定角色,很重要

就是把上面的Role对象给monitoring命名空间的prometheus-k8s绑定

monitoring命名空间和prometheus-k8s账号都是在搭建kube-prometheus的时候自动创建的

这个意思是让monitoring命名空间的prometheus-k8s账号拥有default空间的prometheus-k8s角色

这个monitoring的prometheus-k8s账号就能获取default空间内的Service,Endpoint,Pod资源了

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: prometheus-k8s
  namespace: logs
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: prometheus-k8s
subjects:
  - kind: ServiceAccount
    name: prometheus-k8s
    namespace: monitoring
AI 代码解读

上面这个文件的意思是在logs命名空间,创建了一个prometheus-k8s的角色让他具备能获取logs下面Service,Endpoints,Pod等资源的权限,并把这个角色和monitoring命名空间下面的prometheus-k8s账号绑定,使之具备monitoring下面的账号prometheus-k8s可以获取logs下面的Service,Endpoints,Pod等资源对象的权限

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
打赏
0
0
0
0
23
分享
相关文章
Grafana Prometheus Altermanager 监控系统
Grafana、Prometheus 和 Alertmanager 是一套强大的开源监控系统组合。Prometheus 负责数据采集与存储,Alertmanager 处理告警通知,Grafana 提供可视化界面。本文简要介绍了这套系统的安装配置流程,包括各组件的下载、安装、服务配置及开机自启设置,并提供了访问地址和重启命令。适用于希望快速搭建高效监控平台的用户。
117 20
Prometheus+Grafana监控Linux主机
通过本文的步骤,我们成功地在 Linux 主机上使用 Prometheus 和 Grafana 进行了监控配置。具体包括安装 Prometheus 和 Node Exporter,配置 Grafana 数据源,并导入预设的仪表盘来展示监控数据。通过这种方式,可以轻松实现对 Linux 主机的系统指标监控,帮助及时发现和处理潜在问题。
147 7
Grafana 安装配置教程,让你的 Prometheus 监控数据变得更美观
《Grafana安装配置教程,让你的Prometheus监控数据变得更美观》简介: Grafana是一个开源的度量分析与可视化工具,支持多种数据源(如Prometheus),提供丰富的可视化功能和警报机制。本文详细介绍了Grafana的安装、汉化方法及模板使用,帮助用户轻松创建美观、灵活的数据面板,并实现数据的协作与共享。通过Docker镜像、配置文件修改或替换前端页面等方式实现汉化,让用户更便捷地使用中文界面。此外,还提供了导入JSON格式模板的具体步骤,方便快速搭建仪表盘。
70 2
Prometheus+Grafana新手友好教程:从零开始搭建轻松掌握强大的警报系统
本文介绍了使用 Prometheus 和 Grafana 实现邮件报警的方案,包括三种主要方法:1) 使用 Prometheus 的 Alertmanager 组件;2) 使用 Grafana 的内置告警通知功能;3) 使用第三方告警组件如 OneAlert。同时,详细描述了环境准备、Grafana 安装配置及预警设置的步骤,确保用户能够成功搭建并测试邮件报警功能。通过这些配置,用户可以在系统或应用出现异常时及时收到邮件通知,保障系统的稳定运行。
123 1
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
364 3
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
230 3
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
138 2
基于Prometheus和Grafana的监控平台 - 环境搭建
基于Prometheus和Grafana的监控平台 - 环境搭建
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
346 0
prometheus学习笔记之Grafana安装与配置
prometheus学习笔记之Grafana安装与配置

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等