如何迁移同一项目中 GKE 集群内的持久卷?

jjm*_*rre 3 persistent-storage google-cloud-platform kubernetes google-kubernetes-engine

我有一个运行着多个永久性磁盘用于存储的 GKE 集群。为了设置临时环境,我在同一项目中创建了第二个集群。现在我想在登台集群中使用生产集群的永久磁盘中的数据。

我已经为临时集群创建了永久性磁盘。将生产数据移动到临时集群磁盘的最佳方法是什么?

Gab*_*ada 6

您可以使用开源工具Velero来迁移 Kubernetes 集群资源。

请按照以下步骤迁移 GKE 集群内的永久磁盘:

  1. 创建GCS存储桶:
BUCKET=<your_bucket_name>
gsutil mb gs://$BUCKET/
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个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)')
Run Code Online (Sandbox Code Playgroud)
  1. 为服务帐户创建自定义角色:
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}
Run Code Online (Sandbox Code Playgroud)
  1. 授予 Velero 访问权限:
gcloud iam service-accounts keys create credentials-velero \
    --iam-account $SERVICE_ACCOUNT_EMAIL
Run Code Online (Sandbox Code Playgroud)
  1. 在源集群上下载并安装 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
Run Code Online (Sandbox Code Playgroud)

注意:下载和安装是在Linux系统上执行的,Linux系统是Cloud Shell使用的操作系统。如果您通过 Cloud SDK 管理 GCP 资源,则发布和安装过程可能会有所不同。

  1. 确认 velero pod 正在运行:
$ kubectl get pods -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-xxxxxxxxxxx-xxxx   1/1     Running   0          11s
Run Code Online (Sandbox Code Playgroud)
  1. 为 PV、PVC 创建备份:
velero backup create <your_backup_name> --include-resources pvc,pv --selector app.kubernetes.io/<your_label_name>=<your_label_value> 
Run Code Online (Sandbox Code Playgroud)
  1. 验证您的备份是否成功,没有错误或警告:
$ 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
Run Code Online (Sandbox Code Playgroud)

现在持久卷已备份,您可以按照以下步骤继续迁移到目标集群:

  1. 在目标集群中进行身份验证
gcloud container clusters get-credentials <your_destination_cluster> --zone <your_zone> --project <your_project>
Run Code Online (Sandbox Code Playgroud)
  1. 使用与第一部分步骤 5 相同的参数安装 Velero:
velero install \
    --provider gcp \
    --plugins velero/velero-plugin-for-gcp:v1.4.0 \
    --bucket $BUCKET \
    --secret-file ./credentials-velero
Run Code Online (Sandbox Code Playgroud)
  1. 确认 velero pod 正在运行:
kubectl get pods -n velero
NAME                      READY   STATUS    RESTARTS   AGE
velero-xxxxxxxxxx-xxxxx   1/1     Running   0          19s
Run Code Online (Sandbox Code Playgroud)
  1. 为了避免备份数据被覆盖,请将存储桶更改为只读模式:
kubectl patch backupstoragelocation default -n velero --type merge --patch '{"spec":{"accessMode":"ReadOnly"}}'
Run Code Online (Sandbox Code Playgroud)
  1. 确认 Velero 能够从存储桶访问备份:
velero backup describe <your_backup_name> --details
Run Code Online (Sandbox Code Playgroud)
  1. 恢复备份的卷:
velero restore create --from-backup <your_backup_name>
Run Code Online (Sandbox Code Playgroud)
  1. 确认持久卷已在目标集群上恢复:
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
Run Code Online (Sandbox Code Playgroud)

查看本教程作为参考。