百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Kubernetes 集群灾备环境部署的问题,这篇文章全告诉你了

off999 2025-03-25 16:24 29 浏览 0 评论

etcd 是 kubernetes 集群极为重要的一块服务,存储了kubernetes集群所有的数据信息,如 Namespace、Pod、Service、路由等状态信息。如果 etcd 集群发生灾难或者 etcd 集群数据丢失,都会影响k8s集群数据的恢复。因此,通过备份 etcd 数据来实现kubernetes 集群的灾备环境十分重要。

一、etcd集群备份

etcd 不同版本的 etcdctl 命令不一样,但大致差不多,这里备份使用 napshot save 进行快照备份。

需要注意几点:

  • 备份操作在 etcd 集群的其中一个节点执行就可以。

  • 这里使用的是 etcd v3 的 api,因为从 k8s 1.13 开始,k8s 不再支持 v2 版本的 etcd,即 k8s 的集群数据都存在了 v3 版本的 etcd 中。故备份的数据也只备份了使用 v3 添加的 etcd 数据,v2 添加的 etcd 数据是没有做备份的。

  • 本案例使用的是二进制部署的 k8s v1.18.6 + Calico 容器环境(下面命令中的”ETCDCTL_API=3 etcdctl” 等同于 “etcdctl”)

1)开始备份之前,先来查看下etcd数据

etcd 数据目录[root@k8s-master01 ~]# cat /opt/k8s/bin/environment.sh |grep "ETCD_DATA_DIR="export ETCD_DATA_DIR="/data/k8s/etcd/data"
etcd WAL 目录[root@k8s-master01 ~]# cat /opt/k8s/bin/environment.sh |grep "ETCD_WAL_DIR="export ETCD_WAL_DIR="/data/k8s/etcd/wal"
[root@k8s-master01 ~]# ls /data/k8s/etcd/data/member[root@k8s-master01 ~]# ls /data/k8s/etcd/data/member/snap[root@k8s-master01 ~]# ls /data/k8s/etcd/wal/0000000000000000-0000000000000000.wal 0.tmp

2)执行etcd集群数据备份

在etcd集群的其中一个节点执行备份操作,然后将备份文件拷贝到其他节点上。

先在etcd集群的每个节点上创建备份目录

# mkdir -p /data/etcd_backup_dir

在 etcd 集群其中个一个节点(这里在k8s-master01)上执行备份:

[root@k8s-master01 ~]# ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/cert/ca.pem --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --endpoints=https://172.16.60.231:2379 snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db

将备份文件拷贝到其他的 etcd 节点

[root@k8s-master01 ~]# rsync -e "ssh -p22" -avpgolr /data/etcd_backup_dir/etcd-snapshot-20200820.db root@k8s-master02:/data/etcd_backup_dir/[root@k8s-master01 ~]# rsync -e "ssh -p22" -avpgolr /data/etcd_backup_dir/etcd-snapshot-20200820.db root@k8s-master03:/data/etcd_backup_dir/

可以将上面 k8s-master01 节点的 etcd 备份命令放在脚本里,结合 crontab 进行定时备份:

[root@k8s-master01 ~]# cat /data/etcd_backup_dir/etcd_backup.sh#!/usr/bin/bash
date;CACERT="/etc/kubernetes/cert/ca.pem"CERT="/etc/etcd/cert/etcd.pem"EKY="/etc/etcd/cert/etcd-key.pem"ENDPOINTS="172.16.60.231:2379"
ETCDCTL_API=3 /opt/k8s/bin/etcdctl \--cacert="${CACERT}" --cert="${CERT}" --key="${EKY}" \--endpoints=${ENDPOINTS} \snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db
# 备份保留30天find /data/etcd_backup_dir/ -name "*.db" -mtime +30 -exec rm -f {} \;
# 同步到其他两个etcd节点/bin/rsync -e "ssh -p5522" -avpgolr --delete /data/etcd_backup_dir/ root@k8s-master02:/data/etcd_backup_dir//bin/rsync -e "ssh -p5522" -avpgolr --delete /data/etcd_backup_dir/ root@k8s-master03:/data/etcd_backup_dir/
设置 crontab 定时备份任务,每天凌晨5点执行备份:
[root@k8s-master01 ~]# chmod 755 /data/etcd_backup_dir/etcd_backup.sh[root@k8s-master01 ~]# crontab -l#etcd集群数据备份0 5 * * * /bin/bash -x /data/etcd_backup_dir/etcd_backup.sh > /dev/ 2>&1

二、etcd 集群恢复

