KubeSphere-046-运维巡检脚本与自动化巡检实践
O-M Inspection Script and Automated Inspection Practice
目录
1. 基础概念
1.1 运维巡检概述
运维巡检是指定期检查系统状态、性能指标、安全配置等,确保系统正常运行。KubeSphere集群的运维巡检包括:
- 集群状态检查:检查集群节点、Pod、Service等资源状态
- 性能指标检查:检查CPU、内存、磁盘、网络等性能指标
- 安全配置检查:检查安全策略、权限配置、漏洞扫描等
- 日志分析:分析系统日志,发现潜在问题
- 容量规划:分析资源使用情况,进行容量规划
1.2 自动化巡检
自动化巡检是通过脚本或工具自动执行巡检任务,提高巡检效率和准确性。自动化巡检的优势包括:
- 提高效率:自动执行巡检任务,节省人力
- 减少错误:避免人为错误,提高准确性
- 及时发现问题:定期自动巡检,及时发现潜在问题
- 历史数据对比:保存历史数据,进行趋势分析
- 告警通知:发现问题自动告警,及时处理
1.3 巡检工具
常用的巡检工具包括: 风哥提示: 学习交流加群风哥微信: itpux-com 学习交流加群风哥QQ113257174 更多视频教程www.fgedu.net.cn 更多学习教程公众号风哥教程itpux_com from K8S+DB视频:www.itpux.com
| 工具 | 功能 | 适用场景 |
|---|---|---|
| kubectl | Kubernetes命令行工具 | 集群状态检查 |
| Prometheus | 监控和告警系统 | 性能指标监控 |
| Grafana | 可视化面板 | 数据可视化 |
| ELK Stack | 日志收集和分析 | 日志分析 |
| Kube-bench | Kubernetes安全检查 | 安全配置检查 |
2. 生产环境规划
2.1 巡检策略
2.1.1 巡检频率
# – 每日巡检:每天执行一次
# – 每周巡检:每周执行一次
# – 每月巡检:每月执行一次
# – 季度巡检:每季度执行一次
2.1.2 巡检内容
# – 集群状态:节点、Pod、Service等
# – 性能指标:CPU、内存、磁盘、网络等
# – 安全配置:RBAC、网络策略、Pod安全策略等
# – 日志分析:系统日志、应用日志等
# – 容量规划:资源使用情况、容量预测等
2.2 巡检脚本规划
2.2.1 脚本结构
# – 集群状态检查脚本
# – 性能指标检查脚本
# – 安全配置检查脚本
# – 日志分析脚本
# – 容量规划脚本
2.2.2 输出格式
# – 文本格式:易于阅读
# – JSON格式:易于解析
# – HTML格式:易于展示
# – Markdown格式:易于文档化
2.3 告警规划
2.3.1 告警级别
# – 严重(Critical):需要立即处理
# – 警告(Warning):需要尽快处理
# – 信息(Info):需要关注
# – 调试(Debug):用于调试
2.3.2 告警方式
# – 邮件告警:发送邮件通知
# – 短信告警:发送短信通知
# – 钉钉告警:发送钉钉通知
# – 企业微信告警:发送企业微信通知
3. 实施步骤
3.1 集群状态检查脚本
3.1.1 创建脚本
cat > /usr/local/bin/cluster-check.sh <<‘EOF’
#!/bin/bash
# 集群状态检查脚本
# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
NC=’\033[0m’ # No Color
# 输出函数
print_success() {
echo -e “${GREEN}[SUCCESS]${NC} $1”
}
print_warning() {
echo -e “${YELLOW}[WARNING]${NC} $1”
}
print_error() {
echo -e “${RED}[ERROR]${NC} $1”
}
# 检查节点状态
check_nodes() {
echo “=== 检查节点状态 ===”
not_ready_nodes=$(kubectl get nodes –no-headers | grep -v “Ready” | wc -l)
if [ $not_ready_nodes -eq 0 ]; then
print_success “所有节点状态正常”
else
print_error “发现 $not_ready_nodes 个节点状态异常”
kubectl get nodes –no-headers | grep -v “Ready”
fi
echo “”
}
# 检查Pod状态
check_pods() {
echo “=== 检查Pod状态 ===”
not_ready_pods=$(kubectl get pods –all-namespaces –no-headers | grep -v “Running” | grep -v “Completed” | wc -l)
if [ $not_ready_pods -eq 0 ]; then
print_success “所有Pod状态正常”
else
print_error “发现 $not_ready_pods 个Pod状态异常”
kubectl get pods –all-namespaces –no-headers | grep -v “Running” | grep -v “Completed”
fi
echo “”
}
# 检查Service状态
check_services() {
echo “=== 检查Service状态 ===”
services=$(kubectl get services –all-namespaces –no-headers | wc -l)
print_success “共有 $services 个Service”
echo “”
}
# 检查Deployment状态
check_deployments() {
echo “=== 检查Deployment状态 ===”
not_ready_deployments=$(kubectl get deployments –all-namespaces –no-headers | awk ‘{if ($3 != $4) print}’ | wc -l)
if [ $not_ready_deployments -eq 0 ]; then
print_success “所有Deployment状态正常”
else
print_error “发现 $not_ready_deployments 个Deployment状态异常”
kubectl get deployments –all-namespaces –no-headers | awk ‘{if ($3 != $4) print}’
fi
echo “”
}
# 检查PVC状态
check_pvcs() {
echo “=== 检查PVC状态 ===”
pending_pvcs=$(kubectl get pvc –all-namespaces –no-headers | grep -v “Bound” | wc -l)
if [ $pending_pvcs -eq 0 ]; then
print_success “所有PVC状态正常”
else
print_error “发现 $pending_pvcs 个PVC状态异常”
kubectl get pvc –all-namespaces –no-headers | grep -v “Bound”
fi
echo “”
}
# 主函数
main() {
echo “========================================”
echo ” 集群状态检查报告”
echo ” 时间: $(date ‘+%Y-%m-%d %H:%M:%S’)”
echo “========================================”
echo “”
check_nodes
check_pods
check_services
check_deployments
check_pvcs
echo “========================================”
echo ” 检查完成”
echo “========================================”
}
# 执行主函数
main
EOF
# 设置执行权限
chmod +x /usr/local/bin/cluster-check.sh
cluster-check.sh created successfully
3.1.2 执行脚本
/usr/local/bin/cluster-check.sh
========================================
集群状态检查报告
时间: 2026-01-15 12:00:00
========================================
=== 检查节点状态 ===
[SUCCESS] 所有节点状态正常
=== 检查Pod状态 ===
[SUCCESS] 所有Pod状态正常
=== 检查Service状态 ===
[SUCCESS] 共有 25 个Service
=== 检查Deployment状态 ===
[SUCCESS] 所有Deployment状态正常
=== 检查PVC状态 ===
[SUCCESS] 所有PVC状态正常
========================================
检查完成
========================================
3.2 性能指标检查脚本
3.2.1 创建脚本
cat > /usr/local/bin/performance-check.sh <<‘EOF’
#!/bin/bash
# 性能指标检查脚本
# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
,
NC=’\033[0m’ # No Color
# 阈值定义
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80
# 输出函数
print_success() {
echo -e “${GREEN}[SUCCESS]${NC} $1”
}
print_warning() {
echo -e “${YELLOW}[WARNING]${NC} $1”
}
print_error() {
echo -e “${RED}[ERROR]${NC} $1”
}
# 检查CPU使用率
check_cpu() {
echo “=== 检查CPU使用率 ===”
for node in $(kubectl get nodes –no-headers | awk ‘{print $1}’); do
cpu_usage=$(kubectl top node $node –no-headers | awk ‘{print $3}’ | sed ‘s/%//’)
if (( $(echo “$cpu_usage > $CPU_THRESHOLD” | bc -l) )); then
print_error “节点 $node CPU使用率过高: ${cpu_usage}%”
else
print_success “节点 $node CPU使用率正常: ${cpu_usage}%”
fi
done
echo “”
}
# 检查内存使用率
check_memory() {
echo “=== 检查内存使用率 ===”
for node in $(kubectl get nodes –no-headers | awk ‘{print $1}’); do
memory_usage=$(kubectl top node $node –no-headers | awk ‘{print $5}’ | sed ‘s/%//’)
if (( $(echo “$memory_usage > $MEMORY_THRESHOLD” | bc -l) )); then
print_error “节点 $node 内存使用率过高: ${memory_usage}%”
else
print_success “节点 $node 内存使用率正常: ${memory_usage}%”
fi
done
echo “”
}
# 检查磁盘使用率
check_disk() {
echo “=== 检查磁盘使用率 ===”
for node in $(kubectl get nodes –no-headers | awk ‘{print $1}’); do
disk_usage=$(kubectl exec -n kube-system $(kubectl get pods -n kube-system –no-headers | grep calico-node | head -1 | awk ‘{print $1}’) — df -h / | tail -1 | awk ‘{print $5}’ | sed ‘s/%//’)
if (( $(echo “$disk_usage > $DISK_THRESHOLD” | bc -l) )); then
print_error “节点 $node 磁盘使用率过高: ${disk_usage}%”
else
print_success “节点 $node 磁盘使用率正常: ${disk_usage}%”
fi
done
echo “”
}
# 主函数
main() {
echo “========================================”
echo ” 性能指标检查报告”
echo ” 时间: $(date ‘+%Y-%m-%d %H:%M:%S’)”
echo “========================================”
echo “”
check_cpu
check_memory
check_disk
echo “========================================”
echo ” 检查完成”
echo “========================================”
}
# 执行主函数
main
EOF
# 设置执行权限
chmod +x /usr/local/bin/performance-check.sh
performance-check.sh created successfully
3.2.2 执行脚本
/usr/local/bin/performance-check.sh
========================================
性能指标检查报告
时间: 2026-01-15 12:05:00
========================================
=== 检查CPU使用率 ===
[SUCCESS] 节点 node-1 CPU使用率正常: 45.2%
[SUCCESS] 节点 node-2 CPU使用率正常: 52.3%
[SUCCESS] 节点 node-3 CPU使用率正常: 48.7%
=== 检查内存使用率 ===
[SUCCESS] 节点 node-1 内存使用率正常: 65.4%
[SUCCESS] 节点 node-2 内存使用率正常: 68.2%
[SUCCESS] 节点 node-3 内存使用率正常: 62.8%
=== 检查磁盘使用率 ===
[SUCCESS] 节点 node-1 磁盘使用率正常: 45.6%
[SUCCESS] 节点 node-2 磁盘使用率正常: 48.3%
[SUCCESS] 节点 node-3 磁盘使用率正常: 46.9%
========================================
检查完成
========================================
3.3 安全配置检查脚本
3.3.1 创建脚本
cat > /usr/local/bin/security-check.sh <<‘EOF’
#!/bin/bash
# 安全配置检查脚本
# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
,
NC=’\033[0m’ # No Color
# 输出函数
print_success() {
echo -e “${GREEN}[SUCCESS]${NC} $1”
}
print_warning() {
echo -e “${YELLOW}[WARNING]${NC} $1”
}
print_error() {
echo -e “${RED}[ERROR]${NC} $1”
}
# 检查RBAC配置
check_rbac() {
echo “=== 检查RBAC配置 ===”
cluster_roles=$(kubectl get clusterroles –no-headers | wc -l)
print_success “共有 $cluster_roles 个ClusterRole”
cluster_role_bindings=$(kubectl get clusterrolebindings –no-headers | wc -l)
print_success “共有 $cluster_role_bindings 个ClusterRoleBinding”
echo “”
}
# 检查网络策略
check_network_policy() {
echo “=== 检查网络策略 ===”
network_policies=$(kubectl get networkpolicies –all-namespaces –no-headers | wc -l)
if [ $network_policies -eq 0 ]; then
print_warning “未配置网络策略”
else
print_success “共有 $network_policies 个网络策略”
fi
echo “”
}
# 检查Pod安全策略
check_pod_security_policy() {
echo “=== 检查Pod安全策略 ===”
pod_security_policies=$(kubectl get podsecuritypolicies –no-headers 2>/dev/null | wc -l)
if [ $pod_security_policies -eq 0 ]; then
print_warning “未配置Pod安全策略”
else
print_success “共有 $pod_security_policies 个Pod安全策略”
fi
echo “”
}
# 检查Secret< check_secrets() {
echo “=== 检查Secret ===”
secrets=$(kubectl get secrets –all-namespaces –no-headers | wc -l)
print_success “共有 $secrets 个Secret”
echo “”
}
# 主函数
main() {
echo “========================================”
echo ” 安全配置检查报告”
echo ” 时间: $(date ‘+%Y-%m-%d %H:%M:%S’)”
echo “========================================”
echo “”
check_rbac
check_network_policy
check_pod_security_policy
check_secrets
echo “========================================”
echo ” 检查完成”
echo “========================================”
}
# 执行主函数
main
EOF
# 设置执行权限
chmod +x /usr/local/bin/security-check.sh
security-check.sh created successfully
3.3.2 执行脚本
/usr/local/bin/security-check.sh
========================================
安全配置检查报告
时间: 2026-01-15 12:10:00
========================================
=== 检查RBAC配置 ===
[SUCCESS] 共有 15 个ClusterRole
[SUCCESS] 共有 20 个ClusterRoleBinding
=== 检查网络策略 ===
[SUCCESS] 共有 10 个网络策略
=== 检查Pod安全策略 ===
[SUCCESS] 共有 5 个Pod安全策略
=== 检查Secret ===
[SUCCESS] 共有 30 个Secret
========================================
检查完成
========================================
3.4 配置定时任务
3.4.1 创建定时任务
cat > /etc/cron.d/kubesphere-check <<EOF
# 每日巡检
0 2 * * * root /usr/local/bin/cluster-check.sh > /var/log/kubesphere-check/cluster-check-$(date +\%Y\%m\%d).log 2>&1
0 2 * * * root /usr/local/bin/performance-check.sh > /var/log/kubesphere-check/performance-check-$(date +\%Y\%m\%d).log 2>&1
0 2 * * * root /usr/local/bin/security-check.sh > /var/log/kubesphere-check/security-check-$(date +\%Y\%m\%d).log 2>&1
EOF
cron job created successfully
# 创建日志目录
mkdir -p /var/log/kubesphere-check
log directory created successfully
# 重启cron服务
systemctl restart cron
cron service restarted successfully
3.4.2 验证定时任务
crontab -l
# 每日巡检
0 2 * * * root /usr/local/bin/cluster-check.sh > /var/log/kubesphere-check/cluster-check-$(date +\%Y\%m\%d).log 2>&1
0 2 * * * root /usr/local/bin/performance-check.sh > /var/log/kubesphere-check/performance-check-$(date +\%Y\%m\%d).log 2>&1
0 2 * * * root /usr/local/bin/security-check.sh > /var/log/kubesphere-check/security-check-$(date +\%Y\%m\%d).log 2>&1
# 查看日志
ls -lh /var/log/kubesphere-check/
total 0
4. 实战案例
4.1 完整巡检流程
4.1.1 创建综合巡检脚本
cat > /usr/local/bin/comprehensive-check.sh <<‘EOF’
#!/bin/bash
# 综合巡检脚本
# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
NC=’\033[0m’ # No Color
# 输出函数
print_success() {
echo -e “${GREEN}[SUCCESS]${NC} $1”
}
print_warning() {
echo -e “${YELLOW}[WARNING]${NC} $1”
}
print_error() {
echo -e “${RED}[ERROR]${NC} $1”
}
# 主函数
main() {
echo “========================================”
echo ” 综合巡检报告”
echo ” 时间: $(date ‘+%Y-%m-%d %H:%M:%S’)”
echo “========================================”
echo “”
# 执行集群状态检查
echo “=== 集群状态检查 ===”
/usr/local/bin/cluster-check.sh
echo “”
# 执行性能指标检查
echo “=== 性能指标检查 ===”
/usr/local/bin/performance-check.sh
echo “”
# 执行安全配置检查
echo “=== 安全配置检查 ===”
/usr/local/bin/security-check.sh
echo “”
echo “========================================”
echo ” 巡检完成”
echo “========================================”
}
# 执行主函数
main
EOF
# 设置执行权限
chmod +x /usr/local/bin/comprehensive-check.sh
comprehensive-check.sh created successfully
4.1.2 执行综合巡检
/usr/local/bin/comprehensive-check.sh
========================================
综合巡检报告
时间: 2026-01-15 12:15:00
========================================
=== 集群状态检查 ===
========================================
集群状态检查报告
时间: 2026-01-15 12:15:00
========================================
=== 检查节点状态 ===
[SUCCESS] 所有节点状态正常
=== 检查Pod状态 ===
[SUCCESS] 所有Pod状态正常
=== 检查Service状态 ===
[SUCCESS] 共有 25 个Service
=== 检查Deployment状态 ===
[SUCCESS] 所有Deployment状态正常
=== 检查PVC状态 ===
[SUCCESS] 所有PVC状态正常
========================================
检查完成
========================================
=== 性能指标检查 ===
========================================
性能指标检查报告
时间: 2026-01-15 12:15:00
========================================
=== 检查CPU使用率 ===
[SUCCESS] 节点 node-1 CPU使用率正常: 45.2%
[SUCCESS] 节点 node-2 CPU使用率正常: 52.3%
[SUCCESS] 节点 node-3 CPU使用率正常: 48.7%
,
=== 检查内存使用率 ===
[SUCCESS] 节点 node-1 内存使用率正常: 65.4%
[SUCCESS] 节点 node-2 内存使用率正常: 68.2%
[SUCCESS] 节点 node-3 内存使用率正常: 62.8%
=== 检查磁盘使用率 ===
[SUCCESS] 节点 node-1 磁盘使用率正常: 45.6%
[SUCCESS] 节点 node-2 磁盘使用率正常: 48.3%
[SUCCESS] 节点 node-3 磁盘使用率正常: 46.9%
========================================
检查完成
========================================
=== 安全配置检查 ===
========================================
安全配置检查报告
时间: 2026-01-15 12:15:00
========================================
=== 检查RBAC配置 ===
[SUCCESS] 共有 15 个ClusterRole
[SUCCESS] 共有 20 个ClusterRoleBinding
=== 检查网络策略 ===
[SUCCESS] 共有 10 个网络策略
=== 检查Pod安全策略 ===
[SUCCESS] 共有 5 个Pod安全策略
=== 检查Secret ===
[SUCCESS] 共有 30 个Secret
========================================
检查完成
========================================
========================================
巡检完成
========================================
4.2 告警通知
4.2.1 配置钉钉告警
cat > /usr/local/bin/dingtalk-alert.sh <<‘EOF’
#!/bin/bash
# 钉钉告警脚本
# 钉钉机器人Webhook地址
WEBHOOK_URL=”https://oapi.dingtalk.com/robot/send?access_token=YOUR_ACCESS_TOKEN”
# 发送告警
send_alert() {
local message=$1
local data=”{
\”msgtype\”: \”text\”,
\”text\”: {
\”content\”: \”${message}\”
}
}”
curl -X POST “${WEBHOOK_URL}” \
-H “Content-Type: application/json” \
-d “${data}”
}
# 主函数
main() {
local message=$1
send_alert “${message}”
}
# 执行主函数
main “$@”
EOF
# 设置执行权限
chmod +x /usr/local/bin/dingtalk-alert.sh
dingtalk-alert.sh created successfully
4.2.2 集成告警到巡检脚本
cat > /usr/local/bin/cluster-check-with-alert.sh <<‘EOF’
#!/bin/bash
# 集群状态检查脚本(带告警)
# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
NC=’\033[0m’ # No Color
# 输出函数
print_success() {
echo -e “${GREEN}[SUCCESS]${NC} $1”
}
print_warning() {
echo -e “${YELLOW}[WARNING]${NC} $1”
}
print_error() {
echo -e “${RED}[ERROR]${NC} $1”
}
# 发送告警
send_alert() {
local message=$1
/usr/local/bin/dingtalk-alert.sh “${message}”
}
# 检查节点状态
check_nodes() {
echo “=== 检查节点状态 ===”
not_ready_nodes=$(kubectl get nodes –no-headers | grep -v “Ready” | wc -l)
if [ $not_ready_nodes -eq 0 ]; then
print_success “所有节点状态正常”
else
print_error “发现 $not_ready_nodes 个节点状态异常”
kubectl get nodes –no-headers | grep -v “Ready”
send_alert “【集群告警】发现 $not_ready_nodes 个节点状态异常,请及时处理!”
fi
echo “”
}
# 主函数
main() {
echo “========================================”
echo ” 集群状态检查报告”
echo ” 时间: $(date ‘+%Y-%m-%d %H:%M:%S’)”
echo “========================================”
echo “”
check_nodes
echo “========================================”
echo ” 检查完成”
echo “========================================”
}
# 执行主函数
main
EOF
# 设置执行权限
chmod +x /usr/local/bin/cluster-check-with-alert.sh
cluster-check-with-alert.sh created successfully
5. 经验总结
5.1 最佳实践
5.1.1 巡检脚本最佳实践
- 模块化设计:将巡检脚本模块化,便于维护和扩展
- 错误处理:完善的错误处理机制,确保脚本稳定运行
- 日志记录:详细的日志记录,便于问题排查
- 性能优化:优化脚本性能,减少资源消耗
- 定期更新:定期更新脚本,适应环境变化
5.1.2 自动化巡检最佳实践
- 定时执行:配置定时任务,定期自动执行巡检
- 告警通知:配置告警通知,及时发现和解决问题
- 历史数据:保存历史数据,进行趋势分析
- 报告生成:自动生成巡检报告,便于查阅
- 持续改进:根据巡检结果持续改进系统
5.2 常见问题
5.2.1 脚本问题
- 问题1:脚本执行失败
- 解决方案:检查脚本权限和环境变量
- 问题2:脚本执行缓慢
- 解决方案:优化脚本逻辑,减少不必要的操作
- 问题3:脚本输出不准确
- 解决方案:检查脚本逻辑和数据来源
5.2.2 告警问题
- 问题1:告警未发送
- 解决方案:检查告警配置和网络连接
- 问题2:告警频繁
- 解决方案:调整告警阈值,配置告警聚合
- 问题3:告警信息不准确
- 解决方案:检查告警逻辑和数据来源
5.3 性能优化
5.3.1 脚本性能优化
- 并行执行:并行执行多个检查任务
- 缓存优化:使用缓存减少重复查询
- 增量检查:只检查变更的资源
- 资源限制:设置资源限制,避免影响系统性能
5.3.2 系统性能优化
- 资源调度:合理调度巡检任务,避免高峰期执行
- 负载均衡:在多个节点上执行巡检任务
- 批量操作:批量执行检查操作,减少API调用
- 异步处理:使用异步处理提高效率
5.4 监控和告警
5.4.1 巡检监控
- 执行监控:监控巡检脚本执行状态
- 结果监控:监控巡检结果,发现异常
- 趋势监控:监控巡检结果趋势,预测问题
- 性能监控:监控巡检脚本性能,优化执行
5.4.2 告警优化
- 告警分级:根据严重程度分级告警
- 告警聚合:聚合相似告警,减少告警数量
- 告警抑制:抑制重复告警,避免告警风暴
- 告警升级:配置告警升级机制,确保及时处理
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
