第246集:集群监控与维护

教学目标

  • 了解集群监控与维护的基本概念和重要性

  • 掌握常用的集群监控工具和技术

  • 学习集群监控的核心指标和监控策略

  • 熟悉集群维护的日常任务和最佳实践

  • 能够根据实际场景设计和实施集群监控与维护方案

核心知识点讲解

1. 集群监控与维护概述

1.1 集群监控的基本概念

集群监控 是指对集群系统的各个组件、节点和服务进行实时监控,收集性能数据、状态信息和故障告警,以确保集群系统的正常运行和高可用性。

1.2 集群维护的基本概念

集群维护 是指对集群系统进行日常的管理、配置更新、补丁安装、性能优化和故障处理等操作,以确保集群系统的稳定性、可靠性和安全性。

1.3 集群监控与维护的重要性

集群监控与维护在以下方面发挥重要作用:

  • 故障预防:通过实时监控,及时发现潜在问题,预防故障发生

  • 故障快速定位:当故障发生时,快速定位故障原因,减少故障处理时间

  • 性能优化:通过性能数据分析,识别性能瓶颈,优化集群性能

  • 容量规划:根据监控数据,预测资源需求,进行合理的容量规划

  • 安全保障:监控异常访问和安全事件,保障集群系统的安全

  • 合规性:满足行业合规要求,提供审计和报告支持

2. 集群监控工具

2.1 传统监控工具

2.1.1 Nagios

Nagios 是一种功能强大的开源监控系统,用于监控网络、服务器和应用程序的状态。

  • 特点

    • 广泛的插件支持

    • 灵活的告警机制

    • 详细的报告和趋势分析

    • 可扩展的架构

  • 核心组件

    • Nagios Core:核心监控引擎

    • Nagios Plugins:各种监控插件

    • NRPE (Nagios Remote Plugin Executor):远程执行插件

    • NSCA (Nagios Service Check Acceptor):接收被动检查结果

  • 配置示例

# 安装Nagios
yum install -y nagios nagios-plugins-all nrpe

# 配置监控主机
cat > /etc/nagios/conf.d/cluster_hosts.cfg << 'EOF'
define host {
    use                     linux-server
    host_name               node1
    alias                   Cluster Node 1
    address                 192.168.1.101
    register                1
}

define host {
    use                     linux-server
    host_name               node2
    alias                   Cluster Node 2
    address                 192.168.1.102
    register                1
}
EOF

# 配置服务监控
cat > /etc/nagios/conf.d/cluster_services.cfg << 'EOF'
define service {
    use                     generic-service
    host_name               node1,node2
    service_description     SSH
    check_command           check_ssh
    max_check_attempts      5
    check_interval          5
    retry_interval          1
    check_period            24x7
    notification_interval   60
    notification_period     24x7
}

define service {
    use                     generic-service
    host_name               node1,node2
    service_description     HTTP
    check_command           check_http
    max_check_attempts      5
    check_interval          5
    retry_interval          1
    check_period            24x7
    notification_interval   60
    notification_period     24x7
}
EOF

# 重启Nagios服务
systemctl restart nagios
systemctl enable nagios

# 访问Nagios Web界面
# 浏览器访问: http://server_ip/nagios
# 用户名: nagiosadmin
# 密码: 安装时设置的密码
2.1.2 Zabbix

Zabbix 是一种企业级的开源监控解决方案,提供实时监控、自动发现、告警和可视化功能。

  • 特点

    • 自动发现网络设备和服务器

    • 分布式监控架构

    • 实时告警和通知

    • 强大的可视化和报表功能

    • 支持多种监控方式(SNMP、JMX、IPMI等)

  • 核心组件

    • Zabbix Server:核心监控服务器

    • Zabbix Agent:安装在被监控主机上的代理

    • Zabbix Proxy:分布式监控代理

    • Zabbix Frontend:Web界面

  • 配置示例

# 安装Zabbix Server
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent

# 配置数据库
mysql -u root -p
CREATE DATABASE zabbix character set utf8 collate utf8_bin;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'localhost';
FLUSH PRIVILEGES;
quit;

# 导入初始数据
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -u zabbix -p zabbix

# 配置Zabbix Server
cat > /etc/zabbix/zabbix_server.conf << 'EOF'
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=password
EOF

# 启动服务
systemctl start zabbix-server zabbix-agent httpd
systemctl enable zabbix-server zabbix-agent httpd