etcd 集群备份操作只需要在其中的一个etcd节点上完成,然后将备份文件拷贝到其他节点。

但etcd集群恢复操作必须要所有的etcd节点上完成!

1)模拟 etcd 集群数据丢失
删除三个etcd集群节点的data数据 (或者直接删除data目录)

# rm -rf /data/k8s/etcd/data/*

查看 k8s 集群状态:

[root@k8s-master01 ~]# kubectl get csNAME STATUS MESSAGE ERRORetcd-2 Unhealthy Get https://172.16.60.233:2379/health: dial tcp 172.16.60.233:2379: connect: connection refusedetcd-1 Unhealthy Get https://172.16.60.232:2379/health: dial tcp 172.16.60.232:2379: connect: connection refusedetcd-0 Unhealthy Get https://172.16.60.231:2379/health: dial tcp 172.16.60.231:2379: connect: connection refusedscheduler Healthy okcontroller-manager Healthy ok

由于此时 etcd 集群的三个节点服务还在,过一会儿查看集群状态恢复正常:

[root@k8s-master01 ~]# kubectl get csNAME STATUS MESSAGE ERRORcontroller-manager Healthy okscheduler Healthy oketcd-0 Healthy {"health":"true"}etcd-2 Healthy {"health":"true"}etcd-1 Healthy {"health":"true"}
[root@k8s-master01 ~]# ETCDCTL_API=3 etcdctl --endpoints="https://172.16.60.231:2379,https://172.16.60.232:2379,https://172.16.60.233:2379" --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --cacert=/etc/kubernetes/cert/ca.pem endpoint healthhttps://172.16.60.231:2379 is healthy: successfully committed proposal: took = 9.918673mshttps://172.16.60.233:2379 is healthy: successfully committed proposal: took = 10.985279mshttps://172.16.60.232:2379 is healthy: successfully committed proposal: took = 13.422545ms
[root@k8s-master01 ~]# ETCDCTL_API=3 etcdctl --endpoints="https://172.16.60.231:2379,https://172.16.60.232:2379,https://172.16.60.233:2379" --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --cacert=/etc/kubernetes/cert/ca.pem member list --write-out=table+------------------+---------+------------+----------------------------+----------------------------+------------+| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |+------------------+---------+------------+----------------------------+----------------------------+------------+| 1d1d7edbba38c293 | started | k8s-etcd03 | https://172.16.60.233:2380 | https://172.16.60.233:2379 | false || 4c0cfad24e92e45f | started | k8s-etcd02 | https://172.16.60.232:2380 | https://172.16.60.232:2379 | false || 79cf4f0a8c3da54b | started | k8s-etcd01 | https://172.16.60.231:2380 | https://172.16.60.231:2379 | false |+------------------+---------+------------+----------------------------+----------------------------+------------+

如上发现,etcd集群三个节点的leader都是false,即没有选主。此时需要重启三个节点的etcd服务:

# systemctl restart etcd

重启后,再次查看发现etcd集群已经选主成功,集群状态正常!

[root@k8s-master01 ~]# ETCDCTL_API=3 etcdctl -w table --cacert=/etc/kubernetes/cert/ca.pem --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --endpoints="https://172.16.60.231:2379,https://172.16.60.232:2379,https://172.16.60.233:2379" endpoint status+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| https://172.16.60.231:2379 | 79cf4f0a8c3da54b | 3.4.9 | 1.6 MB | true | false | 5 | 24658 | 24658 | || https://172.16.60.232:2379 | 4c0cfad24e92e45f | 3.4.9 | 1.6 MB | false | false | 5 | 24658 | 24658 | || https://172.16.60.233:2379 | 1d1d7edbba38c293 | 3.4.9 | 1.7 MB | false | false | 5 | 24658 | 24658 | |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

但是,k8s集群数据其实已经丢失了。namespace命名空间下的pod等资源都没有了。此时就需要通过etcd集群备份文件来恢复,即通过上面的etcd集群快照文件恢复。

[root@k8s-master01 ~]# kubectl get nsNAME STATUS AGEdefault Active 9m47skube-node-lease Active 9m39skube-public Active 9m39skube-system Active 9m47s[root@k8s-master01 ~]# kubectl get pods -n kube-systemNo resources found in kube-system namespace.[root@k8s-master01 ~]# kubectl get pods --all-namespacesNo resources found

2)etcd 集群数据恢复,即 kubernetes 集群数据恢复
在 etcd 数据恢复之前,先依次关闭所有 master 节点的 kube-aposerver 服务,所有etcd 节点的 etcd 服务:

