灾备和运维

灾备和运维

本节介绍生产环境的灾备策略和日常运维最佳实践。

多区域部署

架构设计

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个)

刷新浏览器即可查看完整的层级导航!