本文档风哥主要介绍Podman容器监控与告警,包括监控的概念、告警的概念、监控的重要性以及Prometheus与Grafana部署、Alertmanager配置和Node Exporter部署等内容。风哥教程参考Podman官方文档Monitoring部分,适合容器管理员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 监控概念
监控是指对系统的运行状态、性能指标和资源使用情况进行实时观察和记录,以便及时发现和解决问题。Podman容器监控是指对Podman容器、Pod、镜像和系统进行实时监控,包括容器状态、资源使用情况、网络连接、存储使用情况等。更多视频教程www.fgedu.net.cn
- 实时了解系统运行状态
- 及时发现和解决问题
- 预测系统故障
- 优化系统性能
- 确保系统的高可用性
1.2 告警概念
告警是指当系统出现异常情况时,通过各种方式(如邮件、短信、微信等)通知相关人员,以便及时处理。Podman容器告警是指当容器、Pod或系统出现异常情况时,发送告警通知。
1.3 监控的重要性
监控的重要性主要体现在:
- 及时发现问题:通过监控可以及时发现系统中的问题,避免问题扩大
- 提高系统可靠性:通过监控可以确保系统的正常运行,提高系统的可靠性
- 优化系统性能:通过监控可以发现性能瓶颈,优化系统性能
- 预测系统故障:通过监控可以预测系统故障,提前采取措施
- 满足合规要求:通过监控可以满足合规要求,确保系统符合规范
Part02-生产环境规划与建议
2.1 监控策略
生产环境中Podman的监控策略:
## 监控对象
– 容器:容器状态、资源使用、日志等
– Pod:Pod状态、容器状态等
– 镜像:镜像版本、大小、安全漏洞等
– 网络:网络连接、端口占用等
– 存储:存储使用、卷状态等
– 系统:系统资源、进程状态等
## 监控指标
– CPU使用:容器和系统的CPU使用率
– 内存使用:容器和系统的内存使用率
– 磁盘使用:容器和系统的磁盘使用率
– 网络流量:容器和系统的网络吞吐量
– 容器状态:容器的运行状态、重启次数等
– 应用指标:应用的响应时间、请求数等
## 监控频率
– 高频监控:每10秒一次,适用于关键指标
– 中频监控:每30秒一次,适用于一般指标
– 低频监控:每1分钟一次,适用于非关键指标
## 监控工具
– Prometheus:监控系统和容器的性能指标
– Grafana:可视化监控数据
– Node Exporter:收集系统指标
– cAdvisor:收集容器指标
– Alertmanager:处理和发送告警
2.2 告警策略
生产环境中Podman的告警策略:
## 告警级别
– 紧急:需要立即处理的问题,如系统宕机
– 严重:需要在4小时内处理的问题,如容器异常
– 警告:需要在24小时内处理的问题,如资源使用过高
– 信息:需要关注的问题,如配置变更
## 告警触发条件
– CPU使用率超过80%
– 内存使用率超过85%
– 磁盘使用率超过90%
– 容器重启次数超过3次
– 服务响应时间超过5秒
– 网络连接失败
## 告警通知方式
– 邮件:发送告警邮件
– 短信:发送告警短信
– 微信:发送告警微信
– 电话:拨打告警电话
– 集成:与监控系统集成
## 告警处理流程
– 告警触发:监控系统检测到异常
– 告警发送:通过多种方式发送告警
– 告警接收:相关人员接收告警
– 告警处理:相关人员处理告警
– 告警恢复:问题解决后,告警恢复
– 告警记录:记录告警处理过程
2.3 监控工具
生产环境中Podman的监控工具:
- Prometheus:开源的监控系统,用于收集和存储监控数据
- Grafana:开源的可视化平台,用于展示监控数据
- Alertmanager:用于处理和发送告警
- Node Exporter:用于收集系统指标
- cAdvisor:用于收集容器指标
- ELK Stack:用于收集和分析日志
Part03-生产环境项目实施方案
3.1 Prometheus与Grafana部署
3.1.1 部署Prometheus
# 运行Prometheus容器
$ podman run -d –name fgedu-prometheus \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/prometheus/conf:/etc/prometheus:z \
-v /Podman/fgdata/prometheus/data:/prometheus:z \
-p 9090:9090 \
docker.io/prom/prometheus:v2.43.0
# 配置Prometheus
$ cat > /Podman/fgdata/prometheus/conf/prometheus.yml << EOF
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "alerts.yml"
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "node"
static_configs:
- targets: ["192.168.1.10:9100"]
- job_name: "cadvisor"
static_configs:
- targets: ["192.168.1.10:8080"]
- job_name: "podman"
static_configs:
- targets: ["192.168.1.10:9101"]
EOF
# 配置告警规则
$ cat > /Podman/fgdata/prometheus/conf/alerts.yml << EOF
groups:
- name: container_alerts
rules:
- alert: ContainerHighCPU
expr: (sum(rate(container_cpu_usage_seconds_total{name!=""}[5m])) by (name) / sum(container_spec_cpu_quota{name!=""} / container_spec_cpu_period{name!=""}) by (name)) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: “Container high CPU usage”
description: “Container {{ labels.name }} has CPU usage above 80% for 5 minutes”
– alert: ContainerHighMemory
expr: (sum(container_memory_usage_bytes{name!=””}) by (name) / sum(container_spec_memory_limit_bytes{name!=””}) by (name)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: “Container high memory usage”
description: “Container {{ labels.name }} has memory usage above 85% for 5 minutes”
– alert: ContainerRestarted
expr: changes(container_start_time_seconds{name!=””}[1h]) > 3
labels:
severity: critical
annotations:
summary: “Container restarted”
description: “Container {{ labels.name }} has restarted more than 3 times in the last hour”
EOF
# 重启Prometheus
$ podman restart fgedu-prometheus
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/prom/prometheus /bin/prometheus 2 minutes ago Up 2 minutes ago 0.0.0.0:9090->9090/tcp fgedu-prometheus
3.1.2 部署Grafana
# 运行Grafana容器
$ podman run -d –name fgedu-grafana \
–cpus 2 \
–memory 4g \
-v /Podman/fgdata/grafana/data:/var/lib/grafana:z \
-v /Podman/fgdata/grafana/conf:/etc/grafana:z \
-p 3000:3000 \
docker.io/grafana/grafana:9.5.0
# 配置Grafana
$ cat > /Podman/fgdata/grafana/conf/grafana.ini << EOF
[server]
http_port = 3000
domain = localhost
[database]
type = sqlite3
[security]
admin_user = admin
admin_password = admin
[auth]
login_maximum_inactive_lifetime_days = 30
[analytics]
check_for_updates = true
[log]
mode = console
level = info
EOF
# 重启Grafana
$ podman restart fgedu-grafana
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1234567890ab docker.io/grafana/grafana grafana-server 2 minutes ago Up 2 minutes ago 0.0.0.0:3000->3000/tcp fgedu-grafana
3.2 Alertmanager配置
3.2.1 部署Alertmanager
# 运行Alertmanager容器
$ podman run -d –name fgedu-alertmanager \
–cpus 1 \
–memory 2g \
-v /Podman/fgdata/alertmanager/conf:/etc/alertmanager:z \
-p 9093:9093 \
docker.io/prom/alertmanager:v0.25.0
# 配置Alertmanager
$ cat > /Podman/fgdata/alertmanager/conf/alertmanager.yml << EOF
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alertmanager@example.com'
smtp_auth_username: 'alertmanager'
smtp_auth_password: 'password'
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
send_resolved: true
- name: 'wechat'
wechat_configs:
- corp_id: 'your_corp_id'
api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
to_party: '1'
agent_id: 'your_agent_id'
api_secret: 'your_api_secret'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
EOF
# 重启Alertmanager
$ podman restart fgedu-alertmanager
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9876543210ab docker.io/prom/alertmanager /bin/alertmanager 2 minutes ago Up 2 minutes ago 0.0.0.0:9093->9093/tcp fgedu-alertmanager
# 更新Prometheus配置,添加Alertmanager
$ cat > /Podman/fgdata/prometheus/conf/prometheus.yml << EOF
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "alerts.yml"
alerting:
alertmanagers:
- static_configs:
- targets: ['192.168.1.10:9093']
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "node"
static_configs:
- targets: ["192.168.1.10:9100"]
- job_name: "cadvisor"
static_configs:
- targets: ["192.168.1.10:8080"]
- job_name: "podman"
static_configs:
- targets: ["192.168.1.10:9101"]
EOF
# 重启Prometheus
$ podman restart fgedu-prometheus
3.3 Node Exporter部署
3.3.1 部署Node Exporter
# 运行Node Exporter容器
$ podman run -d –name fgedu-node-exporter \
–cpus 1 \
–memory 1g \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /:/rootfs:ro \
-p 9100:9100 \
docker.io/prom/node-exporter:v1.5.0 \
–path.procfs=/host/proc \
–path.rootfs=/rootfs \
–path.sysfs=/host/sys \
–collector.filesystem.mount-points-exclude=”^/(sys|proc|dev|host|etc)($|/)”
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/prom/node-exporter /bin/node_exporter 2 minutes ago Up 2 minutes ago 0.0.0.0:9100->9100/tcp fgedu-node-exporter
# 测试Node Exporter
$ curl http://localhost:9100/metrics
# 输出日志(部分)
# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu=”0″,mode=”idle”} 12345.67
node_cpu_seconds_total{cpu=”0″,mode=”iowait”} 123.45
node_cpu_seconds_total{cpu=”0″,mode=”irq”} 0.0
node_cpu_seconds_total{cpu=”0″,mode=”nice”} 0.0
node_cpu_seconds_total{cpu=”0″,mode=”softirq”} 0.0
node_cpu_seconds_total{cpu=”0″,mode=”steal”} 0.0
node_cpu_seconds_total{cpu=”0″,mode=”system”} 123.45
node_cpu_seconds_total{cpu=”0″,mode=”user”} 1234.56
Part04-生产案例与实战讲解
4.1 容器监控
4.1.1 容器监控实战
# 运行cAdvisor容器
$ podman run -d –name fgedu-cadvisor \
–cpus 1 \
–memory 2g \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/containers:/var/lib/containers:ro \
-p 8080:8080 \
docker.io/google/cadvisor:v0.47.0
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/google/cadvisor /usr/bin/cadvisor 2 minutes ago Up 2 minutes ago 0.0.0.0:8080->8080/tcp fgedu-cadvisor
# 运行测试容器
$ podman run -d –name fgedu-nginx \
-p 80:80 \
docker.io/library/nginx
$ podman run -d –name fgedu-mysql \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
-p 3306:3306 \
docker.io/library/mysql:8.0
# 查看容器状态
$ podman ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab docker.io/google/cadvisor /usr/bin/cadvisor 5 minutes ago Up 5 minutes ago 0.0.0.0:8080->8080/tcp fgedu-cadvisor
1234567890ab docker.io/library/nginx nginx -g daemon 2 minutes ago Up 2 minutes ago 0.0.0.0:80->80/tcp fgedu-nginx
9876543210ab docker.io/library/mysql mysqld 2 minutes ago Up 2 minutes ago 0.0.0.0:3306->3306/tcp fgedu-mysql
# 访问Grafana,配置数据源和仪表盘
# 1. 打开浏览器,访问 http://localhost:3000
# 2. 登录Grafana,用户名和密码均为 admin
# 3. 添加Prometheus数据源
# 4. 导入容器监控仪表盘(ID: 193)
# 5. 查看容器监控数据
4.2 Pod监控
4.2.1 Pod监控实战
# 创建Pod
$ podman pod create –name fgedu-pod -p 80:80 -p 3306:3306
# 运行容器到Pod
$ podman run -d –pod fgedu-pod –name fgedu-nginx docker.io/library/nginx
$ podman run -d –pod fgedu-pod –name fgedu-mysql \
-e MYSQL_ROOT_PASSWORD=fgedu123 \
docker.io/library/mysql:8.0
# 查看Pod状态
$ podman pod ps
# 输出日志
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
1234567890ab fgedu-pod Running 2 minutes ago 7890123456ab 3
# 查看Pod中的容器
$ podman ps –pod fgedu-pod
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7890123456ab k8s.gcr.io/pause:3.6 /pause 2 minutes ago Up 2 minutes ago 0.0.0.0:80->80/tcp fgedu-pod-infra
1234567890ab docker.io/library/nginx nginx -g daemon 2 minutes ago Up 2 minutes ago 0.0.0.0:80->80/tcp fgedu-nginx
9876543210ab docker.io/library/mysql mysqld 2 minutes ago Up 2 minutes ago 0.0.0.0:3306->3306/tcp fgedu-mysql
# 访问Grafana,查看Pod监控数据
# 1. 打开浏览器,访问 http://localhost:3000
# 2. 导入Pod监控仪表盘
# 3. 查看Pod监控数据
4.3 系统监控
4.3.1 系统监控实战
# 运行Node Exporter容器
$ podman run -d –name fgedu-node-exporter \
–cpus 1 \
–memory 1g \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /:/rootfs:ro \
-p 9100:9100 \
docker.io/prom/node-exporter:v1.5.0 \
–path.procfs=/host/proc \
–path.rootfs=/rootfs \
–path.sysfs=/host/sys \
–collector.filesystem.mount-points-exclude=”^/(sys|proc|dev|host|etc)($|/)”
# 访问Grafana,查看系统监控数据
# 1. 打开浏览器,访问 http://localhost:3000
# 2. 导入系统监控仪表盘(ID: 1860)
# 3. 查看系统监控数据
# 测试系统负载
$ stress –cpu 4 –io 2 –vm 1 –vm-bytes 1G –timeout 60s
# 查看告警
# 1. 打开浏览器,访问 http://localhost:9093
# 2. 查看告警状态
# 3. 确认告警通知
Part05-风哥经验总结与分享
5.1 监控最佳实践
Podman容器监控的最佳实践:
- 全面监控:监控容器、Pod、镜像、网络、存储和系统等各个方面
- 实时监控:实时收集和分析监控数据,及时发现问题
- 可视化:使用Grafana等工具可视化监控数据,便于分析和理解
- 告警配置:合理配置告警规则,确保及时通知
- 历史数据:存储历史监控数据,便于趋势分析和问题追溯
- 自动化:自动化监控和告警处理,提高效率
- 持续优化:根据监控结果,持续优化系统配置和性能
- 文档记录:记录监控配置和告警处理流程,便于维护和追溯
5.2 告警最佳实践
Podman容器告警的最佳实践:
- 合理设置告警级别:根据问题的严重程度设置不同的告警级别
- 避免告警风暴:合理设置告警触发条件,避免频繁告警
- 多渠道通知:使用多种方式发送告警通知,确保及时接收
- 告警确认:建立告警确认机制,避免重复处理
- 告警抑制:当高级别告警触发时,抑制低级别告警
- 告警恢复:当问题解决后,发送告警恢复通知
- 告警分析:分析告警数据,找出问题的根本原因
- 持续改进:根据告警情况,持续优化告警策略
5.3 监控故障排查
Podman容器监控的故障排查:
## 监控数据丢失
– 检查监控工具状态:podman ps | grep prometheus
– 检查网络连接:ping
– 检查配置文件:cat /Podman/fgdata/prometheus/conf/prometheus.yml
– 检查日志:podman logs fgedu-prometheus
## 告警未触发
– 检查告警规则:cat /Podman/fgdata/prometheus/conf/alerts.yml
– 检查告警状态:curl http://localhost:9090/api/v1/alerts
– 检查Alertmanager配置:cat /Podman/fgdata/alertmanager/conf/alertmanager.yml
– 检查Alertmanager状态:podman logs fgedu-alertmanager
## 监控数据不准确
– 检查指标采集:curl http://localhost:9100/metrics
– 检查指标计算:在Prometheus中执行查询
– 检查时间同步:ntpdate
– 检查资源限制:podman inspect fgedu-node-exporter | grep -A 10 “Resources”
## 监控系统性能问题
– 检查监控工具资源使用:podman stats fgedu-prometheus
– 调整采集频率:修改scrape_interval
– 优化存储配置:调整Prometheus存储设置
– 清理历史数据:删除过期监控数据
## 告警通知失败
– 检查通知配置:cat /Podman/fgdata/alertmanager/conf/alertmanager.yml
– 测试通知通道:使用Alertmanager的测试功能
– 检查网络连接:ping
– 检查认证信息:确认用户名和密码正确
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