# 访问Zabbix Web界面
# 浏览器访问: http://server_ip/zabbix
# 用户名: Admin
# 密码: zabbix

# 添加监控主机
# 1. 登录Zabbix Web界面
# 2. 点击"Configuration" -> "Hosts" -> "Create host"
# 3. 填写主机信息,添加监控模板

2.2 现代监控工具

2.2.1 Prometheus

Prometheus 是一种开源的监控和告警系统,特别适合容器和云环境中的监控。

  • 特点

    • 多维数据模型

    • 灵活的查询语言(PromQL)

    • 高效的存储

    • 实时告警

    • 与 Grafana 集成,提供丰富的可视化

  • 核心组件

    • Prometheus Server:核心监控服务器

    • Exporters:数据采集器

    • Alertmanager:告警管理器

    • Grafana:可视化工具

  • 配置示例

# 安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
tar xvfz prometheus-2.30.3.linux-amd64.tar.gz
mv prometheus-2.30.3.linux-amd64 /opt/prometheus

# 配置Prometheus
cat > /opt/prometheus/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['node1:9100', 'node2:9100']

  - job_name: 'cadvisor'
    static_configs:
      - targets: ['node1:8080', 'node2:8080']
EOF

# 启动Prometheus
nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml > /var/log/prometheus.log 2>&1 &

# 安装Node Exporter(在所有节点上执行)
wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz
tar xvfz node_exporter-1.2.2.linux-amd64.tar.gz
mv node_exporter-1.2.2.linux-amd64 /opt/node_exporter
nohup /opt/node_exporter/node_exporter > /var/log/node_exporter.log 2>&1 &

# 安装Grafana
yum install -y https://dl.grafana.com/oss/release/grafana-8.2.5-1.x86_64.rpm
systemctl start grafana-server
systemctl enable grafana-server

# 访问Grafana
# 浏览器访问: http://server_ip:3000
# 用户名: admin
# 密码: admin

# 添加Prometheus数据源并导入仪表盘
2.2.2 Grafana

Grafana 是一种开源的可视化和监控平台,支持多种数据源,提供丰富的仪表盘和报表功能。

  • 特点

    • 支持多种数据源(Prometheus、InfluxDB、Elasticsearch等)

    • 丰富的可视化选项

    • 灵活的告警机制

    • 支持仪表盘共享和导出

    • 插件扩展系统

  • 配置示例

# 安装Grafana
yum install -y https://dl.grafana.com/oss/release/grafana-8.2.5-1.x86_64.rpm

# 启动服务
systemctl start grafana-server
systemctl enable grafana-server

# 配置数据源
# 1. 登录Grafana
# 2. 点击"Configuration" -> "Data sources"
# 3. 点击"Add data source"
# 4. 选择数据源类型,填写连接信息

# 导入仪表盘
# 1. 点击"Create" -> "Import"
# 2. 输入仪表盘ID或上传JSON文件
# 3. 选择数据源,点击"Import"

# 创建自定义仪表盘
# 1. 点击"Create" -> "Dashboard"
# 2. 添加面板,配置查询和可视化
# 3. 保存仪表盘

2.3 集群专用监控工具

2.3.1 Pacemaker/Corosync 监控工具
  • pcs status:查看 Pacemaker 集群状态
  • corosync-cfgtool -l:查看 Corosync 集群成员状态
  • crm_mon:实时监控集群状态
2.3.2 Kubernetes 监控工具
  • kubectl top:查看集群资源使用情况
  • kubectl get events:查看集群事件
  • Prometheus + Grafana:Kubernetes 集群监控
  • Kubernetes Dashboard:Web 界面监控
2.3.3 Ceph 监控工具
  • ceph status:查看 Ceph 集群状态
  • ceph osd tree:查看 OSD 状态
  • ceph df:查看存储使用情况
  • Ceph Dashboard:Web 界面监控

3. 集群监控指标

3.1 系统级指标

系统级指标 反映了集群节点的基本状态和资源使用情况。

| 指标 | 描述 | 监控工具 |

|-----|-----|----------|

| CPU 使用率 | 节点 CPU 使用率 | Node Exporter, Nagios, Zabbix |

| 内存使用率 | 节点内存使用情况 | Node Exporter, Nagios, Zabbix |

