对 Etcd 数据进行备份及恢复,Etcd官方也提供了备份的文档,你有兴趣可以阅读一下。这里总结了一些实际操作,以便你后续可以借鉴并进行手动的备份和恢复。命令行里面的一些证书路径以及 endpoint 地址需要根据自己的集群参数进行更改
数据备份
1 2 3 4 5
| ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --key=/etc/kubernetes/pki/etcd/peer.key \ --cert=/etc/kubernetes/pki/etcd/peer.crt \ snapshot save ./new.snapshot.db
|
查看 etcd 集群的节点
1 2 3 4 5
| ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/peer.crt \ --key=/etc/kubernetes/pki/etcd/peer.key \ member list
|
停止所有节点上的 etcd!(注意是所有!!)
1 2 3
| ## 如果是 static pod,可以听过如下的命令进行 stop ## 如果是 systemd 管理的,可以通过 systemctl stop etcd mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/
|
数据清理
依次在每个节点上,移除 etcd 数据
数据恢复
1 2 3 4 5 6 7 8
| ## 依次在每个节点上,恢复 etcd 旧数据 ## 里面的 name,initial-advertise-peer-urls,initial-cluster=controlplane ## 等参数,可以从 etcd pod 的 yaml 文件中获取到。 ETCDCTL_API=3 etcdctl snapshot restore ./old.snapshot.db \ --data-dir=/var/lib/etcd \ --name=controlplane \ --initial-advertise-peer-urls=https://172.17.0.18:2380 \ --initial-cluster=controlplane=https://172.17.0.18:2380
|
恢复 etcd 服务
1 2 3
| ## 依次在每个节点上,拉起 etcd 服务 mv /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/ systemctl restart kubelet
|
上述这些备份,都需要手动运行命令行进行操作。如果你的 Etcd 集群是运行在 Kubernetes 集群中的,你可以通过以下的定时 Job (CronJob) 来帮你自动化、周期性(如下的 YAML 文件中会每分钟对 Etcd 进行一次备份)地备份 Etcd 的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| apiVersion: batch/v1beta1 kind: CronJob metadata: name: backup namespace: kube-system spec: # activeDeadlineSeconds: 100 schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: backup image: k8s.gcr.io/etcd:3.2.24 env: - name: ETCDCTL_API value: "3" 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 /backup/etcd-snapshot-$(date +%Y-%m-%d_%H:%M:%S_%Z).db"] volumeMounts: - mountPath: /etc/kubernetes/pki/etcd name: etcd-certs readOnly: true - mountPath: /backup name: backup restartPolicy: OnFailure hostNetwork: true volumes: - name: etcd-certs hostPath: path: /etc/kubernetes/pki/etcd type: DirectoryOrCreate - name: backup hostPath: path: /data/backup type: DirectoryOrCreate
|