集群备份
需要备份的内容
- Kubernetes 中的所有对象都是存储在 Etcd 中, 可以直接对数据库进行备份;
- 静态pod配置文件
- 证书文件
备份方法
- 备份 etcd + 其它集群文件
- velero
- 单独导出关键组件的清单文件
- 业务上采用 gitops 方式, 核心清单文件外置在git仓库中
etcd 备份
# 查看快照摘要信息
etcdctl --write-out=table snapshot status etcd-snapshot.db
#!/bin/bash
# 对 etcd 进行备份, 并保留最近 7 天的备份文件
# 1 * * * * /opt/etcd_back/etcd_backup.sh
LOG_FILE='/data/backup/run.log'
BACKUP_DIR=/data/backup/etcd # 备份保存路径
dd=`date +%Y-%m-%d-%H-%M`
snapshot_file=${backup_dir}/snapshot-${dd}.db
ETCDCTL_CERT="/etc/kubernetes/pki/etcd/server.crt"
ETCDCTL_KEY="/etc/kubernetes/pki/etcd/server.key"
ETCDCTL_CA_FILE="/etc/kubernetes/pki/etcd/ca.crt"
function log() {
echo "$(date "+%F %H:%M:%S") $@" >> $LOG_FILE
}
[ ! -d $BACKUP_DIR ] && mkdir -p $BACKUP_DIR
log "backup start -- ${snapshot_file}"
export ETCDCTL_API=3
etcdctl --endpoints 127.0.0.1:2379 snapshot save $snapshot_file \
--cert="${ETCDCTL_CERT}" \
--key="${ETCDCTL_KEY}" \
--cacert="${ETCDCTL_CA_FILE}"
log "backup snapshot end"
# 删除超过 7 天的备份
find ${BACKUP_DIR} -mtime +7 -exec rm -rf {} \;
log "backup end"恢复
恢复流程
- stop apiserver
- stop etcd
- 恢复 etcd 数据
- 启用 apiserver
# stop all kube-apiserver pod
# 此步骤不会影响正常运行的 Pod
直接将所有 master 节点上 静态 Pod 的 YAML 文件移除
cd /etc/kubernetes/manifests
mv *.yaml ../
或者
mv /etc/kubernetes/manifests/kube-apiserver.yaml .
# stop etcd - all etcd node run
systemctl status etcd # 记录配置参数, 如数据路径
systemctl stop etcd恢复 etcd 数据
注意etcd 的部署模式, 如果是独立节点, 就需要每个 etcd 节点都进行恢复, 注意修改 name 的值
mv /var/lib/etcd{,.bak.20220102}
# 执行恢复
export ETCDCTL_API=3
etcdctl snapshot restore snapshot.db \
--name etcd1 \
--initial-cluster "etcd1=https://192.168.0.25:2380,etcd2=https://192.168.0.26:2380,etcd3=https://192.168.0.28:2380" \
--initial-cluster-token k8s_etcd \
--initial-advertise-peer-urls https://192.168.0.25:2380 \
--data-dir=/var/lib/etcd
# start etcd
systemctl start etcd
# 检查 Etcd 集群状态(如果有证书)
etcdctl --cacert=/etc/ssl/etcd/ssl/ca.pem \
--cert=/etc/ssl/etcd/ssl/node-node3.pem \
--key=/etc/ssl/etcd/ssl/node-node3-key.pem \
--endpoints=https://192.168.0.25:2379,https://192.168.0.26:2379,https://192.168.0.28:2379 \
endpoint health恢复 apiserver
# start apiservice
即将挪走的配置文件进行恢复
mv ../*.yaml .
mv /root/kube-apiserver.yaml /etc/kubernetes/manifests/
# 验证集群状态
kubectl get nodes
kubectl get po -A最后更新于