| 磁盘使用率 | 磁盘空间使用情况 | Node Exporter, Nagios, Zabbix |

| 磁盘 I/O | 磁盘读写速度和延迟 | Node Exporter, iostat |

| 网络流量 | 网络接口的收发流量 | Node Exporter, ifstat |

| 系统负载 | 节点的系统负载 | Node Exporter, uptime |

| 进程状态 | 关键进程的运行状态 | Nagios, Zabbix, ps |

3.2 集群级指标

集群级指标 反映了整个集群的状态和性能。

| 指标 | 描述 | 监控工具 |

|-----|-----|----------|

| 节点状态 | 集群节点的在线/离线状态 | Pacemaker, Corosync, Kubernetes |

| 服务状态 | 集群服务的运行状态 | Pacemaker, Kubernetes, systemctl |

| 资源使用 | 集群资源的分配和使用情况 | Pacemaker, Kubernetes, Ceph |

| 故障转移 | 故障转移事件和频率 | Pacemaker, Corosync, Kubernetes |

| 数据一致性 | 集群数据的一致性状态 | Ceph, GlusterFS, DRBD |

| 集群健康 | 集群的整体健康状态 | Pacemaker, Ceph, Kubernetes |

3.3 应用级指标

应用级指标 反映了集群中运行的应用程序的状态和性能。

| 指标 | 描述 | 监控工具 |

|-----|-----|----------|

| 响应时间 | 应用程序的响应时间 | Prometheus, Nagios, Zabbix |

| 请求率 | 应用程序的请求处理速率 | Prometheus, Nagios, Zabbix |

| 错误率 | 应用程序的错误率 | Prometheus, Nagios, Zabbix |

| 并发连接 | 应用程序的并发连接数 | Prometheus, netstat |

| 队列长度 | 应用程序的请求队列长度 | Prometheus, 应用特定指标 |

| 缓存命中率 | 应用程序的缓存命中率 | Prometheus, 应用特定指标 |

4. 集群监控策略

4.1 监控架构设计

监控架构设计 决定了监控系统的部署方式和数据流向。

4.1.1 集中式监控架构
  • 特点:所有监控数据发送到中央监控服务器
  • 优点:架构简单,易于管理
  • 缺点:中央服务器可能成为瓶颈,单点故障风险
  • 适用场景:小规模集群(节点数 < 100)
4.1.2 分布式监控架构
  • 特点:使用多个监控服务器,数据分层处理
  • 优点:可扩展性强,无单点故障
  • 缺点:架构复杂,管理难度大
  • 适用场景:大规模集群(节点数 > 100)
4.1.3 混合式监控架构
  • 特点:结合集中式和分布式架构的优点
  • 优点:灵活性高,可根据实际情况调整
  • 缺点:架构设计复杂
  • 适用场景:中大规模集群

4.2 监控数据采集策略

监控数据采集策略 决定了监控数据的采集方式、频率和范围。

4.2.1 主动采集
  • 特点:监控服务器主动向被监控对象请求数据
  • 优点:实时性强,可控性好
  • 缺点:可能增加被监控对象的负载
  • 适用场景:关键服务和指标的监控
4.2.2 被动采集
  • 特点:被监控对象主动向监控服务器发送数据
  • 优点:减少监控服务器的负载
  • 缺点:实时性可能较差,需要额外的配置
  • 适用场景:大规模集群的监控
4.2.3 采集频率
  • 高频采集(1-5秒):适用于对实时性要求高的指标,如网络流量、系统负载
  • 中频采集(15-60秒):适用于一般性能指标,如CPU、内存使用率
  • 低频采集(5-15分钟):适用于变化较慢的指标,如磁盘使用率、软件版本

4.3 告警策略

告警策略 决定了何时、如何发送告警,以及告警的级别和处理流程。

4.3.1 告警级别
  • 紧急(Critical):需要立即处理的严重问题,如节点宕机、服务不可用
  • 警告(Warning):需要关注的潜在问题,如资源使用率接近阈值
  • 信息(Information):一般信息,如配置变更、服务重启
4.3.2 告警触发条件
  • 阈值触发:当指标超过预设阈值时触发告警
  • 趋势触发:当指标变化趋势异常时触发告警
  • 状态触发:当服务状态发生变化时触发告警
  • 复合触发:多个条件组合触发告警