# systemctl stop kube-apiserver# systemctl stop etcd

特别注意:在进行 etcd 集群数据恢复之前,一定要先将所有 etcd 节点的 data 和 wal 旧工作目录删掉,这里指的是/data/k8s/etcd/data文件夹跟/data/k8s/etcd/wal文件夹,可能会导致恢复失败(恢复命令执行时报错数据目录已存在)。

# rm -rf /data/k8s/etcd/data && rm -rf /data/k8s/etcd/wal

在每个etcd节点执行恢复操作:

172.16.60.231节点-------------------------------------------------------ETCDCTL_API=3 etcdctl \--name=k8s-etcd01 \--endpoints="https://172.16.60.231:2379" \--cert=/etc/etcd/cert/etcd.pem \--key=/etc/etcd/cert/etcd-key.pem \--cacert=/etc/kubernetes/cert/ca.pem \--initial-cluster-token=etcd-cluster-0 \--initial-advertise-peer-urls=https://172.16.60.231:2380 \--initial-cluster=k8s-etcd01=https://172.16.60.231:2380,k8s-etcd02=https://172.16.60.232:2380,k8s-etcd03=https://192.168.137.233:2380 \--data-dir=/data/k8s/etcd/data \--wal-dir=/data/k8s/etcd/wal \snapshot restore /data/etcd_backup_dir/etcd-snapshot-20200820.db

172.16.60.232节点-------------------------------------------------------ETCDCTL_API=3 etcdctl \--name=k8s-etcd02 \--endpoints="https://172.16.60.232:2379" \--cert=/etc/etcd/cert/etcd.pem \--key=/etc/etcd/cert/etcd-key.pem \--cacert=/etc/kubernetes/cert/ca.pem \--initial-cluster-token=etcd-cluster-0 \--initial-advertise-peer-urls=https://172.16.60.232:2380 \--initial-cluster=k8s-etcd01=https://172.16.60.231:2380,k8s-etcd02=https://172.16.60.232:2380,k8s-etcd03=https://192.168.137.233:2380 \--data-dir=/data/k8s/etcd/data \--wal-dir=/data/k8s/etcd/wal \snapshot restore /data/etcd_backup_dir/etcd-snapshot-20200820.db

192.168.137.233节点-------------------------------------------------------ETCDCTL_API=3 etcdctl \--name=k8s-etcd03 \--endpoints="https://192.168.137.233:2379" \--cert=/etc/etcd/cert/etcd.pem \--key=/etc/etcd/cert/etcd-key.pem \--cacert=/etc/kubernetes/cert/ca.pem \--initial-cluster-token=etcd-cluster-0 \--initial-advertise-peer-urls=https://192.168.137.233:2380 \--initial-cluster=k8s-etcd01=https://172.16.60.231:2380,k8s-etcd02=https://172.16.60.232:2380,k8s-etcd03=https://192.168.137.233:2380 \--data-dir=/data/k8s/etcd/data \--wal-dir=/data/k8s/etcd/wal \snapshot restore /data/etcd_backup_dir/etcd-snapshot-20200820.db

依次启动所有etcd节点的etcd服务:

# systemctl start etcd# systemctl status etcd

检查 ETCD 集群状态(如下,发现etcd集群里已经成功选主了)

[root@k8s-master01 ~]# ETCDCTL_API=3 etcdctl --endpoints="https://172.16.60.231:2379,https://172.16.60.232:2379,https://172.16.60.233:2379" --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --cacert=/etc/kubernetes/cert/ca.pem endpoint healthhttps://172.16.60.232:2379 is healthy: successfully committed proposal: took = 12.837393mshttps://172.16.60.233:2379 is healthy: successfully committed proposal: took = 13.306671mshttps://172.16.60.231:2379 is healthy: successfully committed proposal: took = 13.602805ms
[root@k8s-master01 ~]# ETCDCTL_API=3 etcdctl -w table --cacert=/etc/kubernetes/cert/ca.pem --cert=/etc/etcd/cert/etcd.pem --key=/etc/etcd/cert/etcd-key.pem --endpoints="https://172.16.60.231:2379,https://172.16.60.232:2379,https://172.16.60.233:2379" endpoint status+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| https://172.16.60.231:2379 | 79cf4f0a8c3da54b | 3.4.9 | 9.0 MB | false | false | 2 | 13 | 13 | || https://172.16.60.232:2379 | 4c0cfad24e92e45f | 3.4.9 | 9.0 MB | true | false | 2 | 13 | 13 | || https://172.16.60.233:2379 | 5f70664d346a6ebd | 3.4.9 | 9.0 MB | false | false | 2 | 13 | 13 | |+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

