本文档风哥主要介绍Linux系统大规模Kubernetes灾难恢复与高可用,包括K8s高可用基础概念、灾难恢复基础概念、灾难恢复策略、etcd备份与恢复、集群配置备份、应用数据备份以及实战案例等内容,风哥教程参考Kubernetes官方文档、Linux官方文档Clusters等内容,适合系统管理员在生产环境中使用。
Part01-基础概念与理论知识
1.1 K8s高可用基础概念
Kubernetes高可用是确保集群在面对节点故障、网络故障等情况时仍能正常运行的重要机制。Kubernetes高可用主要包括:
- 控制平面高可用:部署多个控制平面节点,确保控制平面的可靠性
- etcd高可用:部署etcd集群,确保数据存储的可靠性
- 节点高可用:部署多个计算节点,确保应用的可靠性
- 服务高可用:通过Deployment、StatefulSet等确保应用的可用性
- 多控制平面节点:3-5个控制平面节点,确保控制平面的高可用
- etcd集群:3-5个etcd节点,确保数据存储的高可用
- 负载均衡器:用于分发控制平面的流量
- 网络插件:确保Pod间通信的可靠性
- 存储插件:确保数据存储的可靠性
1.2 灾难恢复基础概念
灾难恢复是指在发生灾难后,恢复系统正常运行的过程。Kubernetes灾难恢复主要包括:
- 数据备份:定期备份etcd数据、集群配置和应用数据
- 数据恢复:在发生灾难后,恢复备份的数据
- 故障转移:在主集群故障时,切换到备用集群
- 灾难演练:定期进行灾难恢复演练,确保恢复流程的有效性
1.3 灾难恢复策略
常见的灾难恢复策略包括:
– RTO (Recovery Time Objective):恢复时间目标,即从灾难发生到系统恢复的时间
– RPO (Recovery Point Objective):恢复点目标,即灾难发生后可以恢复到的数据点
# 灾难恢复级别
– 本地恢复:在本地数据中心恢复系统
– 异地恢复:在异地数据中心恢复系统
– 混合恢复:结合本地和异地恢复
# 灾难恢复方案
– 冷备份:定期备份数据,灾难发生后手动恢复
– 热备份:实时同步数据,灾难发生后自动切换
– 温备份:定期同步数据,灾难发生后半自动恢复
Part02-生产环境规划与建议
2.1 高可用架构设计
生产环境高可用架构设计要点:
– 控制平面高可用:部署3-5个控制平面节点,分布在不同的可用区
– etcd高可用:部署3-5个etcd节点,分布在不同的可用区
– 计算节点高可用:部署多个计算节点,分布在不同的可用区
– 网络高可用:使用多网卡绑定,确保网络连接的可靠性
– 存储高可用:使用分布式存储或云存储,确保数据存储的可靠性
# 负载均衡设计
– 控制平面负载均衡:使用HAProxy或云负载均衡器
– 服务负载均衡:使用Kubernetes Service或Ingress
– 外部访问负载均衡:使用云负载均衡器或硬件负载均衡器
# 网络设计
– 多可用区网络:跨可用区部署,提高可靠性
– 网络冗余:多网络路径,避免单点故障
– 网络隔离:使用网络策略,提高安全性
2.2 灾难恢复计划
生产环境灾难恢复计划制定要点:
– 风险评估:识别可能的灾难类型和影响范围
– 恢复目标:设定RTO和RPO目标
– 恢复流程:详细的灾难恢复步骤和流程
– 责任分配:明确各角色的责任和职责
– 演练计划:定期进行灾难恢复演练
# 灾难类型
– 硬件故障:服务器、存储、网络设备故障
– 软件故障:操作系统、应用程序故障
– 人为错误:误操作、配置错误
– 自然灾害:地震、洪水、火灾等
– 网络攻击:DDoS攻击、数据泄露等
# 恢复优先级
– 核心业务应用:优先恢复核心业务应用
– 数据存储:确保数据的完整性和可用性
– 辅助服务:逐步恢复辅助服务
– 监控系统:确保监控系统的正常运行
2.3 备份策略制定
生产环境备份策略制定要点:
– 全量备份:完整备份所有数据,恢复速度快,但备份时间长
– 增量备份:只备份变化的数据,备份时间短,但恢复速度慢
– 差异备份:备份自上次全量备份以来变化的数据,平衡备份和恢复速度
# 备份频率
– etcd数据:每小时备份一次
– 集群配置:每天备份一次
– 应用数据:根据应用重要性,每天或每小时备份一次
– 系统配置:每周备份一次
# 备份存储
– 本地存储:用于快速恢复
– 异地存储:用于灾难恢复
– 云存储:用于长期备份
– 加密存储:确保备份数据的安全性
Part03-生产环境项目实施方案
3.1 etcd备份与恢复
3.1.1 备份etcd数据
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.1.101:2379 –cacert=/etc/kubernetes/pki/etcd/ca.crt –cert=/etc/kubernetes/pki/etcd/server.crt –key=/etc/kubernetes/pki/etcd/server.key snapshot save /tmp/etcd-backup-$(date +%Y%m%d%H%M%S).db
# 查看备份状态
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.1.101:2379 –cacert=/etc/kubernetes/pki/etcd/ca.crt –cert=/etc/kubernetes/pki/etcd/server.crt –key=/etc/kubernetes/pki/etcd/server.key snapshot status /tmp/etcd-backup-20260403120000.db
# 恢复etcd数据
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.1.101:2379 –cacert=/etc/kubernetes/pki/etcd/ca.crt –cert=/etc/kubernetes/pki/etcd/server.crt –key=/etc/kubernetes/pki/etcd/server.key snapshot restore /tmp/etcd-backup-20260403120000.db –data-dir=/var/lib/etcd-restore
# 重启etcd服务
$ sudo systemctl stop etcd
$ sudo mv /var/lib/etcd /var/lib/etcd.bak
$ sudo mv /var/lib/etcd-restore /var/lib/etcd
$ sudo systemctl start etcd
3.2 集群配置备份
3.2.1 备份集群配置
$ mkdir -p /backup/kubernetes
$ kubectl get all –all-namespaces -o yaml > /backup/kubernetes/all-resources.yaml
$ kubectl get configmaps –all-namespaces -o yaml > /backup/kubernetes/configmaps.yaml
$ kubectl get secrets –all-namespaces -o yaml > /backup/kubernetes/secrets.yaml
$ kubectl get serviceaccounts –all-namespaces -o yaml > /backup/kubernetes/serviceaccounts.yaml
$ kubectl get roles –all-namespaces -o yaml > /backup/kubernetes/roles.yaml
$ kubectl get rolebindings –all-namespaces -o yaml > /backup/kubernetes/rolebindings.更多视频教程www.fgedu.net.cnyaml
$ kubectl get clusterroles –all-namespaces -o yaml > /backup/kubernetes/clusterroles.yaml
$ kubectl get clusterrolebindings –all-namespaces -o yaml > /backup/kubernetes/clusterrolebindings.yaml
# 备份kubeconfig文件
$ cp ~/.kube/config /backup/kubernetes/kubeconfig
# 备份证书
$ cp -r /etc/kubernetes/pki /backup/kubernetes/
3.3 应用数据备份
3.3.1 备份应用数据
$ kubectl get pv –all-namespaces -o yaml > /backup/kubernetes/pv.yaml
$ kubectl get pvc –all-namespaces -o yaml > /backup/kubernetes/pvc.yaml
# 备份数据库应用数据
$ kubectl exec -it mysql-7d75c484b5-8x8x8 — mysqldump -u root -p fgedudb > /backup/kubernetes/fgedudb.sql
# 备份持久卷数据
$ kubectl cp default/nginx-6799fc88d8-2q4x2:/usr/share/nginx/html /backup/kubernetes/nginx-html
# 备份配置文件
$ kubectl get configmap nginx-config -o yaml > /backup/kubernetes/nginx-config.yaml
Part04-生产案例与实战讲解
4.1 高可用K8s集群案例
4.1.1 企业级高可用K8s集群部署
# 环境:3个控制平面节点,5个计算节点,跨3个可用区
# 目标:部署高可用K8s集群,确保集群的可靠性
# 1. 配置负载均衡器
$ sudo dnf install -y haproxy
$ sudo vim /etc/haproxy/haproxy.cfg
frontend kubernetes
bind *:6443
mode tcp
option tcplog
default_backend kubernetes-master-nodes
backend kubernetes-master-nodes
mode tcp
option tcplog
option tcp-check
balance roundrobin
server master1 192.168.1.101:6443 check fall 3 rise 2
ser学习交流加群风哥微信: itpux-comver master2 192.168.1.102:6443 check fall 3 rise 2
server master3 192.168.1.103:6443 check fall 3 rise 2
# 2. 初始化第一个控制平面节点
$ sudo kubeadm init –control-plane-endpoint “192.168.1.100:6443” –pod-network-cidr=10.244.0.0/16
# 3. 加入其他控制平面节点
$ kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef –control-plane
# 4. 加入计算节点
$ kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
# 5. 安装网络插件
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 6. 查看集群状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 20m v1.27.0
master2 Ready control-plane 15m v1.27.0
master3 Ready control-plane 10m v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready
worker4 Ready
worker5 Ready
# 7. 测试高可用性
# 模拟控制平面节点故障
$ sudo systemctl stop kube-apiserver kube-controller-manager kube-scheduler etcd
# 查看集群状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 NotReady control-plane 25m v1.27.0
master2 Ready control-plane 20m v1.27.0
master3 Ready control-plane 15m v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready
worker4 Ready
worker5 Ready
# 测试应用访问
$ kubectl run nginx –image=nginx –replicas=3
$ kubectl expose deployment nginx –port=80 –type=NodePort
$ curl http://192.168.1.104:30080
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
4.2 灾难恢复演练案例
4.2.1 企业级灾难恢复演练
# 环境:2个K8s集群(主集群和备用集群)
# 目标:演练灾难恢复流程,确保在主集群故障时能够快速切换到备用集群
# 1. 定期备份主集群数据
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.1.101: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-backup-$(date +%Y%m%d%H%M%S).db
# 2. 将备份数据复制到备用集群
$ scp /backup/etcd-backup-20260403120000.db root@192.168.2.101:/backup/
# 3. 模拟主集群故障
$ sudo systemctl stop kube-apiserver kube-controller-manager kube-scheduler etcd
# 4. 在备用集群恢复数据
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.2.101:2379 –cacert=/etc/kubernetes/pki/etcd/ca.crt –cert=/etc/kubernetes/pki/etcd/server.crt –key=/etc/kubernetes/pki/etcd/server.key snapshot restore /backup/etcd-backup-20260403120000.db –data-dir=/var/lib/etcd-restore
# 5. 重启备用集群的etcd服务
$ sudo systemctl stop etcd
$ sudo mv /var/lib/etcd /var/lib/etcd.bak
$ sudo mv /var/lib/etcd-restore /var/lib/etcd
$ sudo systemctl start etcd
# 6. 重启备用集群的控制平面组件
$ sudo systemctl start kube-apiserver kube-controller-manager kube-scheduler
# 7. 验证备用集群状态
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 20m v1.27.0
worker1 Ready
worker2 Ready
# 8. 测试应用访问
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-2q4x2 1/1 Running 0 5m
nginx-6799fc88d8-5b678 1/1 Running 0 5m
nginx-6799fc88d8-7c89d 1/1 Running 0 5m
$ curl http://192.168.2.102:30080
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
4.3 跨区域高可用案例
4.3.1 企业级跨区域高可用部署
# 环境:2个区域,每个区域3个控制平面节点,5个计算节点
# 目标:部署跨区域高可用K8s集群,确保在区域故障时能够快速切换
# 1. 在区域A部署主集群
$ sudo kubeadm init –control-plane-endpoint “192.168.1.100:6443” –pod-network-cidr=10.244.0.0/16
$ kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef –control-plane
$ kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
# 2. 在区域B部署备用集群
$ sudo kubeadm init –control-plane-endpoint “192.168.2.100:6443” –pod-network-cidr=10.245.0.0/16
$ kubeadm join 192.168.2.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef –control-plane
$ kubeadm join 192.168.2.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
# 3. 配置跨区域网络
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 4. 配置跨区域数据同步
$ helm repo add velero https://vmware-tanzu.github.io/helm-charts
$ helm install velero velero/velero –namespace velero –create-namespace –set configuration.provider=aws –set configuration.backupLocation.name=default –set configuration.backupLocation.bucket=velero-backup –set credentials.secretContents.cloud={}
# 5. 测试跨区域故障转移
# 模拟区域A故障
$ sudo systemctl stop kube-apiserver kube-controller-manager kube-scheduler etcd
# 切换到区域B集群
$ export KUBECONFIG=~/.kube/config-region-b
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 20m v1.27.0
master2 Ready control-plane 15m v1.27.0
master3 Ready control-plane 10m v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready
worker4 Ready
worker5 Ready
# 测试应用访问
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-2q4x2 1/1 Running 0 5m
nginx-6799fc88d8-5b678 1/1 Running 0 5m
nginx-6799fc88d8-7c89d 1/1 Running 0 5m
$ curl http://192.168.2.104:30080
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
Part05-风哥经验总结与分享
5.1 K8s灾难恢复与高可用最佳实践
Kubernetes灾难恢复与高可用最佳实践:
- 部署高可用集群:部署多个控制平面节点和etcd节点,确保集群的高可用
- 定期备份数据:定期备份etcd数据、集群配置和应用数据
- 制定灾难恢复计划:详细的灾难恢复步骤和流程,明确各角色的责任
- 定期演练:定期进行灾难恢复演练,确保恢复流程的有效性
- 使用跨区域部署:跨区域部署集群,提高灾难恢复能力
- 监控集群状态:实时监控集群状态,及时发现和解决问题
- 使用自动化工具:使用Velero等工具自动化备份和恢复过程
- 保持文档更新:及时更新灾难恢复文档,确保文档的准确性
5.2 常见问题与解决方案
## 1. 控制平面节点故障
– 原因:硬件故障、网络故障、软件故障
– 解决方案:部署多个控制平面节点,确保控制平面的高可用
## 2. etcd数据损坏
– 原因:磁盘故障、网络分区、人为错误
– 解决方案:定期备份etcd数据,使用etcd集群,确保数据的一致性
## 3. 集群配置丢失
– 原因:人为错误、配置管理不当
– 解决方案:定期备份集群配置,使用版本控制管理配置
## 4. 应用数据丢失
– 原因:存储故障、备份不当、人为错误
– 解决方案:使用持久卷,定期备份应用数据,使用高可用存储
## 5. 灾难恢复失败
– 原因:恢复流程不当、备份数据损坏、环境差异
– 解决方案:定期演练灾难恢复流程,验证备份数据的完整性,确保环境一致性
5.3 性能调优建议
风哥针对
Kub
from PG视频:www.itpux.com
ernetes灾难恢复与高可用性能调优建议:
- 优化etcd性能:使用SSD存储,调整etcd参数,提高etcd的性能和可靠性
- 优化网络性能:使用万兆网络,配置适当的网络参数,提高网络传输速度
- 优化存储性能:使用高性能存储,配置适当的存储参数,提高存储读写速度
- 优化备份策略:使用增量备份,减少备份时间和存储空间
- 使用并行恢复:并行恢复多个组件,减少恢复时间
- 优化资源分配:为控制平面组件分配足够的资源,确保其正常运行
- 使用自动化工具:使用自动化工具执行备份和恢复操作,减少人工干预
- 定期维护:定期清理无用数据,优化集群配置,保持集群的性能
风哥提示:
风哥提示:
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