4.3.3 告警通知方式
  • 邮件:传统的告警通知方式
  • 短信:紧急告警的通知方式
  • 即时通讯:如 Slack、钉钉、微信等
  • 自动语音:高优先级告警的通知方式
  • API 集成:与其他系统集成,如 ITSM 系统
4.3.4 告警抑制和聚合
  • 告警抑制:当一个主告警触发时,抑制相关的次要告警
  • 告警聚合:将多个相关的告警聚合为一个告警,减少告警噪音
  • 告警升级:当告警未在规定时间内处理时,自动升级告警级别

5. 集群维护任务

5.1 日常维护任务

日常维护任务 是集群维护的基础,需要定期执行。

5.1.1 监控检查
  • 每日检查:查看监控告警,处理异常情况
  • 每周检查:分析性能趋势,检查系统日志
  • 每月检查:全面的系统健康检查,包括磁盘、内存、网络等
5.1.2 配置管理
  • 配置备份:定期备份集群配置文件
  • 配置版本控制:使用 Git 等工具管理配置变更
  • 配置审计:定期审计配置,确保合规性
5.1.3 补丁管理
  • 补丁评估:评估补丁的必要性和风险
  • 补丁测试:在测试环境中测试补丁
  • 补丁部署:在生产环境中部署补丁
  • 补丁回滚:当补丁导致问题时,执行回滚操作
5.1.4 性能优化
  • 性能监控:持续监控集群性能
  • 性能分析:分析性能数据,识别瓶颈
  • 性能调优:调整系统参数,优化性能
  • 性能测试:验证性能优化效果

5.2 周期性维护任务

周期性维护任务 需要按固定周期执行,确保集群的长期稳定运行。

5.2.1 月度维护
  • 磁盘检查:使用 smartctl 检查磁盘健康状态
  • 文件系统检查:使用 fsck 检查文件系统一致性
  • 备份验证:验证备份的完整性和可用性
  • 安全扫描:执行安全漏洞扫描
5.2.2 季度维护
  • 硬件检查:检查服务器硬件状态,如风扇、电源
  • 网络检查:检查网络设备和连接状态
  • 容量规划:评估存储和计算资源使用情况,进行容量规划
  • 文档更新:更新集群文档,包括架构、配置和操作手册
5.2.3 年度维护
  • 全面审计:对集群系统进行全面审计
  • 灾难恢复测试:执行灾难恢复演练
  • 硬件更新:更新老化的硬件设备
  • 架构评估:评估集群架构,规划未来升级

5.3 故障处理任务

故障处理任务 是当集群发生故障时需要执行的操作。

5.3.1 故障分类
  • 硬件故障:如服务器、磁盘、网络设备故障
  • 软件故障:如操作系统、应用程序故障
  • 配置故障:如配置错误导致的问题
  • 性能故障:如资源不足导致的性能下降
  • 安全故障:如安全漏洞被利用导致的问题
5.3.2 故障处理流程
  1. 故障发现:通过监控系统或用户报告发现故障

  2. 故障分类:确定故障类型和严重程度

  3. 故障定位:使用各种工具和方法定位故障原因

  4. 故障处理:根据故障原因,执行相应的处理操作

  5. 故障验证:验证故障是否已解决

  6. 故障记录:记录故障处理过程和结果

  7. 故障分析:分析故障原因,提出改进措施

5.3.3 常见故障处理
  • 节点宕机:检查硬件状态,重启节点,恢复服务
  • 服务不可用:检查服务状态,重启服务,查看日志
  • 网络中断:检查网络连接,重启网络设备,修复网络配置
  • 磁盘故障:更换故障磁盘,恢复数据
  • 性能下降:识别性能瓶颈,优化系统配置,增加资源

6. 集群维护最佳实践

6.1 设计原则

6.1.1 简单性
  • 简化架构:避免过度复杂的集群架构
  • 标准化配置:使用标准化的配置和部署流程
  • 自动化管理:尽可能自动化维护任务
6.1.2 冗余性
  • 硬件冗余:使用冗余的硬件设备,如 RAID、多电源
  • 网络冗余:使用冗余的网络连接和设备
  • 服务冗余:部署多个实例,实现高可用性
6.1.3 可观测性
  • 全面监控:监控所有关键组件和指标
  • 详细日志:配置适当的日志级别,保留足够的日志
  • 性能分析:定期分析性能数据,识别问题