再依次启动所有master节点的kube-apiserver服务:

# systemctl start kube-apiserver# systemctl status kube-apiserver

查看kubernetes集群状态:

[root@k8s-master01 ~]# kubectl get csNAME STATUS MESSAGE ERRORcontroller-manager Healthy okscheduler Healthy oketcd-2 Unhealthy HTTP probe failed with statuscode: 503etcd-1 Unhealthy HTTP probe failed with statuscode: 503etcd-0 Unhealthy HTTP probe failed with statuscode: 503
由于etcd服务刚重启,需要多刷几次状态就会正常:[root@k8s-master01 ~]# kubectl get csNAME STATUS MESSAGE ERRORcontroller-manager Healthy okscheduler Healthy oketcd-2 Healthy {"health":"true"}etcd-0 Healthy {"health":"true"}etcd-1 Healthy {"health":"true"}

查看kubernetes的资源情况:

[root@k8s-master01 ~]# kubectl get nsNAME STATUS AGEdefault Active 7d4hkevin Active 5d18hkube-node-lease Active 7d4hkube-public Active 7d4hkube-system Active 7d4h
[root@k8s-master01 ~]# kubectl get pods --all-namespacesNAMESPACE NAME READY STATUS RESTARTS AGEdefault dnsutils-ds-22q87 0/1 ContainerCreating 171 7d3hdefault dnsutils-ds-bp8tm 0/1 ContainerCreating 138 5d18hdefault dnsutils-ds-bzzqg 0/1 ContainerCreating 138 5d18hdefault dnsutils-ds-jcvng 1/1 Running 171 7d3hdefault dnsutils-ds-xrl2x 0/1 ContainerCreating 138 5d18hdefault dnsutils-ds-zjg5l 1/1 Running 0 7d3hdefault kevin-t-84cdd49d65-ck47f 0/1 ContainerCreating 0 2d2hdefault nginx-ds-98rm2 1/1 Running 2 7d3hdefault nginx-ds-bbx68 1/1 Running 0 7d3hdefault nginx-ds-kfctv 0/1 ContainerCreating 1 5d18hdefault nginx-ds-mdcd9 0/1 ContainerCreating 1 5d18hdefault nginx-ds-ngqcm 1/1 Running 0 7d3hdefault nginx-ds-tpcxs 0/1 ContainerCreating 1 5d18hkevin nginx-ingress-controller-797ffb479-vrq6w 0/1 ContainerCreating 0 5d18hkevin test-nginx-7d4f96b486-qd4fl 0/1 ContainerCreating 0 2d1hkevin test-nginx-7d4f96b486-qfddd 0/1 Running 0 2d1hkube-system calico-kube-controllers-578894d4cd-9rp4c 1/1 Running 1 7d3hkube-system calico-node-d7wq8 0/1 PodInitializing 1 7d3h

在etcd集群数据恢复后,pod容器也会慢慢恢复到running状态。至此,kubernetes整个集群已经通过etcd备份数据恢复了。

三、最后总结

Kubernetes 集群备份主要是备份 ETCD 集群。而恢复时,主要考虑恢复整个顺序:

停止kube-apiserver → 停止ETCD → 恢复数据 → 启动ETCD → 启动kube-apiserve

特别注意:

  • 备份 ETCD 集群时,只需要备份一个 ETCD 数据,然后同步到其他节点上。

  • 恢复 ETCD 数据时,拿其中一个节点的备份数据恢复即可。

来源:
https://www.cnblogs.com/kevingrace/p/14616824.html

女友和服务器都掉水里了,你先救哪一个?看看运维的回答:

报名通道

近期好文:

一文搞懂 DNS 基础知识,收藏起来有备无患~

“高效运维”公众号诚邀广大技术人员投稿,

投稿邮箱:jiachen@greatops.net,或添加联系人微信:185 1150 1091.
点击

相关推荐

win10有产品id没有密钥(win10 我没有产品密钥)

WIN10,在左下角输入WINDOWSPOWERSHELL,然后点击系统查询结果第一项,在弹出的窗口中输入:(Get-WmiObject-query‘select*fromSoftware...

win10截屏后找不到了(win10截屏后找不到了怎么办)

Win10系统截屏后没有更新通知并不是一个常见的问题。可能是由于系统设置或者安装的软件造成的。如果系统设置为静音或者禁用通知,那么截屏后不会有通知。另外,一些截屏软件可能会阻止系统通知,需要手动设置...

微软官网win10家庭版下载(微软官网win10家庭版下载速度慢)
  • 微软官网win10家庭版下载(微软官网win10家庭版下载速度慢)
  • 微软官网win10家庭版下载(微软官网win10家庭版下载速度慢)
  • 微软官网win10家庭版下载(微软官网win10家庭版下载速度慢)
  • 微软官网win10家庭版下载(微软官网win10家庭版下载速度慢)
运行定时关机命令(运行定时关机命令怎么设置)

1、打开电脑,按住【Win+R】组合键,弹出运行命令,在编辑框内输入如下命令:shutdown-s-t3600;电脑定时关机运行2、shutdown-s-t3600命令的含义如下:shut...

win7打印机共享设置(详细图文步骤)
  • win7打印机共享设置(详细图文步骤)
  • win7打印机共享设置(详细图文步骤)
  • win7打印机共享设置(详细图文步骤)
  • win7打印机共享设置(详细图文步骤)
键盘快捷键(键盘快捷键是哪个)

电脑键盘快捷键大全:Ctrl+1,2,3... 功能:切换到从左边数起第1,2,3...个标签Ctrl+A 功能:全部选中当前页面内容Ctrl+C 功能:复制当前选中内容Ctrl+D 功能:打开“添加...

宏基acer官网商城(宏基官方商城)

宏碁本本底部有个序列号标签,不是粉色的那个,粉色的是系统的序列号,白色的是本本的出厂序列号,上宏碁官网查查你的序列号就知道真假了。在盖子的后面就可以查询到序列号,或者是去网上查询宏碁笔记本在官网下...

网盘在哪里打开(华为网盘在哪里打开)

给你的是一个网盘地址吧,直接把这个地址放到浏览器地址栏就好了,如果有提取码,他会提示你输入提取码的。一般都是在网上找到百度云链接,然后把文件保存在自己的百度网盘文件夹里面的。打开百度网盘app,...

win10系统安全模式怎么进入(win10安全模式如何进入)
  • win10系统安全模式怎么进入(win10安全模式如何进入)
  • win10系统安全模式怎么进入(win10安全模式如何进入)
  • win10系统安全模式怎么进入(win10安全模式如何进入)
  • win10系统安全模式怎么进入(win10安全模式如何进入)
win7sp1专业版(win7专业版vl)

Win7系统SP1是系统发布后第一个SP包x64是64位操作系统。Windows7指的是微软公司的Windows7操作系统ultimate指的是旗舰版(with表示伴随,说明这是提供商所提供...

手写输入法手写板怎么设置(手写输入法手写板怎么设置 iphone)

手写输入法设置方法:1、打开手机至桌面主页,保持手机处于工作状态;  2、在手机桌面主页列表找到设置,点击打开并进入设置主界面;  3、在设置主界面找到系统设置选项,点击打开并进入系统设置主界面;  ...

推荐杀毒软件(下载杀毒软件最新版)
推荐杀毒软件(下载杀毒软件最新版)

好的杀毒软件有360杀毒,金山毒霸,AVG杀毒等等。1,360杀毒,品牌介绍:360安全卫士品牌是一款由奇虎360公司推出的功能强、效果好、受用户欢迎的安全杀毒软件。360安全卫士拥有查杀木马、清理插件、修复漏洞、电脑体检、电脑救援、保护隐...

2025-11-12 08:51 off999

百度云盘官网(百度云盘官网下载)

网盘在手机上面仅仅是一个图标,他是不占用手机硬盘的,当然,如果你从网盘上下载了文件到本地,下载的文件就会占用手机的硬盘空间。要找到这个文件,可以通过文件管理器来进行查找,也可以通过路径的方式来查找,但...

路由器设置管理系统(路由器设置管理员密码怎么设置)
路由器设置管理系统(路由器设置管理员密码怎么设置)

电脑端:把华为路由器接通电源,并开启WIFI,如果你使用电脑PC端,请使用网线连接路由器;成功连接到路由器之后,打开电脑浏览器,在浏览器中输入IP地址:192.168.3.1即可进入华为路由器管理界面;进入我要上网页面。在上网方式下拉框中,...

2025-11-12 07:51 off999

win10家庭版密钥在哪里看(windows10家庭版密钥在哪里)

要查看Windows10系统的激活密钥,请按照以下步骤操作: 1.点击“开始”菜单,然后选择“设置”(齿轮图标)。 2.在“设置”窗口中,选择“更新和安全”。 ...

取消回复欢迎 发表评论: