上次搞了个Host文件Copy的方式来对Master节点进行备份和恢复,但是它个严重的问题就在备份前需要将etcd容器停止掉,否则会出现etcd恢复异常。今天我们就来看看另外一种不需要停止的备份方式etcd snapshot。
如何备份?
ETCD不停机备份就需要使用etcdctl命令生成snapshot,我们就需要进入到ETCD容器当中去执行命令。备份需要定时执行,那么我们就通过K8S的CronJob定时任务。
1、构建CronJob,定义每3分钟执行一次
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: etcd-backup
namespace: kube-system
spec:
schedule: "*/3 * * * *"
jobTemplate:
spec:
2、备份前我们先通过Init Pod做一些预处理操作
注:这些操作更适合执行etcd备份后操作。但是etcd的镜像采用的是阉割的bash系统,连最基的ls,data等命令都没有,所以只能通过Init Pod在下次执行备份时处理上次备份遗留的问题。
template: spec: initContainers: - name: init image: busybox imagePullPolicy: IfNotPresent command: ["sh"] args: - "-c"
#保留最新的十个文件,删除其它历史备份
#如果目录存在snapshot.db文件,则根据它的创建日期重命名(如:202011251831.db) - "cd /backups;ls -t | tail -n +11 | xargs rm -rf;file=$(ls -l snapshot.db --full-time | awk '{print $6,substr($7,0,5);}' | sed 's/[ :-]//g');if [ -n "$file" ]; then mv snapshot.db ${file}.db;fi;" volumeMounts: - mountPath: /backups name: backup
3、k8s master etcd是静态pod形式运行,从/etc/kubernetes/manifests/etcd.yaml文件中找到k8s集群使用的etcd镜像版本
containers:
- name: backup
image: k8s.gcr.io/etcd:3.4.13-0
imagePullPolicy: IfNotPresent
env:
- name: ETCDCTL_API
value: "3
4、使用pod command执行shell,连接master节点etcd,并使用etcdctl执行备份
这里备份名字固定命名用snapshot.db,下次备份时通过init pod来进行改名。网上很多文章中直接用date函数生成日期形式的备份文件名,那很可能是没作用的,因为etcd采用的bash基础镜像已经删除了date函数
command: ["/bin/sh"] args: ["-c", "etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /backups/snapshot.db;"]
5、在备份etcd时需要使用到连接master etcd server的证书信息,和备份目录,我们需要把Host目录挂载进pod
volumeMounts: - mountPath: /etc/kubernetes/pki/etcd name: etcd-certs readOnly: true - mountPath: /backups name: backup
6、为了可以使用127.0.0.1:2379访问到etcd服务端,我们需要将Pod调度到master节点并且使用hostNetwork
restartPolicy: OnFailure
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "node-role.kubernetes.io/master"
operator: Exists
tolerations:
- effect: NoSchedule
operator: Exists
hostNetwork: true
7、定义volumeMounts
volumes: - name: etcd-certs hostPath: path: /etc/kubernetes/pki/etcd type: DirectoryOrCreate - name: backup hostPath: path: /home/shendu/backups/etcd type: DirectoryOrCreate
如何恢复?
1、恢复/etc/kubernetes/pki/etcd/目录下的证书信息
2、恢复备份至 /var/lib/etcd目录
mkdir -p /var/lib/etcd
docker run --rm
-v '/home/shendu/backups/etcd:/backups'
-v '/var/lib/etcd:/var/lib/etcd'
--env ETCDCTL_API=3
'k8s.gcr.io/etcd:3.4.13-0'
/bin/sh -c "etcdctl snapshot restore '/backups/202011271604.db' ; mv /default.etcd/member/ /var/lib/etcd/"
3、根据现有etcd构建master节点
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd