第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 故障处理流程
故障发现:通过监控系统或用户报告发现故障
故障分类:确定故障类型和严重程度
故障定位:使用各种工具和方法定位故障原因
故障处理:根据故障原因,执行相应的处理操作
故障验证:验证故障是否已解决
故障记录:记录故障处理过程和结果
故障分析:分析故障原因,提出改进措施
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 监控集群的状态和性能。
解决方案
环境准备:
监控服务器:monitor-server
集群节点:node1, node2, node3
操作系统:CentOS 7
部署 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 &- 部署 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 &- 部署 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 &- 部署 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"- 配置告警:
# 配置告警规则
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 &验证监控:
访问 Grafana 仪表盘,查看集群状态和性能
模拟节点故障,测试告警功能
分析监控数据,优化集群配置
案例2:Kubernetes 集群维护
场景描述
某企业部署了一个 Kubernetes 集群,用于运行容器化应用。需要制定和实施集群维护计划。
解决方案
维护计划制定:
日常维护:监控检查、日志分析、资源使用情况检查
每周维护:备份 etcd、更新 Kubernetes 组件、性能优化
每月维护:安全扫描、集群健康检查、容量规划
自动化维护脚本:
# 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- 定期执行维护:
# 添加到 crontab
# 每天执行一次
0 2 * * * /opt/maintenance/k8s-maintenance.sh
# 每周日执行一次完整维护
0 1 * * 0 /opt/maintenance/k8s-full-maintenance.sh- 集群升级:
# 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维护验证:
执行维护脚本,检查集群状态
验证备份的完整性和可用性
测试应用的可用性和性能
分析维护日志,优化维护流程
案例3:Ceph 存储集群监控与维护
场景描述
某企业部署了一个 Ceph 存储集群,用于提供块存储、文件存储和对象存储服务。需要监控集群状态和性能,并进行定期维护。
解决方案
- 部署 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- 配置 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"- 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- 定期执行维护:
# 添加到 crontab
# 每天执行一次
0 3 * * * /opt/maintenance/ceph-maintenance.sh
# 每周日执行一次深度维护
0 2 * * 0 /opt/maintenance/ceph-deep-maintenance.sh故障处理演练:
- 模拟 OSD 故障,测试自动故障转移
- 测试数据重建和恢复过程
- 验证监控告警和故障处理流程
- 分析演练结果,优化故障处理流程
课后练习
基础练习
监控工具部署:部署 Nagios 或 Zabbix 监控系统,监控一个 2 节点的集群。
监控指标配置:配置基本的系统级和集群级监控指标。
告警配置:配置告警规则和通知方式,测试告警功能。
进阶练习
Prometheus + Grafana 部署:部署 Prometheus + Grafana 监控系统,监控一个多节点集群。
自定义监控:开发自定义的监控插件或 exporter,监控特定的应用或服务。
自动化维护:编写自动化维护脚本,定期执行集群维护任务。
综合练习
完整监控解决方案:设计并实现一个完整的集群监控解决方案,包括:
- 监控架构设计
- 监控工具部署
- 监控指标配置
- 告警策略配置
- 监控仪表盘设计
集群维护计划:制定一个完整的集群维护计划,包括:
- 日常维护任务
- 周期性维护任务
- 故障处理流程
- 维护脚本开发
- 维护效果评估
最佳实践验证:根据集群监控与维护的最佳实践,评估和优化现有的集群监控与维护方案。
总结
集群监控与维护是确保集群系统稳定、可靠运行的关键环节。本集介绍了集群监控与维护的基本概念、常用工具、监控指标、维护任务和最佳实践,详细讲解了如何设计和实施集群监控与维护方案。
在实际的集群管理中,系统管理员需要根据集群的规模、类型和业务需求,选择合适的监控工具和维护策略。同时,需要不断学习和掌握新的监控技术和维护方法,以适应不断变化的技术环境和业务需求。
随着技术的不断发展,集群监控与维护也在向智能化、自动化方向演进。系统管理员需要积极拥抱这些新技术,如人工智能、机器学习、自动化运维等,以提高集群监控与维护的效率和效果。
通过本集的学习,系统管理员应该能够掌握集群监控与维护的核心技术和方法,设计和实施有效的集群监控与维护方案,确保集群系统的高可用性、高性能和安全性,为业务的稳定运行提供有力的保障。