使用 velero 备份 K8S
背景
近来可能公司会迁移服务器,先对 velero 工具做一个初步的认识
环境
K8S 版本: v1.24.1
velero 版本: v1.11.1
minio 版本:2023.12.14 ,部署在 K8S 集群外(192.168.1.226 服务器上)
官方备份工作流程图
更多详细信息,可参考:https://velero.io/docs/v1.11/how-velero-works/
前期工作
部署 minio
mkdir -p /data/docker-compose/minio
cd /data/docker-compose/minio
cat >> docker-compose.yml << EOF
version: '3.4'
services:
minio:
image: bitnami/minio:2023.12.14
deploy:
resources:
limits:
cpus: '1'
memory: 2G
volumes:
- ./minio_data:/bitnami/minio/data
- /etc/localtime:/etc/localtime
container_name: minio
environment:
- MINIO_ROOT_USER=minio
- MINIO_ROOT_PASSWORD=minio123
- LANG=en_US.UTF-8
restart: always
network_mode: "host"
EOF
mkdir minio_data
chown 1001.1001 minio_data
docker-compose up -d
docker ps -a
检查
浏览器访问 http://192.168.1.226:9001/ 正常登录
创建一个 bucket velerodata 用来保存 K8S 的备份
部署 velero 服务端
这里采用 helm3 的方式部署
mkdir -p /data/yaml/velero/velero
cd /data/yaml/velero/velero
helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm pull vmware-tanzu/velero --version 5.0.2
# 若无法下载,可以使用下面方式
# wget https://github.com/vmware-tanzu/helm-charts/releases/download/velero-5.0.2/velero-5.0.2.tgz
tar zxvf velero-5.0.2.tgz
cat >> my-values.yaml << EOF
initContainers:
- name: velero-plugin-for-aws # 使用 Minio,Minio 兼容 aws 的 S3
image: velero/velero-plugin-for-aws:v1.7.0
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /target
name: plugins
configuration:
backupStorageLocation:
- name:
provider: aws # 存储的提供商 aws
bucket: velerodata # Minio 指定 bucket 的名字,用来存储备份
config:
region: minio
s3ForcePathStyle: "true"
s3Url: http://192.168.1.226:9000 # Mino 的地址
credentials:
secretContents:
cloud: |
[default]
aws_access_key_id=minio # Minio 的用户名
aws_secret_access_key=minio123 # Minio 的密码
snapshotsEnabled: false # 不启用快照
EOF
# 部署,注意这里,使用 --dry-run 参数报错
kubect create ns velero
helm -n velero install velero -f my-values.yaml ./velero
检查
部署 velero 客户端
# 客户端需要部署在能使用 kubectl 的机器,我这里是 master 节点
mkdir -p /data/software
cd /data/software
wget https://github.com/vmware-tanzu/velero/releases/download/v1.11.1/velero-v1.11.1-linux-amd64.tar.gz
tar zxvf velero-v1.11.1-linux-amd64.tar.gz
cp velero-v1.11.1-linux-amd64/velero /usr/local/bin/
# 测试
velero --help
创建备份
# 准备例子
kubectl create ns klvchen
mkdir -p /data/yaml/klvchen/nginx
cd /data/yaml/klvchen/nginx
cat >> sts.yaml << EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: klvchen
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /var/lib/www/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs-client"
resources:
requests:
storage: 1Gi
EOF
kubectl apply -f sts.yaml
cat >> svc-nodeport.yaml << EOF
apiVersion: v1
kind: Service
metadata:
labels:
name: nginx-nodeport
namespace: klvchen
spec:
ports:
- name: nginx
port: 80
protocol: TCP
targetPort: 80
nodePort: 30070
selector:
app: nginx
type: NodePort
EOF
kubectl apply -f svc-nodeport.yaml
浏览器访问
创建备份
DATE=`date +%Y%m%d-%H%M%S`
velero backup create klvchen-backup-${DATE} --include-namespaces klvchen
模拟删除
kubectl delete -f svc-nodeport.yaml -f sts.yaml
备份还原
可以在 Minio 中找到当时的备份
velero restore create --from-backup klvchen-backup-20240122-151000
检查
参考文档
https://github.com/vmware-tanzu/velero -- K8S 版本对应关系
https://github.com/vmware-tanzu/velero-plugin-for-aws -- 存储插件版本和 Velero 版本对应关系
https://vmware-tanzu.github.io/helm-charts/