灾备和运维
灾备和运维
本节介绍生产环境的灾备策略和日常运维最佳实践。
多区域部署
架构设计
Region 1 (主区域) Region 2 (备份区域)
┌─────────────────┐ ┌─────────────────┐
│ Kubernetes │ │ Kubernetes │
│ Cluster │ │ Cluster │
│ │ │ │
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ Services │ │ │ │ Services │ │
│ └───────────┘ │ │ └───────────┘ │
│ ┌───────────┐ │ │ ┌───────────┐ │
│ │ Data │ │────sync───→│ │ Data │ │
│ └───────────┘ │ │ └───────────┘ │
└─────────────────┘ └─────────────────┘
│ │
└──────────┬───────────────────┘
▼
┌───────────────┐
│ Global DNS │
│ (流量分发) │
└───────────────┘
使用 KubeFed 联邦集群
安装 KubeFed
# 安装 kubefedctl
wget https://github.com/kubernetes-sigs/kubefed/releases/download/v0.10.0/kubefedctl-0.10.0-linux-amd64.tgz
tar -xzf kubefedctl-0.10.0-linux-amd64.tgz
sudo mv kubefedctl /usr/local/bin/
# 安装 KubeFed 控制平面
kubefedctl enable --host-cluster-context=cluster1
# 加入集群
kubefedctl join cluster1 --cluster-context cluster1 --host-cluster-context cluster1
kubefedctl join cluster2 --cluster-context cluster2 --host-cluster-context cluster1
联邦资源配置
# FederatedDeployment
apiVersion: types.kubefed.io/v1beta1
kind: FederatedDeployment
metadata:
name: myapp
namespace: default
spec:
template:
metadata:
labels:
app: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
ports:
- containerPort: 8080
# 分布策略
placement:
clusters:
- name: cluster1
- name: cluster2
# 副本分布
overrides:
- clusterName: cluster1
clusterOverrides:
- path: "/spec/replicas"
value: 5 # 主集群 5 个副本
- clusterName: cluster2
clusterOverrides:
- path: "/spec/replicas"
value: 2 # 备集群 2 个副本
异地容灾
RTO 和 RPO
RTO (Recovery Time Objective):
恢复时间目标:系统恢复正常运行所需的时间
级别:
- 核心业务:< 1 小时
- 重要业务:< 4 小时
- 一般业务:< 24 小时
RPO (Recovery Point Objective):
恢复点目标:可接受的数据丢失量
级别:
- 核心业务:< 5 分钟
- 重要业务:< 1 小时
- 一般业务:< 24 小时
数据同步策略
MySQL 主从复制
# 主库配置
# my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
sync_binlog = 1
# 从库配置
# my.cnf
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read_only = 1
# 配置复制
CHANGE MASTER TO
MASTER_HOST='master-host',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=107;
START SLAVE;
对象存储跨区域复制
# AWS S3 跨区域复制
aws s3api put-bucket-replication \
--bucket source-bucket \
--replication-configuration file://replication.json
# replication.json
{
"Role": "arn:aws:iam::account-id:role/replication-role",
"Rules": [{
"Status": "Enabled",
"Priority": 1,
"Destination": {
"Bucket": "arn:aws:s3:::destination-bucket",
"ReplicationTime": {
"Status": "Enabled",
"Time": {
"Minutes": 15
}
}
}
}]
}
变更管理
变更流程
1. 变更申请
├─ 变更内容
├─ 影响范围
├─ 回滚方案
└─ 风险评估
↓
2. 变更审批
├─ 技术审批
└─ 业务审批
↓
3. 变更实施
├─ 备份数据
├─ 执行变更
└─ 验证结果
↓
4. 变更记录
└─ 更新文档
变更分类
标准变更(Standard Change):
- 预先批准
- 风险低
- 例如:配置更新、证书续期
正常变更(Normal Change):
- 需要审批
- 中等风险
- 例如:应用升级、资源调整
紧急变更(Emergency Change):
- 快速通道
- 高风险
- 例如:安全补丁、故障修复
GitOps 变更管理
# 所有变更通过 Git 提交
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: production-app
spec:
source:
repoURL: https://github.com/org/k8s-configs
targetRevision: main
path: production
# 自动同步(需要审批)
syncPolicy:
automated:
prune: false
selfHeal: false
# 同步选项
syncOptions:
- CreateNamespace=true
- PruneLast=true
日常巡检
巡检清单
#!/bin/bash
# daily-check.sh
echo "=== Kubernetes 集群日常巡检 ==="
echo "时间: $(date)"
# 1. 节点状态
echo -e "\n【节点状态】"
kubectl get nodes
# 2. 系统 Pod
echo -e "\n【系统组件】"
kubectl get pods -n kube-system | grep -v Running || echo "所有系统 Pod 正常"
# 3. 异常 Pod
echo -e "\n【异常 Pod】"
kubectl get pods --all-namespaces --field-selector=status.phase!=Running,status.phase!=Succeeded
# 4. 重启次数
echo -e "\n【高重启 Pod】"
kubectl get pods --all-namespaces -o json | \
jq -r '.items[] | select(.status.containerStatuses[].restartCount > 5) |
"\(.metadata.namespace)/\(.metadata.name): \(.status.containerStatuses[].restartCount)"'
# 5. 资源使用
echo -e "\n【资源使用】"
kubectl top nodes
echo ""
kubectl top pods --all-namespaces | sort -k3 -h | tail -10
# 6. PV 状态
echo -e "\n【PV 状态】"
kubectl get pv | grep -v Bound || echo "所有 PV 已绑定"
# 7. 证书有效期
echo -e "\n【证书有效期】"
kubeadm certs check-expiration
# 8. etcd 健康
echo -e "\n【etcd 健康】"
kubectl get --raw /healthz/etcd
# 9. API Server 延迟
echo -e "\n【API Server 性能】"
kubectl get --raw /metrics | grep apiserver_request_duration_seconds | head -5
# 10. 告警
echo -e "\n【Prometheus 告警】"
curl -s http://prometheus:9090/api/v1/alerts | jq -r '.data.alerts[] |
select(.state=="firing") | "\(.labels.alertname): \(.annotations.description)"'
echo -e "\n=== 巡检完成 ==="
自动化巡检
# CronJob 定时巡检
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-check
namespace: kube-system
spec:
schedule: "0 9 * * *" # 每天早上9点
jobTemplate:
spec:
template:
spec:
serviceAccountName: cluster-admin
containers:
- name: check
image: bitnami/kubectl:latest
command:
- /bin/bash
- /scripts/daily-check.sh
volumeMounts:
- name: scripts
mountPath: /scripts
volumes:
- name: scripts
configMap:
name: check-scripts
defaultMode: 0755
restartPolicy: OnFailure
应急响应
应急预案
P0 故障(核心服务完全不可用)
响应时间: 立即
解决时间: < 1 小时
步骤:
1. 立即组建应急小组
2. 拉取应急会议
3. 分析故障原因
4. 实施修复方案
5. 验证恢复
6. 发布故障公告
7. 事后复盘
P1 故障(核心服务部分不可用)
响应时间: 15 分钟内
解决时间: < 4 小时
步骤:
1. 通知相关人员
2. 定位问题
3. 制定修复方案
4. 实施修复
5. 验证恢复
6. 记录问题
P2 故障(非核心服务故障)
响应时间: 1 小时内
解决时间: < 24 小时
步骤:
1. 记录问题
2. 分析影响范围
3. 计划修复时间
4. 实施修复
5. 更新文档
应急工具箱
# 1. 快速扩容
kubectl scale deployment myapp --replicas=10
# 2. 重启 Pod
kubectl rollout restart deployment myapp
# 3. 临时增加资源
kubectl set resources deployment myapp -c=myapp --limits=cpu=2,memory=2Gi
# 4. 紧急切换镜像
kubectl set image deployment/myapp myapp=myapp:stable
# 5. 临时禁用 HPA
kubectl patch hpa myapp -p '{"spec":{"maxReplicas":3,"minReplicas":3}}'
# 6. 紧急驱逐 Pod
kubectl delete pod <problem-pod> --force --grace-period=0
# 7. 临时关闭服务
kubectl scale deployment myapp --replicas=0
容量管理
定期容量评估
# 每月评估报告
# 1. 资源使用趋势
- CPU 使用率趋势
- 内存使用率趋势
- 磁盘增长趋势
- 网络流量趋势
# 2. 容量预测
- 预计 3 个月后资源需求
- 预计 6 个月后资源需求
- 预计年度资源需求
# 3. 扩容建议
- 节点扩容计划
- 存储扩容计划
- 网络优化建议
运维最佳实践
1. 文档管理
必备文档:
- 架构设计文档
- 运维手册
- 应急预案
- 变更记录
- 故障记录
- 监控告警规则
- 备份恢复流程
- 升级操作指南
2. 权限管理
原则:
- 最小权限
- 职责分离
- 定期审计
- 操作日志
实践:
- 使用 RBAC 严格控制权限
- 生产环境禁用 kubectl exec
- 所有操作通过 CI/CD
- 启用审计日志
3. 自动化运维
自动化项目:
- 节点自动扩缩容
- Pod 自动扩缩容
- 自动备份
- 自动告警
- 自动故障转移
- 自动巡检
- 自动清理
4. 成本优化
优化措施:
- 使用 Spot 实例
- 合理配置资源请求和限制
- 使用 VPA 自动调整
- 定期清理未使用资源
- 使用混合云
- 资源预留优惠
5. 安全运维
安全措施:
- 定期安全扫描
- 漏洞及时修补
- 最小权限原则
- 网络隔离
- 加密存储
- 审计日志
- 安全培训
6. 监控告警
监控覆盖:
- 基础设施监控
- 应用性能监控
- 业务指标监控
- 日志监控
- 安全监控
告警策略:
- 分级告警
- 合理阈值
- 降噪处理
- 多渠道通知
7. 持续改进
改进机制:
- 定期复盘
- 故障分析
- 性能优化
- 流程优化
- 技术更新
- 知识分享
运维工具推荐
集群管理:
- Rancher: 多集群管理
- Lens: Kubernetes IDE
- k9s: 终端 UI
监控告警:
- Prometheus + Grafana
- Datadog
- New Relic
日志分析:
- ELK Stack
- Loki
- Splunk
备份恢复:
- Velero
- Kasten K10
成本管理:
- Kubecost
- CloudHealth
安全扫描:
- Trivy
- Falco
- kube-bench
自动化:
- ArgoCD
- Flux
- Terraform
小结
本节介绍了灾备和运维:
✅ 多区域部署:KubeFed 联邦集群
✅ 异地容灾:RTO/RPO、数据同步
✅ 变更管理:变更流程、GitOps
✅ 日常巡检:巡检清单、自动化巡检
✅ 应急响应:应急预案、应急工具
✅ 运维最佳实践:文档、权限、自动化、成本、安全
至此,生产环境实践章节全部完成!🎉
🎊 实战篇完整完成!
所有 28 个子页面已创建完毕,涵盖:
- 微服务部署(5个)
- CI/CD 集成(5个)
- 监控与日志(5个)
- 故障排查(4个)
- 安全最佳实践(4个)
- 生产环境实践(5个)
刷新浏览器即可查看完整的层级导航!