6.1.4 安全性
  • 最小权限:遵循最小权限原则
  • 定期更新:及时更新系统和软件
  • 安全审计:定期进行安全审计和漏洞扫描
  • 灾难恢复:制定并测试灾难恢复计划

6.2 配置管理最佳实践

  • 版本控制:使用 Git 等工具管理配置文件
  • 配置模板:使用模板生成配置,确保一致性
  • 自动化部署:使用 Ansible、Puppet 等工具自动化配置部署
  • 配置验证:在部署前验证配置的正确性

6.3 补丁管理最佳实践

  • 补丁评估:评估补丁的必要性和风险
  • 测试环境:在测试环境中测试所有补丁
  • 滚动更新:使用滚动更新方式部署补丁,减少服务中断
  • 回滚计划:为每个补丁制定回滚计划
  • 变更窗口:在预定的变更窗口内执行补丁部署

6.4 性能优化最佳实践

  • 基准测试:建立性能基准,用于比较和评估
  • 瓶颈分析:使用专业工具分析性能瓶颈
  • 增量优化:小步快跑,逐步优化,避免大的变更
  • 监控验证:通过监控验证优化效果
  • 文档记录:记录所有优化操作和结果

6.5 灾难恢复最佳实践

  • 定期测试:定期测试灾难恢复计划
  • 备份验证:验证备份的完整性和可用性
  • 恢复时间目标:明确恢复时间目标(RTO)和恢复点目标(RPO)
  • 演练计划:制定详细的灾难恢复演练计划
  • 持续改进:根据演练结果,持续改进灾难恢复计划

7. 集群监控与维护的发展趋势

7.1 智能化监控

智能化监控 利用人工智能和机器学习技术,实现监控的自动化和智能化。

  • 特点

    • 异常检测:自动检测异常模式和行为

    • 预测分析:预测潜在问题和故障

    • 自动修复:自动执行修复操作

    • 智能告警:减少误报,提高告警质量

  • 代表

    • Prometheus + AI 插件

    • Datadog AI

    • New Relic AI

7.2 自动化运维

自动化运维 利用脚本、工具和平台,实现集群运维的自动化。

  • 特点

    • 基础设施即代码(IaC):使用代码定义和管理基础设施

    • 持续集成/持续部署(CI/CD):自动化代码部署和测试

    • 自动扩缩容:根据负载自动调整资源

    • 自修复系统:自动检测和修复问题

  • 代表

    • Ansible

    • Terraform

    • Kubernetes Operators

7.3 云原生监控

云原生监控 专为云环境和容器化应用设计,提供更适合现代架构的监控解决方案。

  • 特点

    • 容器感知:了解容器的生命周期和状态

    • 服务网格监控:监控服务间的通信

    • 分布式追踪:跟踪请求在分布式系统中的路径

    • 云服务集成:与云服务提供商的监控服务集成

  • 代表

    • Prometheus + Grafana

    • OpenTelemetry

    • CloudWatch

    • Stackdriver

7.4 边缘计算监控

边缘计算监控 将监控能力延伸到网络边缘,满足边缘计算的监控需求。

  • 特点

    • 低延迟:本地处理监控数据,减少延迟

    • 离线操作:在网络中断时仍能正常工作

    • 边缘与中心协同:边缘设备与中心系统协同工作

    • 资源受限:适应边缘设备的资源限制

  • 代表

    • EdgeX Foundry

    • Prometheus Edge

    • AWS IoT SiteWise

实用案例分析

案例1:使用 Prometheus + Grafana 监控 Pacemaker 集群

场景描述

某企业部署了一个 3 节点的 Pacemaker 高可用集群,用于运行关键业务应用。需要使用 Prometheus + Grafana 监控集群的状态和性能。

解决方案

  1. 环境准备

    • 监控服务器:monitor-server

    • 集群节点:node1, node2, node3

    • 操作系统:CentOS 7

  2. 部署 Prometheus

# 安装Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
tar xvfz prometheus-2.30.3.linux-amd64.tar.gz
mv prometheus-2.30.3.linux-amd64 /opt/prometheus

# 配置Prometheus
cat > /opt/prometheus/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['node1:9100', 'node2:9100', 'node3:9100']

  - job_name: 'pacemaker_exporter'
    static_configs:
      - targets: ['node1:9664', 'node2:9664', 'node3:9664']
EOF

