本文档风哥主要介绍Linux系统大规模Kubernetes监控与告警,包括K8s监控基础概念、监控工具介绍、告警系统基础、Prometheus配置、Grafana配置、AlertManager配置以及实战案例等内容,风哥教程参考Kubernetes官方文档、Linux官方文档System administration等内容,适合系统管理员在生产环境中使用。
from PG视频:www.itpux.com
Part01-基础概念与理论知识
1.1 K8s监控基础概念
Kubernetes监控是确保集群健康运行的重要组成部分。Kubernetes监控主要包括:
- 集群级别监控:监控集群整体状态,如节点健康、资源使用情况
- Pod级别监控:监控Pod的运行状态、资源使用情况
- 容器级别监控:监控容器的CPU、内存、网络、磁盘使用情况
- 应用级别监控:监控应用的业务指标、响应时间、错误率等
- CPU使用率:节点和Pod的CPU使用情况
- 内存使用率:节点和Pod的内存使用情况
- 磁盘使用率:节点和持久卷的磁盘使用情况
- 网络流量:Pod和节点的网络输入/输出流量
- Pod状态:Pod的运行、就绪、等待状态
- 容器状态:容器的运行、停止、重启情况
- API Server响应时间:API Server的请求响应时间
- etcd健康状态:etcd集群的健康状态
1.2 监控工具介绍
Kubernetes生态系统中有多种监控工具,常用的包括:
– Prometheus:开源的监控系统和时间序列数据库
– Grafana:开源的数据可视化和监控平台
– AlertManager:Prometheus的告警管理组件
– Node Exporter:收集节点级别的指标
– kube-state-metrics:收集Kubernetes资源的状态指标
– cAdvisor:收集容器级别的指标
– Prometheus Operator:管理Prometheus及其组件的Operator
– Thanos:Prometheus的高可用和长期存储解决方案
# 监控工具选择
– 小规模集群:Prometheus + Grafana
– 中规模集群:Prometheus + Grafana + AlertManager
– 大规模集群:Prometheus + Grafana + AlertManager + Thanos
1.3 告警系统基础
告警系统是监控的重要组成部分,用于及时发现和通知系统异常。告警系统主要包括:
- 告警规则:定义什么情况下触发告警
- 告警级别:如信息、警告、严重、紧急等
- 告警通知:通过邮件、短信、Slack等方式通知
- 告警处理:告警的确认、升级、关闭等流程
Part02-生产环境规划与建议
2.1 监控架构设计
生产环境监控架构设计要点:
– 集中式监控:所有集群的监控数据集中到一个监控系统
– 分布式监控:每个集群有独立的监控系统,数据汇总到中心
– 混合式监控:核心集群集中监控,边缘集群分布式监控
# 监控层次
– 基础设施层:物理服务器、网络设备、存储设备
– 容器平台层:Kubernetes集群、节点、Pod、容器
– 应用层:应用服务、数据库、中间件
– 业务层:业务指标、用户体验
# 监控数据存储
– 短期存储:Prometheus本地存储,保存最近7-15天数据
– 长期存储:Thanos、InfluxDB、Elasticsearch,保存长期数据
– 数据备份:定期备份监控数据,确保可恢复性
2.2 监控策略制定
生产环境监控策略制定要点:
– 全面监控:监控所有关键组件和指标
– 重点监控:对核心业务和关键组件进行重点监控
– 分层监控:根据不同层次制定不同的监控策略
– 动态监控:根据业务负载调整监控频率
# 监控指标选择
– 基础指标:CPU、内存、磁盘、网络
– 平台指标:Kubernetes API Server、etcd、Scheduler
– 应用指标:响应时间、错误率、吞吐量
– 业务指标:订单量、用户数、收入
# 监控频率
– 基础设施:15-60秒
– 容器平台:10-30秒
– 应用服务:5-15秒
– 业务指标:1-5分钟
2.3 告警策略制定
生产环境告警策略制定要点:
– 分级告警:根据严重程度分级,如信息、警告、严重、紧急
– 告警抑制:避免告警风暴,对相关告警进行抑制
– 告警聚合:将相关告警聚合为一个告警,减少告警数量
– 告警路由:根据告警类型和级别路由到不同的接收组
# 告警级别
– 信息:系统正常但需要关注的信息
– 警告:系统出现异常但不影响业务
– 严重:系统出现严重异常,可能影响业务
– 紧急:系统出现紧急异常,已经影响业务
# 告警通知
– 邮件:用于一般告警和每日报告
– 短信:用于严重和紧急告警
– 即时通讯:如Slack、企业微信,用于实时告警
– 电话:用于紧急告警,确保及时响应
Part03-生产环境项目实施方案
3.1 Prometheus配置
3.1.1 安装Prometheus
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install prometheus prometheus-community/kube-prometheus-stack –namespace monitoring –create-namespace
# 查看Prometheus状态
$ kubectl get pods -n monitoring
NAME READY STATUS RESTARTS AGE
prometheus-kube-prometheus-operator-7d75c484b5-8x8x8 1/1 Running 0 5m
prometheus-kube-state-metrics-7d75c484b5-8x8x8 1/1 Running 0 5m
prometheus-prometheus-0 2/2 Running 0 5m
prometheus-alertmanager-0 2/2 Running 0 5m
prometheus-node-exporter-2q4x2 1/1 Running 0 5m
prometheus-node-exporter-5b678 1/1 Running 0 5m
prometheus-node-exporter-7c89d 1/1 Running 0 5m
# 访问Prometheus
$ kubectl port-forward svc/prometheus-kube-prometheus-prometheus 9090:9090 -n monitoring
3.1.2 配置Prometheus规则
$ kubectl apply -f – << EOF apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: k8s-alerts namespace: monitoring spec: groups: - name: kubernetes-cluster rules: - alert: HighNodeCPUUsage expr: (sum by(instance) (rate(node_cpu_seconds_total{mode!="idle"}[5m])) / (sum by(instance) (rate(node_cpu_seconds_total[5m]))) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: “高节点CPU使用率”
description: “节点 {{ $labels.instance }} 的CPU使用率超过80%”
– alert: HighNodeMemoryUsage
expr: (node_memory_MemTotal_bytes – node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: “高节点内存使用率”
description: “节点 {{ $labels.instance }} 的内存使用率超过80%”
EOF
# 查看Prometheus规则
$ kubectl get prometheusrules -n monitoring
NAME AGE
k8s-alerts 5m
3.2 Grafana配置
3.2.1 配置Grafana数据源
$ kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring
# 登录Grafana
# 默认用户名:admin
# 默认密码:prom-operator
# 添加Prometheus数据源
1. 点击左侧菜单的”Configuration” -> “Data sources”
2. 点击”Add data source”
3. 选择”Prometheus”
4. 在”URL”字段输入:http://prometheus-kube-prometheus-prometheus.monitoring:9090
5. 点击”Save & Test”
# 导入Dashboard
1. 点击左侧菜单的”+” -> “Import”
2. 输入Dashboard ID:1860(Kubernetes集群监控)
3.学习交流加群风哥QQ113257174 选择Prometheus数据源
4. 点击”Import”
3.2.2 创建自定义Dashboard
1. 点击左侧菜单的”+” -> “Dashboard”
2. 点击”Add new panel”
3. 在”Query”选项卡中输入查询语句:
sum(rate(container_cpu_usage_seconds_total{namespace=”default”}[5m])) by (pod)
4. 在”Visualization”选项卡中选择”Graph”
5. 在”General”选项卡中设置面板标题
6. 点击”Apply”
7. 点击”Save Dashboard”
3.3 AlertManager配置
3.3.1 配置AlertManager
$ kubectl apply -f – << EOF apiVersion: v1 kind: ConfigMap metadata: name: alertmanager-config namespace: monitoring data: alertmanager.yml: | global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'email' receivers: - name: 'email' email_configs: - to: 'admin@fgedu.net.cn' from: 'alertmanager@fgedu.net.cn' smarthost: 'smtp.fgedu.net.cn:587' auth_username: 'alertmanager' auth_password: 'password' require_tls: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'namespace'] EOF # 更新AlertManager $ kubectl patch deployment prometheus-kube-prometheus-alertmanager -n monitoring --patch '{"spec":{"template":{"spec":{"volumes":[{"name":"config-volume","configMap":{"name":"alertmanager-config"}}]}}}' # 查看AlertManager状态 $ kubectl get pods -n monitoring | grep alertmanager prometheus-alertmanager-0 2/2 Running 0 5m
Part04-生产案例与实战讲解
4.1 Prometheus+Grafana监控案例
4.1.1 企业级监控系统部署
# 环境:5节点K8s集群
# 目标:部署Prometheus+Grafana监控系统,监控集群和应用
# 1. 安装Prometheus Stack
$ helm repo add prometheus-community https://prometheus-community.github.学习交流加群风哥微信: itpux-comio/helm-charts
$ helm install prometheus prometheus-community/kube-prometheus-stack –namespace monitoring –create-namespace
# 2. 配置监控目标
$ kubectl apply -f – << EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-monitor
namespace: monitoring
spec:
selector:
matchLabels:
app: nginx
namespaceSelector:
matchNames:
- default
endpoints:
- port: http
interval: 15s
EOF
# 3. 部署应用
$ kubectl apply -f - << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: http
EOF
$ kubectl expose deployment nginx --port=80 --type=ClusterIP --name=nginx
# 4. 访问Grafana
$ kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring
# 5. 导入Dashboard
# 导入Kubernetes集群监控Dashboard(ID: 1860)
# 导入Nginx监控Dashboard(ID: 9614)
# 6. 查看监控数据
# 在Grafana中查看集群和Nginx的监控数据
4.2 告警系统实施案例
4.2.1 企业级告警系统部署
# 环境:3节点K8s集群
# 目标:部署告警系统,及时发现和处理异常
# 1. 配置AlertManager
$ kubectl apply -f – << EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: monitoring
data:
alertmanager.yml: |
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'namespace']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'slack'
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
channel: '#alerts'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'namespace']
EOF
# 2. 更新AlertManager
$ kubectl patch deployment prometheus-kube-prometheus-alertmanager -n monitoring --patch '{"spec":{"template":{"spec":{"volumes":[{"name":"config-volume","configMap":{"name":"alertmanager-config"}}]}}}'
# 3. 创建告警规则
$ kubectl apply -f - << EOF
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: app-alerts
namespace: monitoring
spec:
groups:
- name: application
rules:
- alert: HighPodCPUUsage
expr: sum by(pod) (rate(container_cpu_usage_seconds_total{namespace="default"}[5m])) > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: “高Pod CPU使用率”
description: “Pod {{ $labels.pod }} 的CPU使用率超过0.5核”
– alert: PodNotReady
expr: kube_pod_status_ready{condition=”true”} == 0
for: 5m
labels:
severity: critical
annotations:
summary: “Pod未就绪”
description: “Pod {{ $labels.pod }} 未就绪超过5分钟”
EOF
# 4. 测试告警
# 增加Pod负载触发告警
$ kubectl exec -it nginx-6799fc88d8-2q4x2 — stress –cpu 2 –timeout 60s
# 查看告警状态
$ kubectl port-forward svc/prometheus-kube-prometheus-alertmanager 9093:9093 -n monitoring
# 在浏览器中访问 http://localhost:9093 查看告警状态
4.3 多集群监控案例
4.3.1 多集群监控系统部署
# 环境:2个K8s集群
# 目标:部署多集群监控系统,集中管理监控数据
# 1. 在主集群部署Thanos
$ helm repo add thanos https://thanos-io.github.io/helm-charts
$ helm install thanos thanos/thanos –namespace monitoring –create-namespace
# 2. 在每个集群部署Prometheus,并配置远程写入
$ helm install prometheus prometheus-community/kube-prometheus-stack –namespace monitoring –create-namespace –set prometheus.prometheusSpec.更多视频教程www.fgedu.net.cnremoteWrite[0].url=”http://thanos-receive.monitoring:19291/api/v1/receive”
# 3. 配置Grafana数据源
$ kubectl port-forward svc/prometheus-grafana 3000:80 -n monitoring
# 添加Thanos数据源:http://thanos-query.monitoring:9090
# 4. 创建跨集群Dashboard
# 在Grafana中创建跨集群的监控Dashboard,展示所有集群的状态
# 5. 查看多集群监控数据
# 在Grafana中查看所有集群的监控数据,统一管理和分析
Part05-风哥经验总结与分享
5.1 K8s监控与告警最佳实践
Kubernetes监控与告警最佳实践:
- 全面监控:监控集群的各个层次,包括基础设施、容器平台、应用和业务
- 合理配置告警:设置适当的告警阈值,避免告警风暴
- 分级告警:根据严重程度分级,确保重要告警得到及时处理
- 告警聚合:将相关告警聚合,减少告警数量,提高处理效率
- 监控可视化:使用Grafana创建直观的监控Dashboard,便于分析和排查
- 长期存储:使用Thanos等工具实现监控数据的长期存储和分析
- 自动化处理:对常见告警实现自动化处理,减少人工干预
- 定期演练:定期演练告警响应流程,确保团队能够及时有效处理告警
5.2 常见问题与解决方案
## 1. 监控数据丢失
– 原因:Prometheus存储配置不当、磁盘空间不足、Pod重启
– 解决方案:配置适当的存储大小、启用持久化存储、使用Thanos长期存储
## 2. 告警风暴
– 原因:告警阈值设置过低、告警规则过于敏感、系统故障
– 解决方案:调整告警阈值、优化告警规则、启用告警抑制和聚合
## 3. 监控系统性能问题
– 原因:监控目标过多、采集频率过高、存储性能不足
– 解决方案:优化监控目标、调整采集频率、使用高性能存储
## 4. 告警通知未收到
– 原因:通知配置错误、网络问题、接收端故障
– 解决方案:检查通知配置、测试通知通道、使用多渠道通知
## 5. 监控数据不准确
– 原因:指标采集错误、计算方法不当、时间窗口设置不合理
– 解决方案:检查指标采集配置、优化计算方法、调整时间窗口
5.3 性能调优建议
风哥针对
Kubernetes监控与告警性能调优建议:
- 优化Prometheus配置:调整存储大小、保留时间、采集频率等参数
- 使用分片采集:对于大规模集群,使用Prometheus分片采集,减少单个Prometheus的负载
- 启用压缩存储:使用压缩算法减少监控数据的存储空间
- 优化告警规则:减少复杂的告警规则,避免过度计算
- 使用缓存:启用Prometheus查询缓存,提高查询性能
- 水平扩展:根据集群规模水平扩展Prometheus和Grafana
- 监控监控系统:监控监控系统本身的性能,确保其稳定运行
- 定期清理:定期清理过期的监控数据和告警,保持系统性能
风哥提示:
风哥提示:
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
