集群备份

集群备份

需要备份的内容

  1. Kubernetes 中的所有对象都是存储在 Etcd 中, 可以直接对数据库进行备份;
  2. 静态pod配置文件
  3. 证书文件

备份方法

  1. 备份 etcd + 其它集群文件
  2. velero
  3. 单独导出关键组件的清单文件
  4. 业务上采用 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"

恢复

恢复流程

  1. stop apiserver
  2. stop etcd
  3. 恢复 etcd 数据
  4. 启用 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
最后更新于