Kubernetes 无论是二进制搭建还是 kubeadm 搭建的集群,都依赖于 etcd 数据库来进行存储集群数据,安全起见,一定要备份。一旦集群宕机,就会显得备份得多重要。

kubeadm etcd 备份恢复

kubeadm 部署的集群中的 etcd 是以静态容器的方式运行的,静态容器的配置文件存放目录是 /etc/kubernetes/manifests/,且默认 etcd 是单实例,并没有高可用。其实还是建议即使 kubeadm 部署时,也可以使用外部的 二进制部署的高可用 etcd 集群。

通过查看 etcd 的 yaml 文件,可以看到 etcd 的数据使用 hostpath 做的持久化,路径为 /var/lib/etcd

在进行实验时,想看到最终效果,可以在备份之后,将集群中某个pod删除,然后再进行恢复,查看被删除的pod有没有被恢复。

备份

通过 etcd 的 snapshot 来进行备份,也就是快照的方式。

# etcd 有2个API版本,跨度较大,安装新版本kubeadm部署的肯定是3版本ba
# 如果是旧版的k8s集群,还需要自行查阅资料确定API版本,不然可能命令选项是不一样的
# 尽管新版本中兼容了2版本,但是默认还是使用了2版本的标准,所以需要单独声明一下API版本

# 这里需要安装etcdctl命令
yum -y install etcd
# 以下的命令不是写错了,就得这么写,否则报错No help topic for 'snapshot'
ETCDCTL_API=3 etcdctl snapshot save snap.db \
  --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 

# 备份文件为snap.db

恢复

为了防止在恢复期间,apiserver 还想继续写入数据,需要先把 apiserver 和 etcd 容器暂停

mv /etc/kubernetes/manifests/{kube-apiserver.yaml,etcd.yaml} /tmp/
mv /var/lib/etcd /var/lib/etcd.bak

再通过 etcdctl restore 进行恢复

ETCDCTL_API=3 etcdctl snapshot restore snap.db --data-dir=/var/lib/etcd

恢复启动静态容器

mv /tmp/{kube-apiserver.yaml,etcd.yaml} /etc/kubernetes/manifests

二进制 etcd 备份恢复

etcd 集群以服务的形式在多台服务器运行,与容器方式不同的仅仅是服务的 endpoints 不一样

备份

集群中每个节点的数据是一致的,所以使用其中一个节点进行备份即可,当然也可以为了

ETCDCTL_API=3 etcdctl snapshot save snap.db \
  --endpoints=https://192.168.1.11:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \  # 修改为二进制部署时的证书路径
  --cert=/etc/kubernetes/pki/etcd/server.crt \ # 修改为二进制部署时的证书路径
  --key=/etc/kubernetes/pki/etcd/server.key # 修改为二进制部署时的证书路径

恢复

为了防止在恢复期间,apiserver 还想继续写入数据,需要先把 apiserver 和 etcd 容器暂停

systmectl stop kube-apiserver
systemctl stop etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak

每个 etcd 节点进行恢复

etcd-1

ETCDCTL_API=3 etcdctl snapshot restore snap.db \
  --name etcd-1 \   # 每台节点name不一样,根据当前节点etcd配置文件即可
  --initial-cluster="etcd-1=https://192.168.1.11:2380,etcd-1=https://192.168.1.12:2380,etcd-1=https://192.168.1.13:2380" \
  --initial-cluster-token=etcd-cluster \
  --initialadvertise-peer-urls=https://192.168.1.11:2380 \  # 修改为当前节点ip
  --data-dir=/vaf/lib/default.etcd

etcd-2

ETCDCTL_API=3 etcdctl snapshot restore snap.db \
  --name etcd-2 \  
  --initial-cluster="etcd-1=https://192.168.1.11:2380,etcd-1=https://192.168.1.12:2380,etcd-1=https://192.168.1.13:2380" \
  --initial-cluster-token=etcd-cluster \
  --initialadvertise-peer-urls=https://192.168.1.12:2380 \
  --data-dir=/vaf/lib/default.etcd

…以此类推

启动 kube-apiserver 和 etcd

systemctl start kube-apiserver
systemctl start etcd

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0