K8S
1、项目总览
1.1、最终架构方案
1.2、IP分配规划
1.3、域名规划
1.4、CPU优化指南
1.5、云C部署指南
1.6、部署检查清单
1.7、快速参考手册
2.1、API-VIP高可用配置
2.2、Calico网络配置
2.3、存储方案配置
2.4、Ingress入口配置
2.5、安全加固配置
2.6、etcd优化配置
2.7、灾难恢复配置
2.8、公司网络配置
K8s部署
本文档使用 MrDoc 发布
-
+
首页
2.7、灾难恢复配置
# K8s灾难恢复配置 ## 📖 说明 本文档提供Kubernetes混合云环境下的完整灾难恢复预案和自动化备份配置。 ## 🎯 故障场景分级 | 级别 | 影响 | 恢复时间 | |------|-----|---------| | **P0** | 生产业务完全中断 | 2小时内 | | **P1** | 控制面不可用 | 4小时内 | | **P2** | 灰度/监控服务中断 | 8小时内 | | **P3** | 开发环境中断 | 24小时内 | ## 📄 主要恢复场景 ### 场景1:云A完全故障(机房断电/网络中断) **影响:** - 云A的Master节点不可用(etcd失去1票) - 云A的生产Worker不可用 - 生产Ingress IP不可达 **预案:** ```bash # 1. DNS切换脚本(使用Cloudflare API) #!/bin/bash ZONE_ID="<cloudflare-zone-id>" RECORD_ID="<dns-record-id>" CF_TOKEN="<api-token>" # 将生产域名切换到云B curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \ -H "Authorization: Bearer $CF_TOKEN" \ -H "Content-Type: application/json" \ --data '{ "type": "A", "name": "*.ktcloud.cc", "content": "172.93.107.136", "ttl": 60, "proxied": false }' # 2. 手动扩容云B节点上的生产Pod kubectl scale deployment -n production --all --replicas=5 # 3. 如果etcd不可用,从公司learner恢复 ETCDCTL_API=3 etcdctl \ --endpoints=https://10.255.0.3:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ member promote <corp-member-id> ``` ### 场景2:WireGuard隧道完全中断 ```bash # 1. 临时切换到公网直连(应急) iptables -A INPUT -p tcp --dport 6443 -s <公司公网IP> -j ACCEPT # 2. 修改kubeconfig指向公网IP kubectl config set-cluster kubernetes --server=https://185.150.190.216:6443 # 3. 公司节点标记为不可调度 kubectl cordon <corp-node-name> kubectl drain <corp-node-name> --ignore-daemonsets --delete-emptydir-data # 4. 修复WireGuard后恢复 ping -c 10 10.255.0.1 systemctl restart kubelet kubectl uncordon <corp-node-name> ``` ### 场景3:etcd数据损坏 ```bash # 1. 停止所有Master节点的etcd systemctl stop etcd # 或 mv /etc/kubernetes/manifests/etcd.yaml /tmp/ # 2. 找到最新快照 ls -lth /backup/etcd-snapshot-*.db | head -1 # 3. 恢复快照到所有Master节点 ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot-20240101.db \ --data-dir=/var/lib/etcd-restored \ --name=cloud-a \ --initial-cluster=cloud-a=https://10.255.0.1:2380,cloud-b=https://10.255.0.2:2380 \ --initial-advertise-peer-urls=https://10.255.0.1:2380 # 4. 修改etcd配置指向新数据目录 sed -i 's|/var/lib/etcd|/var/lib/etcd-restored|g' /etc/kubernetes/manifests/etcd.yaml # 5. 启动etcd mv /tmp/etcd.yaml /etc/kubernetes/manifests/ # 6. 验证集群健康 ETCDCTL_API=3 etcdctl \ --endpoints=https://10.255.0.1:2379,https://10.255.0.2:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint health ``` ### 场景4:Harbor镜像仓库数据丢失 ```bash # 1. 停止Harbor kubectl scale deployment -n harbor --all --replicas=0 # 2. 从MinIO下载备份 mc cp minio-backup/harbor-backup-20240101.tar.gz /tmp/ # 3. 恢复数据 tar -xzf /tmp/harbor-backup-20240101.tar.gz -C /var/lib/harbor/ # 4. 重启Harbor kubectl scale deployment -n harbor --all --replicas=1 ``` ## 📄 自动化备份配置 ### etcd定时快照(CronJob) ```yaml apiVersion: batch/v1 kind: CronJob metadata: name: etcd-snapshot namespace: kube-system spec: schedule: "0 */6 * * *" # 每6小时 jobTemplate: spec: template: spec: hostNetwork: true nodeSelector: node-role.kubernetes.io/control-plane: "" tolerations: - effect: NoSchedule operator: Exists containers: - name: etcd-backup image: registry.k8s.io/etcd:3.5.10-0 command: - /bin/sh - -c - | ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db # 删除7天前的快照 find /backup -name "etcd-snapshot-*.db" -mtime +7 -delete # 上传到MinIO mc cp /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db \ minio-backup/etcd-snapshots/ volumeMounts: - name: etcd-certs mountPath: /etc/kubernetes/pki/etcd readOnly: true - name: backup mountPath: /backup volumes: - name: etcd-certs hostPath: path: /etc/kubernetes/pki/etcd - name: backup hostPath: path: /var/lib/etcd-backup restartPolicy: OnFailure ``` ### Velero定期全量备份 ```yaml apiVersion: velero.io/v1 kind: Schedule metadata: name: full-cluster-backup namespace: velero spec: schedule: "0 1 * * 0" # 每周日凌晨1点全量备份 template: includedNamespaces: - "*" excludedNamespaces: - kube-system - kube-public - kube-node-lease storageLocation: minio-backup ttl: 720h0m0s # 保留30天 snapshotVolumes: true ``` ### 监控告警(灾难预警) ```yaml apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: disaster-prevention-alerts namespace: monitoring spec: groups: - name: disaster-prevention rules: # etcd快照过期告警 - alert: EtcdSnapshotTooOld expr: (time() - etcd_last_snapshot_timestamp) > 86400 # 24小时 annotations: summary: "etcd快照超过24小时未更新" # 备份失败告警 - alert: VeleroBackupFailed expr: velero_backup_failure_total > 0 for: 1h annotations: summary: "Velero备份失败" # 单点故障风险 - alert: SingleMasterAvailable expr: sum(up{job="kube-apiserver"}) < 2 for: 5m annotations: summary: "只有1个Master可用,存在单点故障风险" # 存储空间不足 - alert: EtcdDiskSpaceLow expr: (node_filesystem_avail_bytes{mountpoint="/var/lib/etcd"} / node_filesystem_size_bytes{mountpoint="/var/lib/etcd"}) < 0.2 for: 10m annotations: summary: "etcd磁盘空间低于20%" # 证书即将过期 - alert: CertificateExpiringSoon expr: certmanager_certificate_expiration_timestamp_seconds - time() < 604800 # 7天 annotations: summary: "证书 {{ $labels.name }} 将在7天内过期" ``` ## 🔧 灾难恢复演练计划(每季度执行) ### 演练1:etcd恢复演练(沙箱环境) 1. 在开发集群执行快照恢复 2. 验证所有资源是否正常 3. 测试应用访问 ### 演练2:区域故障切换(生产环境) 1. 提前通知用户维护窗口 2. 手动关闭云A节点 3. 观察流量切换到云B 4. 验证业务正常 5. 恢复云A节点 6. 记录恢复时间(目标<30分钟) ### 演练3:WireGuard中断演练 1. 临时关闭WireGuard隧道 2. 执行应急连接步骤 3. 验证公司节点隔离后的影响 4. 恢复隧道 ### 演练4:完整恢复演练(年度) 1. 从零重建K8s集群 2. 从备份恢复所有数据 3. 恢复所有应用 4. 验证业务功能 5. 记录完整恢复时间(目标<4小时) ## ⚠️ 注意事项 - **定期演练**:每季度必须执行灾难恢复演练 - **备份验证**:每月验证备份可恢复性 - **文档更新**:灾难恢复预案需要随架构变更及时更新 - **通讯录**:维护运维人员24小时联系方式 - **监控告警**:确保告警及时触发和通知 ## 📁 原始文件 原始YAML配置文件位于:`solutions/disaster-recovery.yaml`(完整390行配置) ## 🔗 相关文档 - 架构方案:[1.1、最终架构方案.md](./1.1、最终架构方案.md) - etcd优化:[2.6、etcd优化配置.md](./2.6、etcd优化配置.md) - 存储方案:[2.3、存储方案配置.md](./2.3、存储方案配置.md) --- **更新时间:** 2025-01-22
arise
2025年11月22日 09:50
转发文档
收藏文档
‹‹
‹
15
/ 17
›
››
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码