我在B站学运维之Prometheus监控企业内部监控实战采集和展示(8)
全栈工程师修炼指南
2021年10月02日 11:38
收录于文集
共63篇

本章目录:

  • 0x00 前言简述及环境准备

  • 0x01 实现Windows主机的监控和展示

  • 0x02 实现MySQL与Redis数据库的监控和展示

  • 0x03 实现Jenkins持续集成和交付的服务监控和展示

  • 0x04 实现kubernetes外部集群的监控和展示

    • 1.Endpoints 之服务自动发现

    • 2.Node 之服务自动发现

    • 3.综合实践之(cAdvisor+Kube-state-metrics+Grafana)组合拳方案


0x00 前言简述及环境准备

描述: 本章主要讲解和实践Prometheus在企业中的应用场景的复现,采用了docker-compose的资源清单进行快速构建prometheus_server、prometheus_pushgateway、prometheus_alertmanager、grafana等环境。

主要实现目标(功能):

  • 1.实现Windows主机的监控和展示

  • 2.实现MySQL与Redis数据库的监控和展示

  • 3.实现外部kubernetes集群的监控和展示

系统机器:

代码块
JavaScript
自动换行
复制代码
# Kubernetes cluster 0: weiyigeek-lb-vip.k8s (正式环境)
192.168.12.107 - master
192.168.12.108 - master
192.168.12.109 - master
192.168.12.223 - work
192.168.12.224 - work
192.168.12.225 - work

# Kubernetes cluster 1: k8s-test.weiyigeek (测试环境-单master节点)
192.168.12.111

# Kubernetes cluster 2: 192.168.12.226(开发环境-单master节点)
192.168.12.226
复制成功

环境说明 描述: 上述环境中都安装了docker运行环境,并在主机中安装了软件,下面进行的配置循序渐进的进行添加。

代码块
JavaScript
自动换行
复制代码
# 下面表示在主机下进行基础环境的安装部署的组件(node_export与cAdivsor的安装配置参考“1.Prometheus(普罗米修斯)容器集群监控入门.md”,此处不在重新累述)
192.168.12.107
- prometheus_server: 30090
- prometheus_pushgateway: 30091
- prometheus_alertmanager: 30093
- grafana: 9091

192.168.12.108~109
192.168.12.223~225
- node_exporter: 9091

192.168.12.111
- cAdivsor: 9100

# 此处暂时不进行配置后续利用prometheus监控第三方k8s集群时使用
192.168.12.226
- kubernetes Api Server: 6443
复制成功

目录结构一览:

代码块
JavaScript
自动换行
复制代码
$ tree -L 5
.
├── docker-compose.yml # 资源清单
├── grafana            # grafana UI 展示: 针对于数据持久化(插件、dashboard等)
│   └── data
└── prometheus         # Prometheus 监控相关配置以及数据持久化目录   
    ├── conf  
    │   ├── alertmanager.yaml  # 报警发送器配置
    │   ├── conf.d            
    │   │   ├── discovery      # 自动化发现相关配置文件
    │   │   │   └── k8s_nodes.yaml
    │   │   ├── rules          # 报警规则
    │   │   │   └── alert.rules
    │   │   └── auth            # k8s 以及 相关认证使用
    │   │       ├── k8s_client.crt
    │   │       ├── k8s_client.key
    │   │       └── k8s_token
    │   └── prometheus.yml
    └── data
复制成功

环境快速准备

  • 0.目录结构快速生成

代码块
Shell
自动换行
复制代码
mkdir -vp /nfsdisk-31/monitor/prometheus/conf/conf.d/{discovery,rules,auth}
mkdir -vp /nfsdisk-31/monitor/prometheus/data
mkdir -vp /nfsdisk-31/monitor/grafana/date
复制成功

  • 1.prometheus.yaml 主配置文件:

代码块
Shell
自动换行
复制代码
tee prometheus.yaml <<'EOF'
global:
  scrape_interval: 2m
  scrape_timeout: 10s
  evaluation_interval: 1m
  external_labels:
    monitor: 'prom-demo'
scrape_configs:
  - job_name: 'prom-Server'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'cAdvisor'
    static_configs:
      - targets: ['192.168.12.111:9100']
  - job_name: 'prom-Host'
    file_sd_configs:
    - files:
      - /etc/prometheus/conf.d/discovery/k8s_nodes.yaml
      refresh_interval: 1m

rule_files:
  - /etc/prometheus/conf.d/rules/*.rules

alerting:
  alertmanagers:
  - scheme: http
    static_configs:
    - targets:
      - '192.168.12.107:30093'
EOF
复制成功
  • 2.alert.rules 配置文件:

代码块
Shell
自动换行
复制代码
tee alert.rules <<'EOF'
groups:
- name: node-normal
  rules:
  - alert: service_down
    expr: up == 0
    for: 2m
    labels:
      severity: 1
      team: node
    annotations:
      summary: "主机 {{ $labels.instance }} 监控服务已停止运行超过 15s!"
  - alert: high_load
    expr: node_load1 > 0.7
    for: 5m
    labels:
      severity: 1
      team: node
    annotations:
      summary: "主机 {{ $labels.instance }} 高负载大于0.7以上运行超过 5m!"
EOF
复制成功
  • 3.k8s_nodes.yaml 自动发现file_sd_configs配置文件。

代码块
Shell
自动换行
复制代码
tee k8s_nodes.yaml <<'EOF'
- targets: [ '192.168.12.107:9100','192.168.12.108:9100','192.168.12.109:9100' ]
  labels: {'env': 'prod','cluster': 'weiyigeek-lb-vip.k8s','nodeType': 'master'}
- targets: [ '192.168.12.223:9100','192.168.12.224:9100','192.168.12.225:9100' ]
  labels: {'env': 'prod','cluster': 'weiyigeek-lb-vip.k8s','nodeType': 'work'}
EOF
复制成功
  • 4.alertmanager.yaml 邮箱报警发送配置

代码块
Shell
自动换行
复制代码
tee alertmanager.yaml <<'EOF'
global:
  resolve_timeout: 5m
  smtp_from: 'monitor@weiyigeek.top'
  smtp_smarthost: 'smtp.exmail.qq.com:465'
  smtp_auth_username: 'monitor@weiyigeek.top'
  smtp_auth_password: xxxxxxxxxxx'
  smtp_require_tls: false
  # smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 1m
  repeat_interval: 10m
  receiver: 'default-email'
receivers:
- name: 'default-email'
  email_configs:
  - to: 'master@weiyigeek.top'
    send_resolved: true
# inhibit_rules:
#   - source_match:
#       severity: 'critical'
#     target_match:
#       severity: 'warning'
#     equal: ['alertname', 'instance']
EOF
# Tips : 可以采用amtool工具校验该yml文件是否无误`./amtool check-config alertmanager.yml`
复制成功
  • 5.docker-compose.yml 资源清单内容:

代码块
Shell
自动换行
复制代码
# Desc:  prometheus / pushgateway / alertmanager / grafana 环境搭建
# author: WeiyiGeek
# email: master@weiyigeek.top

# 创建一个名称为monitor的桥接网络
$ docker network create monitor --driver bridge

tee docker-compose.yml <<'EOF'
version: '3.2'
services:
  prometheus:
    image: prom/prometheus:v2.26.0
    container_name: prometheus_server
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /nfsdisk-31/monitor/prometheus/conf/prometheus.yaml:/etc/prometheus/prometheus.yaml
      - /nfsdisk-31/monitor/prometheus/conf/conf.d:/etc/prometheus/conf.d
      - /nfsdisk-31/monitor/prometheus/data:/prometheus/data
      - /etc/localtime:/etc/localtime
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
      - '--storage.tsdb.path=/prometheus/data'
      - '--web.enable-admin-api'
      - '--web.enable-lifecycle'
    ports:
      - '30090:9090'
    restart: always
    networks:
      - monitor

  pushgateway:
    image: prom/pushgateway
    container_name: prometheus_pushgateway
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /etc/localtime:/etc/localtime
    ports:
      - '30091:9091'
    restart: always
    networks:
      - monitor

  alertmanager:
    image: prom/alertmanager:v0.21.0
    container_name: prometheus_alertmanager
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /nfsdisk-31/monitor/prometheus/conf/alertmanager.yaml:/etc/alertmanager.yaml
      - /etc/localtime:/etc/localtime
      # - /nfsdisk-31/monitor/prometheus/alertmanager:/alertmanager
    command:
      - '--config.file=/etc/alertmanager.yaml'
      - '--storage.path=/alertmanager'
    ports:
      - '30093:9093'
    restart: always
    networks:
      - monitor

  grafana:
    image: grafana/grafana:7.5.5
    container_name: grafana
    user: "472"
    environment:
      - TZ=Asia/Shanghai
      - GF_SECURITY_ADMIN_PASSWORD=weiyigeek
    volumes:
      - /nfsdisk-31/monitor/grafana/data:/var/lib/grafana
      - /etc/localtime:/etc/localtime
    ports:
      - '30000:3000'
    restart: always
    networks:
      - monitor
    dns:
      - 223.6.6.6
      - 192.168.12.254

networks:
  monitor:
    external: true
EOF

# 验证配置
docker-compose config 

# 创建和后台启动容器
docker-compose up -d
复制成功
  • 6.环境验证: 访问搭建的prometheus server 服务地址http://192.168.12.107:30090/service-discovery进行查询以及监控节点的查看。

  • Step 1.下载安装windows_exporter可执行软件其releases地址 我们可以选择exe或者msi安装方式;

代码块
Shell
自动换行
复制代码
# exe与msi下载
windows_exporter-0.16.0-amd64.exe
windows_exporter-0.16.0-amd64.msi

# msi - 安装执行调用示例:
msiexec /i <path-to-msi-file> ENABLED_COLLECTORS=os,iis LISTEN_PORT=5000
# 带有自定义查询的示例服务收集器
msiexec /i <path-to-msi-file> ENABLED_COLLECTORS=os,service --% EXTRA_FLAGS="--collector.service.services-where ""Name LIKE 'sql%'"""
# 在某些旧版本的Windows上,可能需要用双引号将参数值括起来,以正确解析install命令:
msiexec /i C:\Users\Administrator\Downloads\windows_exporter.msi ENABLED_COLLECTORS="ad,iis,logon,memory,process,tcp,thermalzone" TEXTFILE_DIR="C:\custom_metrics\"

# exe - Examples
# 仅启用service collector并指定自定义查询
.\windows_exporter.exe --collectors.enabled "service" --collector.service.services-where "Name='windows_exporter'"
# 仅启用process collector并指定自定义查询
.\windows_exporter.exe --collectors.enabled "process" --collector.process.whitelist="firefox.+"
# 将[defaults]与--collectors.enabled参数一起使用,该参数将与所有默认收集器一起展开。
.\windows_exporter.exe --collectors.enabled "[defaults],process,container"
复制成功
  • Step 2.使用配置文件config.yml运行后将在9182端口启用监听我们可以访问该http://127.0.0.1:9182/metricsurl查看metrics.

代码块
Shell
自动换行
复制代码
.\windows_exporter-0.16.0-amd64.exe --config.file=config.yml

# config.yml
# 默认启用 Collectors 收集器以及额外添加的收集器
collectors:
  enabled: cpu,cs,logical_disk,net,os,system,service,logon,process,tcp	
collector:
  service:
    services-where: Name='windows_exporter'
log:
  level: debug
scrape:
  timeout-margin: 0.5
telemetry:
  addr: ":9182"
  path: /metrics
  max-requests: 5

# 防火墙规则调整(指定远程连接的地址以及本地开放端口)
New-NetFirewallRule -Name prom-windows_exporter -Direction Inbound -DisplayName 'windows_exporter' -RemoteAddress 192.168.12.107 -LocalPort 9182 -Protocol 'TCP'
  # Name                  : prom-windows_exporter
  # DisplayName           : windows_exporter
  # Description           :
  # DisplayGroup          :
  # Group                 :
  # Enabled               : True
  # Profile               : Any
  # Platform              : {}
  # Direction             : Inbound
  # Action                : Allow
  # EdgeTraversalPolicy   : Block
  # LooseSourceMapping    : False
  # LocalOnlyMapping      : False
  # Owner                 :
  # PrimaryStatus         : OK
  # Status                : 已从存储区成功分析规则。 (65536)
  # EnforcementStatus     : NotApplicable
  # PolicyStoreSource     : PersistentStore
  # PolicyStoreSourceType : Local
# New-NetFirewallRule -Name powershell-remote-udp -Direction Inbound -DisplayName 'PowerShell远程连接 UDP' -LocalPort 9182 -Protocol 'UDP'  # http 协议走的是tcp所以不用添加UDP协议的防火墙策略
复制成功
  • Step 3.添加到prometheus.yaml主配置文件之中进行重新加载配置即可发现该机器,如下图所示。

代码块
Shell
自动换行
复制代码
# prometheus.yaml
scrape_configs:
- job_name: 'windows-exporter'
    file_sd_configs:
    - files:
      - /etc/prometheus/conf.d/discovery/win_nodes.yaml
      refresh_interval: 1m


# vi win_nodes.yaml
- targets: [ '192.168.12.240:9182' ]
  labels: {'env': 'temp','osType': 'windows','nodeType': 'master'}

# PromQL
windows_os_info or windows_exporter_build_info{instance='192.168.12.240:9182'} or windows_logical_disk_free_bytes{volume="C:"} / (1024^3) or windows_net_current_bandwidth
复制成功
  • Step 4.配置Grafana添加prometheus的windows监控的dashboard(官方搜索)

    • 安装地址:https://grafana.com/grafana/dashboards/10467

  • Step 5.访问Grafana的Dashbord查看windows采集的数据展示验证

  • Step 1.准备测试的MySQL与Redis的数据库然后利用docker容器进行监控指标的采集;

代码块
Shell
自动换行
复制代码
# - mysqld-exporter : export DATA_SOURCE_NAME='user:password@(hostname:3306)/'
# (1) 在执行的MySQL数据库中添加监控用户
CREATE USER 'exporter'@'%' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
# (2) 运行 prom/mysqld-exporter 容器
docker run -d -p 9104:9104 --name mysqld-exporter -e DATA_SOURCE_NAME="exporter:XXXXXXXX@(192.168.12.185:3306)/" prom/mysqld-exporter

# - redis_exporter:  Supports Redis 2.x, 3.x, 4.x, 5.x, and 6.x
# Redis instance addresses can be tcp addresses: redis://localhost:6379, redis.example.com:6379 or e.g. unix sockets: unix:///tmp/redis.sock.
docker run -d  --name redis_exporter --network host -e REDIS_ADDR="redis://192.168.12.1doc85:6379"  -e REDIS_PASSWORD="weiyigeek.top" oliver006/redis_exporter # -p 9121:9121

# 查看部署的exporter
$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
c3a7a5663143        oliver006/redis_exporter   "/redis_exporter"        9 minutes ago       Up 9 minutes                                 redis_exporter
0a3d557bf36b        prom/mysqld-exporter       "/bin/mysqld_exporter"   16 minutes ago      Up 16 minutes       0.0.0.0:9104->9104/tcp   mysqld-exporter
复制成功
  • Step 2.分别访问mysqld-exporter和redis_exporter的metrics的URL

  • Step 3.prometheus.yaml 主配置文件修改和添加;

  • Step 4.热加载prometheus.yaml配置或者重新启动prometheus容器验证monitor目标执行PromQL表达式: redis_instance_info or mysql_version_info

  • Step 5.在Grafana中找寻安装Prometheus Redis Dashboard(https://grafana.com/grafana/dashboards/763)和Prometheus mysql Dashboard(https://grafana.com/grafana/dashboards/7362)

  • Step 1.安装Prometheus metrics插件(Prometheus metrics: Expose Jenkins metrics in prometheus format)

  • Step 2.在系统管理-> 系统配置->配置Prometheus插件,主要填写Path地址和url路径namespace最后应用保存即可。

  • Step 3.测试验证Prometheus插件运行情况,即访问http://yourjenkinserver:port/prometheus

  • Step 4.在我们的Prometheus服务端将该端点地址添加到prometheus.yml之中。

代码块
Shell
自动换行
复制代码
- job_name: 'jenkins'
    metrics_path: '/prometheus/'
    scheme: 'http'
    bearer_token: 'bearer_token'
    static_configs:
      - targets: ['192.168.12.107:30001']
复制成功
  • Step 5.重载prometheus.yml配置(使用方式必须是在有--web.enable-lifecycle启动参数为真的情况下),然后验证监控项:devops_jenkins_executors_available

  • Step 6.在Grafana进行添加数据源配置并显示采集的指标。

    • 首先安装a Jenkins performance and health overview for jenkinsci/prometheus-plugin,在面板中+->Import然后输入vid Grafana Dashboard URL:https://grafana.com/grafana/dashboards/9524 -> load -> Import然后跳转到监控页面数据就可以展示出来了;

  • endpoints : 自动发现service中的endpoint

  • node: 自动发现每个集群节点发现一个target,其地址默认为Kubelet的HTTP端口如"https://192.168.3.217:10250/metrics"

  • service : 自动发现每个服务的每个服务端口的target

  • pod : 自动发现所有容器及端口

  • ingrsss : 自动发现ingress中path

代码块
Shell
自动换行
复制代码
$ kubectl cluster-info
Kubernetes master is running at https://k8s-dev.weiyigeek:6443
KubeDNS is running at https://k8s-dev.weiyigeek:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
复制成功
  • Step 1.我们先查看当前kube-state-metrics兼容性矩阵与我们kubernetes集群版本的对应参考地址,下面最多记录5个kube状态度量和5个kubernetes版本。

  • Step 2.k8s集群 ApiServer 访问鉴权账号创建和绑定的集群角色权限配置。 描述: 在访问K8S apiserver需要先进行授权,而集群内部Prometheus可以使用集群内默认配置进行访问,而集群外访问需要使用token+客户端cert进行认证因此需要先进行RBAC授权。

    • 此处测试由于我们需要访问不同的namespace,建议先使用分配绑定cluster-admin权限,但在生产中一定要使用最小权限原则来保证其安全性(后面会进行演示)。

  • Step 3.参考采用官方提供的部署资源清单参考地址,此处已采用上面创建的 prometheus 用户。

  • Step 4.验证查看部署情况并获取认证token

  • Step 5.将获取到的k8s_ca.crtk8s_token文件下载到prometheus主配置文件中指定的目录之中;

  • Step 6.配置prometheus.yml主配置文件添加kubernetes_sd_configs对象配置endpoints角色的自动发现。

代码块
Shell
自动换行
复制代码
- job_name: 'k8s-endpoint-discover'
  scheme: https
  #使用apiserver授权部分解密的token值以文件形式存储
  tls_config:
    ca_file: /etc/prometheus/conf.d/auth/k8s_ca.crt
    insecure_skip_verify: true
  bearer_token_file: /etc/prometheus/conf.d/auth/k8s_token
  # k8s自动发现具体配置
  kubernetes_sd_configs:
  # 使用endpoint级别自动发现
  - role: endpoints
    api_server: 'https://192.168.12.226:6443'
    tls_config:
      ca_file: /etc/prometheus/conf.d/auth/k8s_ca.crt
      insecure_skip_verify: true
    bearer_token_file: /etc/prometheus/conf.d/auth/k8s_token
  relabel_configs:
  - source_labels: [__meta_kubernetes_service_name]
    # 只保留指定匹配正则的标签,不匹配则删除
    action: keep
    regex: '^(kube-state-metrics)$'
  - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
    # 只保留指定匹配正则的标签,不匹配则删除
    action: keep
    regex: true
  - source_labels: [__address__]
    action: replace
    target_label: instance
  - target_label: __address__
    # 使用replacement值替换__address__默认值
    replacement: 192.168.12.226:6443
  - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_pod_name, __meta_kubernetes_pod_container_port_number]
    # 正则匹配
    regex: ([^;]+);([^;]+);([^;]+)
    # 使用replacement值替换__metrics_path__默认值
    target_label: __metrics_path__
    # 自行构建的apiserver proxy url
    replacement: /api/v1/namespaces/${1}/pods/http:${2}:${3}/proxy/metrics
  - action: labelmap
    regex: __meta_kubernetes_service_label_(.+)
  - source_labels: [__meta_kubernetes_namespace]
    action: replace
    # 将标签__meta_kubernetes_namespace修改为kubernetes_namespace
    target_label: kubernetes_namespace
  - source_labels: [__meta_kubernetes_service_name]
    action: replace
    # 将标签__meta_kubernetes_service_name修改为service_name
    target_label: service_name
复制成功
  • Step 6.修改主配置文件完成后进行重启 prometheus Server 容器然后查看启动状态,由图中可以看见监控成功。

  • Step 1.此处将node-exporter以DaemonSet形式部署,配合Prometheus动态发现更加方便。

  • Step 2.创建SA账户并对其进行RBAC权限设置(最小权限原则)

  • Step 3.Prometheus.yaml 主配置文件添加kubernetes_sd_configs对象使用node级别自动发现;

  • Step 4.重启服务查看监控目标状态以及服务发现是否成功监控。

  • Step 5.此时我们可以将__metrics_path__替换成/api/v1/nodes/${1}:10250/proxy/metrics,如此便采用了kubelet采集拉取监控指标。

  • 1.Node 性能监控展示

    • https://grafana.com/grafana/dashboards/8919

    • https://grafana.com/grafana/dashboards/9276

  • 2.pod 性能监控展示

    • https://grafana.com/grafana/dashboards/8588

  • 3.K8S 资源性能监控展示(kubernetes资源全面展示!包含K8S整体资源总览、微服务资源明细、Pod资源明细及K8S网络带宽,优化重要指标展示。)

    • https://grafana.com/grafana/dashboards/13105

  • Step 1.在前面的基础环境之上修改的 Prometheus.yaml 主配置文件内容如下:

  • Step 2.关键配置说明由于此处我们的Prometheus是在k8s集群外部署的所以需要重新构建__metrics_path__字符串以便代理访问。

  • Step 3.重启我们的Prometheus服务并验证服务发现和目标。

  • Step 4.在Grafana中安装Kubernetes for Prometheus Dashboard(https://grafana.com/grafana/dashboards/13105),它提供包含K8S整体资源总览、微服务资源明细、Pod资源明细及K8S网络带宽,优化重要指标展示。

  • Step 5.至此完毕此项实践。


              如果你觉得这个专栏还不错的,请给这篇专栏点个赞、投个币、收个藏、关个注,这将对我有很大帮助!                    欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】


更多文章来源: https://weiyigeek.top 【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】