# 启动Prometheus
nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml > /var/log/prometheus.log 2>&1 &
  1. 部署 Node Exporter
# 在所有集群节点上执行
wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz
tar xvfz node_exporter-1.2.2.linux-amd64.tar.gz
mv node_exporter-1.2.2.linux-amd64 /opt/node_exporter
nohup /opt/node_exporter/node_exporter > /var/log/node_exporter.log 2>&1 &
  1. 部署 Pacemaker Exporter
# 在所有集群节点上执行
git clone https://github.com/ClusterLabs/pacemaker-exporter.git
cd pacemaker-exporter
make
sudo cp pacemaker-exporter /usr/local/bin/
nohup /usr/local/bin/pacemaker-exporter > /var/log/pacemaker-exporter.log 2>&1 &
  1. 部署 Grafana
# 安装Grafana
yum install -y https://dl.grafana.com/oss/release/grafana-8.2.5-1.x86_64.rpm
systemctl start grafana-server
systemctl enable grafana-server

# 访问Grafana
# 浏览器访问: http://monitor-server:3000
# 用户名: admin
# 密码: admin

# 添加Prometheus数据源
# 1. 点击"Configuration" -> "Data sources"
# 2. 点击"Add data source"
# 3. 选择"Prometheus"
# 4. 输入URL: http://localhost:9090
# 5. 点击"Save & Test"

# 导入Pacemaker集群监控仪表盘
# 1. 点击"Create" -> "Import"
# 2. 输入仪表盘ID: 12345(示例)
# 3. 选择Prometheus数据源
# 4. 点击"Import"
  1. 配置告警
# 配置告警规则
cat > /opt/prometheus/rules/cluster-alerts.yml << 'EOF'
groups:
- name: cluster_alerts
  rules:
  - alert: NodeDown
    expr: up{job="node_exporter"} == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Node {{ $labels.instance }} is down"
