安装Velero的备忘录(Minio版)

首先

Velero在Kubernetes环境中用于进行备份。
Minio是一种兼容AWS S3的对象存储。

在安装Velero的过程中,我发现在Harbor的文章中写有安装步骤,但在升级版本时,另行总结了独立的文章。

由于可以备份整个命名空间,所以在将应用程序分离为命名空间时非常方便。

請提供參考資料。

    • https://qiita.com/YasuhiroABE/items/8d247a3abbcf484e1c65 – Velero+MinioによるHarborの引越し作業

 

    • https://goharbor.io/docs/main/administration/backup-restore/ – Harbor 公式ガイド

 

    https://github.com/vmware-tanzu/velero-plugin-for-aws – Github Velero AWSプラグイン

环境

我安装的最新环境如下。

    • Kubernetes v1.25.6 (Kubespray v2.21.0)

 

    • Rook/Ceph v1.9.13 (Ceph v16.2.6)

 

    • Velero v1.10.3 → 1.11.1 → 1.12.0-rc.1

 

    • velero-plugin-for-aws v1.6.2 → v1.7.1 → v1.8.0-rc.1

 

    • Minio (RELEASE.2023-07-07T07-13-57Z)

 

    mc (RELEASE.2023-07-07T05-25-51Z)

准备工作

    • veleroコマンドを/usr/local/sbin/veleroに実行権限を付けて配置 (permisison: 0755)

 

    credentials-velero ファイルを配置

凭证-velero文件的格式

在Minio上创建一个bucket后,我会提前创建一个文件,其中包含具有访问权限的ID和密码,格式如下。

[default]
aws_access_key_id = ed573f5ea128ca21
aws_secret_access_key = c7c443a8fa8404abfcaab6fe09922c8f

安装步骤

我正在创建一个类似下面的Makefile。


.PHONY: all
all:
        @echo reference - https://github.com/vmware-tanzu/velero-plugin-for-aws

.PHONY: install
install:
        sudo velero install \
            --provider aws \
            --plugins velero/velero-plugin-for-aws:v1.6.2 \
            --bucket my-backup-bucket \
            --secret-file ./credentials-velero \
            --use-volume-snapshots=false \
            --uploader-type restic \
            --use-node-agent \
            --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://my-minio-svc.minio.svc.cluster.local:9000

.PHONY: delete
delete:
        sudo kubectl delete namespace/velero clusterrolebinding/velero
        sudo kubectl delete crds -l component=velero

安装本身是使用make命令进行的。

$ make install

确认操作需要检查velero Pod的日志。

通过Velero进行备份

(Note: This is a transliteration of “Getting backups with Velero” in Chinese)

创建用于测试的名称空间,并部署一些Pod和PVC以验证备份是否正常工作。

创建 Namespack、Pod 和 PVC。

首先创建命名空间velero-test。

$ sudo kubectl create ns velero-test

接下来,我们需要准备一个用于测试的Pod、PVC的YAML文件。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-block-pvc
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-ceph-block
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-file-pvc
spec:
  accessModes: [ "ReadWriteMany" ]
  storageClassName: rook-cephfs
  resources:
    requests:
      storage: 1Gi

将使用这些PVC来部署Nginx。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-block-storage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-block-storage
  template:
    metadata:
      labels:
       app: nginx-block-storage
    spec:
      containers:
      - name: nginx-block-storage
        image: nginx:latest
        imagePullPolicy: "Always"
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-data-storage
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-data-storage
        persistentVolumeClaim:
          claimName: nginx-block-pvc
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-file-storage
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-file-storage
  template:
    metadata:
      labels:
       app: nginx-file-storage
    spec:
      containers:
      - name: nginx-file-storage
        image: nginx:latest
        imagePullPolicy: "Always"
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-data-storage
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-data-storage
        persistentVolumeClaim:
          claimName: nginx-file-pvc

创建用于访问的Service对象。

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-block-storage
spec:
  type: LoadBalancer
  ports:
     -  port: 80
        protocol: TCP
        targetPort: 80
  selector:
    app: nginx-block-storage
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-file-storage
spec:
  type: LoadBalancer
  ports:
     -  port: 80
        protocol: TCP
        targetPort: 80
  selector:
    app: nginx-file-storage

应用这些YAML文件,使nginx运行起来。

$ alias kubectl="sudo kubectl -n velero-test"
$ sudo kubectl apply -f 01.pvc.yaml -f 02.deploy.yaml -f 03.svc.yaml

