我有一个GKE集群,它运行着几个用于存储的持久磁盘。为了设置一个临时环境,我在同一个项目中创建了第二个集群。现在,我想使用来自临时集群中生产集群的持久磁盘的数据。
我已经为临时群集创建了永久磁盘。将生产数据转移到临时集群磁盘的最佳方法是什么。
您可以使用旨在迁移Kubernetes集群资源的开源工具Velero。
按照以下步骤迁移GKE集群中的持久磁盘:
- 创建GCS存储桶:
BUCKET=<your_bucket_name>
gsutil mb gs://$BUCKET/
- 创建一个Google服务帐户,并将关联的电子邮件存储在一个变量中以供以后使用:
GSA_NAME=<your_service_account_name>
gcloud iam service-accounts create $GSA_NAME
--display-name "Velero service account"
SERVICE_ACCOUNT_EMAIL=$(gcloud iam service-accounts list
--filter="displayName:Velero service account"
--format 'value(email)')
- 为服务帐户创建自定义角色:
PROJECT_ID=<your_project_id>
ROLE_PERMISSIONS=(
compute.disks.get
compute.disks.create
compute.disks.createSnapshot
compute.snapshots.get
compute.snapshots.create
compute.snapshots.useReadOnly
compute.snapshots.delete
compute.zones.get
storage.objects.create
storage.objects.delete
storage.objects.get
storage.objects.list
)
gcloud iam roles create velero.server
--project $PROJECT_ID
--title "Velero Server"
--permissions "$(IFS=","; echo "${ROLE_PERMISSIONS[*]}")"
gcloud projects add-iam-policy-binding $PROJECT_ID
--member serviceAccount:$SERVICE_ACCOUNT_EMAIL
--role projects/$PROJECT_ID/roles/velero.server
gsutil iam ch serviceAccount:$SERVICE_ACCOUNT_EMAIL:objectAdmin gs://${BUCKET}
- 授予Velero访问权限:
gcloud iam service-accounts keys create credentials-velero
--iam-account $SERVICE_ACCOUNT_EMAIL
- 在源集群上下载并安装Velero:
wget https://github.com/vmware-tanzu/velero/releases/download/v1.8.1/velero-v1.8.1-linux-amd64.tar.gz
tar -xvzf velero-v1.8.1-linux-amd64.tar.gz
sudo mv velero-v1.8.1-linux-amd64/velero /usr/local/bin/velero
velero install
--provider gcp
--plugins velero/velero-plugin-for-gcp:v1.4.0
--bucket $BUCKET
--secret-file ./credentials-velero
注意:下载和安装是在Linux系统上执行的,该系统是Cloud Shell使用的操作系统。如果您通过Cloud SDK管理GCP资源,则发布和安装过程可能会有所不同。
- 确认velero吊舱正在运行:
$ kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
velero-xxxxxxxxxxx-xxxx 1/1 Running 0 11s
- 为PV、PVC创建备份:
velero backup create <your_backup_name> --include-resources pvc,pv --selector app.kubernetes.io/<your_label_name>=<your_label_value>
- 验证您的备份是否成功且没有错误或警告:
$ velero backup describe <your_backup_name> --details
Name: your_backup_name
Namespace: velero
Labels: velero.io/storage-location=default
Annotations: velero.io/source-cluster-k8s-gitversion=v1.21.6-gke.1503
velero.io/source-cluster-k8s-major-version=1
velero.io/source-cluster-k8s-minor-version=21
Phase: Completed
Errors: 0
Warnings: 0
现在永久卷已经备份,您可以按照以下步骤继续迁移到目标集群:
- 在目标群集中进行身份验证
gcloud container clusters get-credentials <your_destination_cluster> --zone <your_zone> --project <your_project>
- 使用与第一部分步骤5相同的参数安装Velero:
velero install
--provider gcp
--plugins velero/velero-plugin-for-gcp:v1.4.0
--bucket $BUCKET
--secret-file ./credentials-velero
- 确认velero吊舱正在运行:
kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
velero-xxxxxxxxxx-xxxxx 1/1 Running 0 19s
- 要避免备份数据被覆盖,请将存储桶更改为只读模式:
kubectl patch backupstoragelocation default -n velero --type merge --patch '{"spec":{"accessMode":"ReadOnly"}}'
- 确认Velero能够从bucket访问备份:
velero backup describe <your_backup_name> --details
- 还原备份的卷:
velero restore create --from-backup <your_backup_name>
- 确认目标群集上的永久卷已还原:
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
redis-data-my-release-redis-master-0 Bound pvc-ae11172a-13fa-4ac4-95c5-d0a51349d914 8Gi RWO standard 79s
redis-data-my-release-redis-replicas-0 Bound pvc-f2cc7e07-b234-415d-afb0-47dd7b9993e7 8Gi RWO standard 79s
redis-data-my-release-redis-replicas-1 Bound pvc-ef9d116d-2b12-4168-be7f-e30b8d5ccc69 8Gi RWO standard 79s
redis-data-my-release-redis-replicas-2 Bound pvc-65d7471a-7885-46b6-a377-0703e7b01484 8Gi RWO standard 79s
请参阅本教程。