description: "Node {{ $labels.instance }} has been down for more than 5 minutes"

  - alert: HighCPUUsage
    expr: (100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage on {{ $labels.instance }} has been above 80% for more than 5 minutes"

  - alert: ClusterResourceFailed
    expr: pacemaker_resource_status{state="failed"} == 1
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Pacemaker resource {{ $labels.resource }} failed"
description: "Pacemaker resource {{ $labels.resource }} on {{ $labels.instance }} has failed"
EOF

# 更新Prometheus配置
cat >> /opt/prometheus/prometheus.yml << 'EOF'

rule_files:
  - "rules/cluster-alerts.yml"
EOF

# 重启Prometheus
pkill -f prometheus
nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml > /var/log/prometheus.log 2>&1 &
  1. 验证监控

    • 访问 Grafana 仪表盘,查看集群状态和性能

    • 模拟节点故障,测试告警功能

    • 分析监控数据,优化集群配置

案例2:Kubernetes 集群维护

场景描述

某企业部署了一个 Kubernetes 集群,用于运行容器化应用。需要制定和实施集群维护计划。

解决方案

  1. 维护计划制定

    • 日常维护:监控检查、日志分析、资源使用情况检查

    • 每周维护:备份 etcd、更新 Kubernetes 组件、性能优化

    • 每月维护:安全扫描、集群健康检查、容量规划

  2. 自动化维护脚本

# Kubernetes 集群维护脚本
cat > /opt/maintenance/k8s-maintenance.sh << 'EOF'
#!/bin/bash

# 日志文件
LOG_FILE="/var/log/k8s-maintenance.log"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Kubernetes 集群维护开始" >> $LOG_FILE

# 1. 检查集群状态
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查集群状态" >> $LOG_FILE
kubectl cluster-info
kubectl get nodes

# 2. 备份 etcd
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份 etcd" >> $LOG_FILE
ETCD_BACKUP_DIR="/backup/etcd/$(date '+%Y%m%d_%H%M%S')"
mkdir -p $ETCD_BACKUP_DIR

# 获取 etcd 服务地址
ETCD_SERVER=$(kubectl get endpoints -n kube-system etcd -o jsonpath='{.subsets[0].addresses[0].ip}')

# 备份 etcd
export ETCDCTL_API=3
etcdctl --endpoints=https://$ETCD_SERVER:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save $ETCD_BACKUP_DIR/etcd-snapshot.db

# 3. 检查资源使用情况
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查资源使用情况" >> $LOG_FILE
kubectl top nodes
kubectl top pods --all-namespaces

# 4. 检查集群事件
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查集群事件" >> $LOG_FILE
kubectl get events --all-namespaces --sort-by='.lastTimestamp'

# 5. 清理未使用的资源
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理未使用的资源" >> $LOG_FILE

# 清理未使用的镜像
docker system prune -f

# 清理已完成的 Pod
kubectl get pods --all-namespaces --field-selector status.phase=Succeeded -o name | xargs -r kubectl delete

# 清理已失败的 Pod
kubectl get pods --all-namespaces --field-selector status.phase=Failed -o name | xargs -r kubectl delete

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Kubernetes 集群维护完成" >> $LOG_FILE
EOF

chmod +x /opt/maintenance/k8s-maintenance.sh
  1. 定期执行维护
# 添加到 crontab
# 每天执行一次
0 2 * * * /opt/maintenance/k8s-maintenance.sh

# 每周日执行一次完整维护
0 1 * * 0 /opt/maintenance/k8s-full-maintenance.sh
  1. 集群升级
# Kubernetes 集群升级脚本
cat > /opt/maintenance/k8s-upgrade.sh << 'EOF'
#!/bin/bash

# 日志文件
LOG_FILE="/var/log/k8s-upgrade.log"

# 目标版本
TARGET_VERSION="v1.21.0"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Kubernetes 集群升级开始,目标版本: $TARGET_VERSION" >> $LOG_FILE

# 1. 备份集群配置
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份集群配置" >> $LOG_FILE
BACKUP_DIR="/backup/k8s/$(date '+%Y%m%d_%H%M%S')"
mkdir -p $BACKUP_DIR
cp -r /etc/kubernetes/* $BACKUP_DIR/

# 2. 升级 kubeadm
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 升级 kubeadm" >> $LOG_FILE
yum install -y kubeadm-$TARGET_VERSION

# 3. 检查升级计划
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查升级计划" >> $LOG_FILE
kubeadm upgrade plan $TARGET_VERSION

# 4. 升级控制平面
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 升级控制平面" >> $LOG_FILE
kubeadm upgrade apply $TARGET_VERSION

# 5. 升级 kubelet 和 kubectl
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 升级 kubelet 和 kubectl" >> $LOG_FILE
yum install -y kubelet-$TARGET_VERSION kubectl-$TARGET_VERSION
systemctl daemon-reload
systemctl restart kubelet

# 6. 升级工作节点
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 升级工作节点" >> $LOG_FILE
for node in $(kubectl get nodes -l node-role.kubernetes.io/worker= -o name); do
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] 升级节点: $node" >> $LOG_FILE
  kubectl drain $node --ignore-daemonsets
  ssh $node "yum install -y kubeadm-$TARGET_VERSION kubelet-$TARGET_VERSION kubectl-$TARGET_VERSION && kubeadm upgrade node && systemctl daemon-reload && systemctl restart kubelet"
  kubectl uncordon $node
done

# 7. 验证升级结果
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 验证升级结果" >> $LOG_FILE
kubectl cluster-info
kubectl get nodes
kubectl get pods --all-namespaces

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Kubernetes 集群升级完成" >> $LOG_FILE
EOF

chmod +x /opt/maintenance/k8s-upgrade.sh
  1. 维护验证

    • 执行维护脚本,检查集群状态

    • 验证备份的完整性和可用性

    • 测试应用的可用性和性能

    • 分析维护日志,优化维护流程

案例3:Ceph 存储集群监控与维护

场景描述

某企业部署了一个 Ceph 存储集群,用于提供块存储、文件存储和对象存储服务。需要监控集群状态和性能,并进行定期维护。

解决方案

  1. 部署 Ceph Dashboard
# 启用 Ceph Dashboard
ceph mgr module enable dashboard

# 生成 SSL 证书
ceph dashboard create-self-signed-cert

# 设置管理员账号
ceph dashboard set-login-credentials admin password

# 查看 Dashboard URL
ceph mgr services

# 访问 Dashboard
# 浏览器访问: https://node1:8443
# 用户名: admin
# 密码: password
  1. 配置 Prometheus + Grafana 监控
# 启用 Prometheus 模块
ceph mgr module enable prometheus

# 配置 Prometheus
echo "- job_name: 'ceph'
  static_configs:
    - targets: ['node1:9283']" >> /opt/prometheus/prometheus.yml

# 重启 Prometheus
pkill -f prometheus
nohup /opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml > /var/log/prometheus.log 2>&1 &

# 导入 Ceph 监控仪表盘
# 1. 登录 Grafana
# 2. 点击"Create" -> "Import"
# 3. 输入仪表盘ID: 5336(Ceph Cluster)
# 4. 选择Prometheus数据源
# 5. 点击"Import"
  1. Ceph 集群维护脚本
# Ceph 集群维护脚本
cat > /opt/maintenance/ceph-maintenance.sh << 'EOF'
#!/bin/bash

# 日志文件
LOG_FILE="/var/log/ceph-maintenance.log"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Ceph 集群维护开始" >> $LOG_FILE

# 1. 检查集群状态
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查集群状态" >> $LOG_FILE
ceph status
ceph health detail

# 2. 检查 OSD 状态
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查 OSD 状态" >> $LOG_FILE
ceph osd tree
ceph osd status

# 3. 检查存储使用情况
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查存储使用情况" >> $LOG_FILE
ceph df
ceph df detail

# 4. 检查 PG 状态
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查 PG 状态" >> $LOG_FILE
ceph pg stat
ceph pg dump_stuck

# 5. 检查监控状态
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 检查监控状态" >> $LOG_FILE
ceph mgr services

# 6. 清理操作
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 执行清理操作" >> $LOG_FILE

# 清理旧的 OSD 日志
ceph osd trim

# 清理未使用的池
# ceph osd pool delete unused_pool unused_pool --yes-i-really-really-mean-it

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Ceph 集群维护完成" >> $LOG_FILE
EOF

chmod +x /opt/maintenance/ceph-maintenance.sh
  1. 定期执行维护
# 添加到 crontab
# 每天执行一次
0 3 * * * /opt/maintenance/ceph-maintenance.sh

# 每周日执行一次深度维护
0 2 * * 0 /opt/maintenance/ceph-deep-maintenance.sh
  1. 故障处理演练

    • 模拟 OSD 故障,测试自动故障转移
    • 测试数据重建和恢复过程
    • 验证监控告警和故障处理流程
    • 分析演练结果,优化故障处理流程

课后练习

基础练习

  1. 监控工具部署:部署 Nagios 或 Zabbix 监控系统,监控一个 2 节点的集群。

  2. 监控指标配置:配置基本的系统级和集群级监控指标。

  3. 告警配置:配置告警规则和通知方式,测试告警功能。

进阶练习

  1. Prometheus + Grafana 部署:部署 Prometheus + Grafana 监控系统,监控一个多节点集群。

  2. 自定义监控:开发自定义的监控插件或 exporter,监控特定的应用或服务。

  3. 自动化维护:编写自动化维护脚本,定期执行集群维护任务。

综合练习

  1. 完整监控解决方案:设计并实现一个完整的集群监控解决方案,包括:

    • 监控架构设计
    • 监控工具部署
    • 监控指标配置
    • 告警策略配置
    • 监控仪表盘设计
  2. 集群维护计划:制定一个完整的集群维护计划,包括:

    • 日常维护任务
    • 周期性维护任务
    • 故障处理流程
    • 维护脚本开发
    • 维护效果评估
  3. 最佳实践验证:根据集群监控与维护的最佳实践,评估和优化现有的集群监控与维护方案。

总结

集群监控与维护是确保集群系统稳定、可靠运行的关键环节。本集介绍了集群监控与维护的基本概念、常用工具、监控指标、维护任务和最佳实践,详细讲解了如何设计和实施集群监控与维护方案。

在实际的集群管理中,系统管理员需要根据集群的规模、类型和业务需求,选择合适的监控工具和维护策略。同时,需要不断学习和掌握新的监控技术和维护方法,以适应不断变化的技术环境和业务需求。

随着技术的不断发展,集群监控与维护也在向智能化、自动化方向演进。系统管理员需要积极拥抱这些新技术,如人工智能、机器学习、自动化运维等,以提高集群监控与维护的效率和效果。

通过本集的学习,系统管理员应该能够掌握集群监控与维护的核心技术和方法,设计和实施有效的集群监控与维护方案,确保集群系统的高可用性、高性能和安全性,为业务的稳定运行提供有力的保障。

« 上一篇 分布式文件系统 下一篇 » 集群安全管理