将 Azure 磁盘永久性卷移动到同一订阅或不同订阅中的另一个 AKS 群集
本文介绍了如何将 Azure 磁盘永久性卷从一个 Azure Kubernetes 服务 (AKS) 群集安全地移动到同一订阅或不同订阅中的另一个群集。 目标订阅必须在同一区域中。
完成此移动的步骤序列为:
- 为了避免数据丢失,请确认源 AKS 群集上的 Azure 磁盘资源状态不是“已附加”状态。
- 将 Azure 磁盘资源移动到同一订阅或不同订阅中的目标资源组。
- 验证 Azure 磁盘资源移动是否已成功。
- 创建永久性卷 (PV) 和永久性卷声明 (PVC),然后将移动的磁盘作为卷装载到目标群集上的 Pod 上。
开始之前
- 确保已安装且已配置 Azure CLI 版本 2.0.59。 要查找版本,请运行
az --version
。 如果需要进行安装或升级,请参阅安装 Azure CLI。 - 在将资源移动到新资源组或订阅中查看有关在不同区域之间移动资源的详细信息和要求。 请务必查看该文章中的移动资源前的核对清单。
- 源群集必须具有一个或多个附加了 Azure 磁盘的永久性卷。
- 目标订阅中必须有 AKS 群集。
验证磁盘卷状态
在处理永久性卷时,请务必避免数据损坏、不一致或数据丢失的风险。 若要在迁移或移动过程中降低这些风险,必须首先执行以下步骤来验证磁盘卷是否未附加。
使用
az aks show
命令标识托管着 Azure 托管磁盘的节点资源组,并添加--query nodeResourceGroup
参数。az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
该命令的输出类似于以下示例:
MC_myResourceGroup_myAKSCluster_chinanorth3
使用
az disk list
命令列出托管磁盘。 引用上一步骤中返回的资源组。az disk list --resource-group MC_myResourceGroup_myAKSCluster_chinanorth3
查看列表并记下你计划移动到其他群集的磁盘卷。 还可以通过查找
diskState
属性来验证磁盘状态。 以下命令输出是一个精简的示例。{ "LastOwnershipUpdateTime": "2023-04-25T15:09:19.5439836+00:00", "creationData": { "createOption": "Empty", "logicalSectorSize": 4096 }, "diskIOPSReadOnly": 3000, "diskIOPSReadWrite": 4000, "diskMBpsReadOnly": 125, "diskMBpsReadWrite": 1000, "diskSizeBytes": 1073741824000, "diskSizeGB": 1000, "diskState": "Unattached",
注意
从上面的输出中记下你要移动的每个磁盘的
resourceGroup
字段的值。 此资源组是节点资源组,而不是群集资源组。 你需要使用此资源组的名称才能移动磁盘。如果
diskState
显示Attached
,请先确定是否有任何工作负载仍在访问该卷并停止它们。 一段时间后,磁盘状态返回状态Unattached
,然后可以移动。
移动永久性卷
若要将永久性卷移动到另一个 AKS 群集,请按照将 Azure 资源移动到新的资源组或订阅中所述的步骤进行操作。 可以使用 Azure 门户、Azure PowerShell 或 Azure CLI 来执行迁移。
在此过程中,你将引用:
- 托管着 Azure 托管磁盘的源节点资源组的名称或资源 ID。 可以通过在 Azure 门户中导航到“磁盘”仪表板并记下磁盘的关联资源组来查找节点资源组的名称。
- 要将托管磁盘移动到的目标资源组的名称或资源 ID。
- 托管磁盘资源的名称或资源 ID。
注意
由于资源提供程序之间的依赖关系,此操作可能需要长达四个小时才能完成。
验证磁盘卷是否已移动
将磁盘卷移动到目标群集资源组后,使用 az disk list
命令在资源组列表中验证该资源。 引用资源被移动到的目标资源组。 在此示例中,磁盘已移动到名为 MC_myResourceGroup_myAKSCluster_chinanorth3 的资源组。
az disk list --resource-group MC_myResourceGroup_myAKSCluster_chinanorth3
将移动的磁盘装载为卷
若要装载移动的磁盘卷,请使用在前面的步骤中复制的资源 ID 创建一个静态永久性卷,并创建永久性卷声明(在此示例中是一个简单的 Pod)。
创建包含一个永久性卷的 pv-azuredisk.yaml 文件。 将 volumeHandle 字段更新为来自上一步骤的磁盘资源 ID。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-azuredisk spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: managed-csi csi: driver: disk.csi.azure.com readOnly: false volumeHandle: /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/MC_rg_azure_aks-pvc-target_chinanorth3/providers/Microsoft.Compute/disks/pvc-501cb814-dbf7-4f01-b4a2-dc0d5b6c7e7a volumeAttributes: fsType: ext4
创建一个 pvc-azuredisk.yaml 文件,其中包含使用 PersistentVolume 的 PersistentVolumeClaim。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-azuredisk spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi volumeName: pv-azuredisk storageClassName: managed-csi
使用
kubectl apply
命令创建 PersistentVolume 和 PersistentVolumeClaim,并引用已创建的两个 YAML 文件。kubectl apply -f pv-azuredisk.yaml kubectl apply -f pvc-azuredisk.yaml
使用
kubectl get
命令验证 PersistentVolumeClaim 是否已创建并绑定到 PersistentVolume。kubectl get pvc pvc-azuredisk
该命令的输出类似于以下示例:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azuredisk Bound pv-azuredisk 20Gi RWO 5s
若要引用 PersistentVolumeClaim,请创建 azure-disk-pod.yaml 文件。 在示例清单中,Pod 的名称为 mypod。
apiVersion: v1 kind: Pod metadata: name: mypod spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine name: mypod resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: azure mountPath: /mnt/azure volumes: - name: azure persistentVolumeClaim: claimName: pvc-azuredisk
使用 kubectl apply 命令应用配置并装载卷。
kubectl apply -f azure-disk-pod.yaml
检查 Pod 状态,以及随
/mnt/azure
上的 Pod 文件系统中装载的卷迁移的数据。 首先,使用kubectl get
命令获取 Pod 状态。kubectl get pods
该命令的输出类似于以下示例:
NAME READY STATUS RESTARTS AGE mypod 1/1 Running 0 4m1s
使用
kubectl exec
命令验证装载的卷/mnt/azure
中的数据。kubectl exec -it mypod -- ls -l /mnt/azure/
该命令的输出类似于以下示例:
total 28 -rw-r--r-- 1 root root 0 Jan 11 10:09 file-created-in-source-aks
后续步骤
- 有关存储最佳做法的详细信息,请参阅有关 Azure Kubernetes 服务中存储和备份的最佳做法。