上次搞了個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