
本章目录:
0x00 前言简述及环境准备
0x01 实现Windows主机的监控和展示
0x02 实现MySQL与Redis数据库的监控和展示
0x03 实现Jenkins持续集成和交付的服务监控和展示
0x04 实现kubernetes外部集群的监控和展示
1.Endpoints 之服务自动发现
2.Node 之服务自动发现
3.综合实践之(cAdvisor+Kube-state-metrics+Grafana)组合拳方案
描述: 本章主要讲解和实践Prometheus在企业中的应用场景的复现,采用了docker-compose的资源清单进行快速构建prometheus_server、prometheus_pushgateway、prometheus_alertmanager、grafana等环境。
主要实现目标(功能):
1.实现Windows主机的监控和展示
2.实现MySQL与Redis数据库的监控和展示
3.实现外部kubernetes集群的监控和展示
系统机器:
# 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运行环境,并在主机中安装了软件,下面进行的配置循序渐进的进行添加。
# 下面表示在主机下进行基础环境的安装部署的组件(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 目录结构一览:
$ 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.目录结构快速生成
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 主配置文件:
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 配置文件:
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配置文件。
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 邮箱报警发送配置
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 资源清单内容:
# 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安装方式;
# 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.
.\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主配置文件之中进行重新加载配置即可发现该机器,如下图所示。
# 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容器进行监控指标的采集;
# - 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之中。
- 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

$ 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.crt和k8s_token文件下载到prometheus主配置文件中指定的目录之中;
Step 6.配置prometheus.yml主配置文件添加kubernetes_sd_configs对象配置endpoints角色的自动发现。
- 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 - 为了能到远方,脚下的每一步都不能少】