使用 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/

posted @ 2024-01-22 15:52  klvchen  阅读(137)  评论(0编辑  收藏  举报