安装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。
以上