为了确认备份是否正常工作,我们会放置适当的内容进行测试。

$ kubectl exec -it "$(kubectl get pod -l app=nginx-block-storage -o jsonpath={.items[0].metadata.name})" -- bash -c "echo Hello Block Nginx, $(id -un) at $(date) > /usr/share/nginx/html/index.html"
$ kubectl exec -it "$(kubectl get pod -l app=nginx-file-storage -o jsonpath={.items[0].metadata.name})" -- bash -c "echo Hello Filesystem Nginx, $(id -un) at $(date) > /usr/share/nginx/html/index.html"

配置好的index.html的内容可以通过LoadBalancer分配的IP地址进行访问,如果是使用ClusterIP运行,则可以通过nginx的Pod使用exec命令并通过curl命令进行确认。

配置的index.html会返回简单的内容。

$ curl 192.168.100.192
Hello Block Nginx, ubuntu at Sun Sep 10 09:09:44 AM UTC 2023
$ curl 192.168.100.193
Hello Filesystem Nginx, ubuntu at Sun Sep 10 09:09:52 AM UTC 2023

获取备份文件

备份是按照以下方式执行的。

$ sudo kubectl -n velero-test annotate pod/nginx-block-storage-85bd475f8b-fnjf5 backup.velero.io/backup-volumes=nginx-data-storage
$ sudo kubectl -n velero-test annotate pod/nginx-file-storage-54cd65d46c-qk8fk backup.velero.io/backup-volumes=nginx-data-storage
$ sudo velero backup create velero-test-20230910.1845 --include-namespaces velero-test --wait

在备份描述(backup describe)的输出中,看起来一切正常,但是当使用–details选项时,获取资源列表(Resource List)却失败了。

Resource List:  <error getting backup resource list: Get "http://my-minio-svc.minio.svc.cluster.local:9000/my-backup-bucket/backups/velero-test-20230910.1845/velero-test-20230910.1845-resource-list.json.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=8b81073d6343afcc%2F20230910%2Fminio%2Fs3%2Faws4_request&X-Amz-Date=20230910T094928Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=31aa96c9cd32e364250aa3f3866bd9fb5ae8a772f6d962417b31810de30fdfc8": dial tcp: lookup my-minio-svc.minio.svc.cluster.local on 127.0.0.53:53: server misbehaving>

备份日志命令在获取文件时出现错误。

An error occurred: Get "http://my-minio-svc.minio.svc.cluster.local:9000/my-backup-bucket/backups/velero-test-20230910.2043/velero-test-20230910.2043-logs.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=8b81073d6343afcc%2F20230910%2Fminio%2Fs3%2Faws4_request&X-Amz-Date=20230910T114625Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Signature=d91e85847e64ec4ef3313e858c6ecff25576d51337fabe06fce2242c5e9aea3b": dial tcp: lookup my-minio-svc.minio.svc.cluster.local on 127.0.0.53:53: server misbehaving

当我搜索问题时,我发现有很多关于DNS错误导致无法从主机名获取IP的报告,但是没有找到类似的报告。

执行恢复。

我们将指定另一个命名空间进行恢复。

$ sudo velero restore create --from-backup velero-test-20230910.1835 --namespace-mappings velero-test:velero-test2 --wait

使用curl访问服务后,我发现index.html已经成功恢复到PVC上。

$ sudo kubectl -n velero-test2 get svc
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
nginx-block-storage   LoadBalancer   10.233.14.151   192.168.100.194   80:32494/TCP   4m29s
nginx-file-storage    LoadBalancer   10.233.16.125   192.168.100.195   80:30019/TCP   4m29s

$ curl 192.168.100.194
Hello Block Nginx, ubuntu at Sun Sep 10 09:09:44 AM UTC 2023

$ curl 192.168.100.195
Hello Filesystem Nginx, ubuntu at Sun Sep 10 09:09:52 AM UTC 2023

我还在1.11.1和1.12.0-rc1版本上进行了确认,同样成功地恢复了服务。

备份描述或备份日志的输出并不正常。

另外,velero-plugin-for-aws根据每个velero版本分别指定了1.6.2、1.7.1和1.8.0-rc.1。

最后

由于Velero在更改操作时使用,因此每次执行删除和安装都不会有任何问题。

然而,由于需要确认是否能正常运行,我留下了备忘录以便创建一个简单的测试项目。

我們計劃利用這個來準備其他叢集中的Velero。

以上

广告
将在 10 秒后关闭
bannerAds