从备份还原 主管 后,将在还原完成后删除在执行备份后创建的所有 K8s 资源。如果其中某些资源与对象(例如虚拟机或磁盘)关联,这些对象在 vCenter Server 中将处于孤立状态。必须从 vCenter Server 中清理孤立对象。

过程

  1. 列出 vSphere 命名空间 的所有虚拟机。
    1. 通过在 主管 控制平面虚拟机上运行以下命令,检索 vSphere 命名空间folderMoId
      root@421c9fa40208448fecc15d277bdca66d [ ~ ]# kubectl get availabilityzone -o json
      {
          "apiVersion": "v1",
          "items": [
              {
                  "apiVersion": "topology.tanzu.vmware.com/v1alpha1",
                  "kind": "AvailabilityZone",
                  "metadata": {
                      ...
                  },
                  "spec": {
                      "clusterComputeResourceMoIDs": [
                          "domain-c50"
                      ],
                      "clusterComputeResourceMoId": "domain-c50",
                      "namespaces": {
                          "pod-ns": {
                              "folderMoId": "group-v81", <--- this is the folderMoId that you need for next step
                              ...
                          },
                          "vmsvc-ns": {
                              "folderMoId": "group-v83", <--- this is the folderMoId that you need for next step
                              ...
                          }
                      }
                  }
              }
          ],
          "kind": "List",
          "metadata": {
              "resourceVersion": ""
          }
      }
    2. 通过运行以下 DCLI 命令,列出 vSphere 命名空间 上的所有现有虚拟机:
      本示例使用 pod-ns 命名空间
      root@sc2-10-186-199-30 [ ~ ]# dcli +i +username ‘[email protected]’ +password <password>
      Welcome to VMware Datacenter CLI (DCLI)
       
      usage: <namespaces> <command>
       
      To auto-complete and browse DCLI namespaces:   [TAB]
      If you need more help for a command:           vcenter vm get --help
      If you need more help for a namespace:         vcenter vm --help
      To execute dcli internal command: env
      For detailed information on DCLI usage visit:  http://vmware.com/go/dcli
       
      dcli> com vmware vcenter vm list --folders group-v81
      |---------------|-----|-----------------------------------------|-----------|---------|
      |memory_size_MiB|vm   |name                                     |power_state|cpu_count|
      |---------------|-----|-----------------------------------------|-----------|---------|
      |512            |vm-84|deployment-before-backup-778449d88d-c9gnc|POWERED_ON |1        |
      |512            |vm-85|deployment-before-backup-778449d88d-4jtqj|POWERED_ON |1        |
      |512            |vm-86|deployment-before-backup-778449d88d-tqwbh|POWERED_ON |1        |
      |512            |vm-91|deployment-after-backup-778449d88d-khkxx |POWERED_OFF|1        |
      |512            |vm-92|deployment-after-backup-778449d88d-7dgcc |POWERED_OFF|1        |
      |512            |vm-93|deployment-after-backup-778449d88d-sxbcf |POWERED_OFF|1        |
      |---------------|-----|-----------------------------------------|-----------|---------|
  2. 找到并清理孤立的命名空间。
    如果在执行 主管 备份后删除某个命名空间,则会在还原 主管 后重新创建该命名空间作为 Kubernetes 资源。必须删除该 K8s 资源。
    1. 通过列出 vCenter Server 的所有命名空间来找到孤立的命名空间。
      dcli> com vmware vcenter namespaces instances list
    2. 列出所有命名空间 K8s 资源。
      root@423f9d75bef000dc828a535c6ac0bd4b [ ~ ]# k get ns -A
    1. 查找步骤 A 和步骤 B 中生成的对象之间的差异,并清理孤立的命名空间 K8s 资源。
      root@423f9d75bef000dc828a535c6ac0bd4b [ ~ ]# k delete ns test-set-workload-ns
      namespace "test-set-workload-ns" deleted
  3. 找到并清理与 VirtualMachine 资源关联的孤立虚拟机。
    从该备份还原 主管 后,执行 主管 备份后创建的 VirtualMachine Kubernetes 资源将导致虚拟机处于孤立状态。必须从 vCenter Server 清单中清理这些孤立虚拟机。
    1. 找到与 VirtualMachine 资源关联的孤立虚拟机。
      接下来的步骤以 vmsvc-ns 命名空间为例。
      1. 列出 vCenter Server 清单中的所有虚拟机。示例代码片段将列出 vCenter Server 中的所有虚拟机,因为 group-96vmsvc-ns 命名空间相关联。
        dcli> com vmware vcenter vm list --folders group-v96
        |---------------|------|------------|-----------|---------|
        |memory_size_MiB|vm    |name        |power_state|cpu_count|
        |---------------|------|------------|-----------|---------|
        |2048           |vm-104|vmsvc-after |POWERED_ON |2        |
        |2048           |vm-97 |vmsvc-before|POWERED_ON |2        |
        |---------------|------|------------|-----------|---------|
      2. 列出所有 VirtualMachine K8s 资源。运行 kubectl get 以获取有关任一控制平面虚拟机的资源详细信息,然后在输出中搜索 uniqueID。在本示例中,与 K8s 资源关联的虚拟机列表为 vm-97
        root@42344b596f57bfcf9441179fa1ed1a5c [ ~ ]# k get vm -n vmsvc-ns -o json
        {
            "apiVersion": "v1",
            "items": [
                {
                    "apiVersion": "vmoperator.vmware.com/v1alpha1",
                    "kind": "VirtualMachine",
                    ...
                    "uniqueID": "vm-97",
        ...
        }
      3. 比较上述步骤生成的两个列表。
        • vCenter Server 中的虚拟机列表:<vm-104, vm-97>
        • 与 k8s 资源关联的虚拟机列表:<vm-97>

      因此,孤立虚拟机列表为:<vm-104>

    2. 清理孤立的虚拟机。
      dcli> com vmware vcenter vm power stop --vm vm-104
      dcli> com vmware vcenter vm delete --vm vm-104
  4. 找到并清理与 Pod 资源关联的孤立虚拟机。
    还原 主管 后,执行 主管 备份后创建的 Pod K8s 资源将导致 vCenter Server 中出现孤立的虚拟机。按照以下步骤找到并清理它们。

    这些示例使用命名空间 pod-ns

    1. 列出 vCenter Server 清单中的所有虚拟机。
      在本示例中,虚拟机组 group-v83 与命名空间 pod-ns 相关联。虚拟机列表为 vm-88vm-89vm-90vm-101vm-102vm-103
      dcli> com vmware vcenter vm list --folders group-v83
      |---------------|------|-----------------------------------------|-----------|---------|
      |memory_size_MiB|vm    |name                                     |power_state|cpu_count|
      |---------------|------|-----------------------------------------|-----------|---------|
      |512            |vm-101|deployment-after-backup-778449d88d-ldvn8 |POWERED_OFF|1        |
      |512            |vm-102|deployment-after-backup-778449d88d-v29dd |POWERED_OFF|1        |
      |512            |vm-103|deployment-after-backup-778449d88d-zdbl9 |POWERED_OFF|1        |
      |512            |vm-88 |deployment-before-backup-778449d88d-fgq5b|POWERED_ON |1        |
      |512            |vm-89 |deployment-before-backup-778449d88d-mp7td|POWERED_ON |1        |
      |512            |vm-90 |deployment-before-backup-778449d88d-cjhq6|POWERED_ON |1        |
      |---------------|------|-----------------------------------------|-----------|---------|
    2. 列出 K8s 资源。
      运行 kubectl get 以获取有关任一控制平面虚拟机的资源详细信息,然后在输出中搜索 vmware-system-vm-moid。与 K8s 资源关联的虚拟机列表为 vm-88vm-89vm-90
      root@42344b596f57bfcf9441179fa1ed1a5c [ ~ ]# k get pod -n pod-ns -o json
      {
          "apiVersion": "v1",
          "items": [
              {
                  "apiVersion": "v1",
                  "kind": "Pod",
                  "metadata": {
                      "annotations": {
                          ...
                          "vmware-system-vm-moid": "vm-90:5a5198fc-c5cb-4b89-a70f-331025b40539",
                          ...
                      },
                          ...
                          "vmware-system-vm-moid": "vm-88:5a5198fc-c5cb-4b89-a70f-331025b40539",
                          ...
                          "vmware-system-vm-moid": "vm-89:5a5198fc-c5cb-4b89-a70f-331025b40539",
                          ...
      }
    3. 比较上述步骤生成的两个列表。
      • vCenter Server 中的虚拟机列表为:<vm-88, vm-89, vm-90, vm-101, vm-102, vm-103>
      • 与 K8s 资源关联的虚拟机列表为:<vm-88, vm-89, vm-90>

      因此,孤立虚拟机列表为:<vm-101, vm-102, vm-103>

    4. 清理孤立的虚拟机。
      dcli> com vmware vcenter vm delete --vm vm-101
      dcli> com vmware vcenter vm delete --vm vm-102
      dcli> com vmware vcenter vm delete --vm vm-103
  5. 找到并清理与 Tanzu Kubernetes Grid 集群关联的孤立虚拟机和资源池。

    还原 主管 后,执行 主管 备份后创建的 Tanzu Kubernetes Grid 集群也将导致 vCenter Server 中出现孤立的虚拟机。

    注:

    如果在执行还原操作后创建 TKG 集群时遇到问题,则必须按照当前步骤中的说明清理孤立的虚拟机。

    1. 查找孤立 Tanzu Kubernetes Grid 集群列表。
      使用 kubectl 获取任一控制平面虚拟机上的 Tanzu Kubernetes Grid 集群 K8s 资源列表: <test-cluster, test-cluster-e2e-script, tkc-before-backup>
      root@4239f4159c7063d5608cf3fc0bdd532e [ ~ ]# k get tkc -A
      NAMESPACE             NAME                      CONTROL PLANE   WORKER   TKR NAME                   AGE   READY   TKR COMPATIBLE   UPDATES AVAILABLE
      selfservice-tkc-ns    test-cluster              1               1        v1.23.8---vmware.3-tkg.1   19h   True    True
      test-gc-e2e-demo-ns   test-cluster-e2e-script   3               1        v1.23.8---vmware.3-tkg.1   18h   False   True
      tkc-ns                tkc-before-backup         3               1        v1.23.8---vmware.3-tkg.1   16h   True    True

      使用 DCLI 获取与命名空间或 Tanzu Kubernetes Grid 集群关联的所有资源池,然后获取 vCenter Server 中的 Tanzu Kubernetes Grid 集群列表:<test-cluster, test-cluster-e2e-script, tkc-before-backup, tkc-after-backup>

      dcli> com vmware vcenter resourcepool list
      |-----------------------|-------------|
      |name                   |resource_pool|
      |-----------------------|-------------|
      |Resources              |resgroup-10  |
      |Resources              |resgroup-23  |
      |Namespaces             |resgroup-56  |
      |selfservice-tkc-ns     |resgroup-62  | <--- this is a namespace
      |test-cluster           |resgroup-66  | <--- Tanzu Kubernetes Grid cluster
      |test-gc-e2e-demo-ns    |resgroup-70  | <--- this is a namespace
      |test-cluster-e2e-script|resgroup-74  | <--- Tanzu Kubernetes Grid cluster
      |tkc-ns                 |resgroup-80  | <--- this is a namespace
      |tkc-before-backup      |resgroup-89  | <--- Tanzu Kubernetes Grid cluster
      |tkc-after-backup       |resgroup-96  | <--- Tanzu Kubernetes Grid cluster
      |-----------------------|-------------|
    2. 比较上述步骤中的两个列表,孤立 Tanzu Kubernetes Grid 集群列表为: <tkc-after-backup>
    3. 清理与孤立 Tanzu Kubernetes Grid 集群关联的虚拟机。
      通过使用关联的资源池 <resgroup-96>,使用 DCLI 获取与孤立 Tanzu Kubernetes Grid 集群关联的所有虚拟机:
      dcli> com vmware vcenter vm list --resource-pools resgroup-96
      |---------------|------|-----------------------------------------------|-----------|---------|
      |memory_size_MiB|vm    |name                                           |power_state|cpu_count|
      |---------------|------|-----------------------------------------------|-----------|---------|
      |2048           |vm-100|tkc-after-backup-zlcdm-wk5xf                   |POWERED_ON |2        |
      |2048           |vm-101|tkc-after-backup-zlcdm-76q4h                   |POWERED_ON |2        |
      |2048           |vm-98 |tkc-after-backup-zlcdm-9fv2w                   |POWERED_ON |2        |
      |2048           |vm-99 |tkc-after-backup-workers-4hdqb-657fb58d45-d7pqg|POWERED_ON |2        |
      |---------------|------|-----------------------------------------------|-----------|---------|
      然后逐个删除这些虚拟机:
      dcli> com vmware vcenter vm power stop --vm vm-100
      dcli> com vmware vcenter vm delete --vm vm-100
    4. 清理与孤立 Tanzu Kubernetes Grid 集群关联的资源池。
      <dcli> com vmware vcenter resourcepool delete --resource-pool resgroup-96

      您还可以从 vSphere Client 中删除孤立的资源池。

  6. 找到并清理与持久卷 (PV) 关联的孤立第一类磁盘 (FCD)。
    还原 主管 后,执行 主管 备份后创建的 PV K8s 资源将导致 vCenter Server 中出现孤立的 FCD。按照以下步骤找到并清理它们。
    1. 找到与 PV 关联的孤立 FCD。
      1. 安装将用于查找孤立 FCD 的 govc。govc 是一个用户友好的 CLI,可用于替代 UI 且非常适合执行自动化任务。
        curl -L -o - "https://github.com/vmware/govmomi/releases/latest/download/govc_$(uname -s)_$(uname -m).tar.gz" | tar -C /usr/local/bin -xvzf - govc
        

        有关更多安装选项,请访问 https://github.com/vmware/govmomi/tree/main/govc#installation

      2. 运行以下 bash 脚本,列出 主管 上存在的 PV。
        #!/bin/bash
         
        export GOVC_INSECURE=1
        export GOVC_USERNAME='[email protected]'
        export GOVC_PASSWORD=<password>
        export GOVC_URL=https://<vc ip>/sdk
         
        # datastore path example - /test-vpx-1688432886-30489-wcp.wcp-sanity/datastore/sharedVmfs-0
        govc volume.ls -l -ds=<datastore path>
        结果如下:
        peiyangs@peiyangs-a01 govc % sudo bash orphanedPV.sh
        590c8e31-f5bf-4179-9250-5cdd66bf591c    pvc-843c932b-8974-475d-8f8a-9b165137169d    1.0GB   KUBERNETES  vSphereSupervisorID-7f88d7b3-12ac-4fcf-a101-b80eb76becdf
        37f8ad5b-dfe6-465b-b0f0-11591a2968dc    pvc-77c42590-f0b0-457f-9743-6a3ebca55078    1.0GB   KUBERNETES  vSphereSupervisorID-7f88d7b3-12ac-4fcf-a101-b80eb76becdf
        28a265b8-2e6b-421c-b16d-046ffc7aeea7    pvc-1b88c923-4354-4537-a7cb-a8a6d763d5e7    1.0GB   KUBERNETES  vSphereSupervisorID-7f88d7b3-12ac-4fcf-a101-b80eb76becdf
        
      3. 运行以下 bash 脚本,列出 vCenter Server 中的所有磁盘:
        #!/bin/bash
         
        export GOVC_INSECURE=1
        export GOVC_USERNAME='[email protected]'
        export GOVC_PASSWORD=<password>
        export GOVC_URL=https://<vc ip>/sdk
         
        # datastore path example - /test-vpx-1688432886-30489-wcp.wcp-sanity/datastore/sharedVmfs-0
        govc disk.ls -l -ds=<datastore path>
        结果如下:
        peiyangs@peiyangs-a01 govc % sudo bash orphanedPV.sh
        28a265b8-2e6b-421c-b16d-046ffc7aeea7  pvc-1b88c923-4354-4537-a7cb-a8a6d763d5e7  1.0G    Jul  4 02:33:27 <--- this is the disk correspondings to PV
        37f8ad5b-dfe6-465b-b0f0-11591a2968dc  pvc-77c42590-f0b0-457f-9743-6a3ebca55078  1.0G    Jul  4 02:32:41 <--- this is the disk correspondings to PV
        3a7517c2-f8c2-46a9-b0d5-18c665759311  vmware-sv-img-cache-domain-c50            26.0M   Jul  4 02:36:41
        590c8e31-f5bf-4179-9250-5cdd66bf591c  pvc-843c932b-8974-475d-8f8a-9b165137169d  1.0G    Jul  4 02:30:45 <--- this is the disk correspondings to PV
        68ba220c-0f83-49eb-b77a-d60471e24844  pvc-92f83ae0-7c2d-46d9-ab85-19858462ddd1  5.0G    Jul  4 18:27:02 <--- this is the disk correspondings to PV
        72dbe8c5-a3b5-4298-8203-ea1cb86116e6  vmware-sv-img-cache-domain-c50            3.0M    Jul  4 02:38:39
        79e233a6-0134-40e7-8ba8-3133442324f9  vmware-sv-img-cache-domain-c50            195.0M  Jul  4 18:26:12
        a1a0a9d7-0baf-4592-9041-8c0feb960246  vmware-sv-img-cache-domain-c50            7.0M    Jul  4 02:35:37
        cec2af09-80af-4086-a069-34140e2480dc  vmware-sv-img-cache-domain-c50            193.0M  Jul  4 02:31:12
        
      4. 比较上述步骤中的两个列表。
        • PV 列表:<590c8e31-f5bf-4179-9250-5cdd66bf591c, 37f8ad5b-dfe6-465b-b0f0-11591a2968dc, 28a265b8-2e6b-421c-b16d-046ffc7aeea7>
        • FCD 列表:<590c8e31-f5bf-4179-9250-5cdd66bf591c, 37f8ad5b-dfe6-465b-b0f0-11591a2968dc, 28a265b8-2e6b-421c-b16d-046ffc7aeea7, 68ba220c-0f83-49eb-b77a-d60471e24844>

        孤立的 FCD 为:<68ba220c-0f83-49eb-b77a-d60471e24844>

    2. 删除孤立的 FCD。
      使用 govc 删除孤立的 FCD,示例脚本:
      #!/bin/bash
       
      export GOVC_INSECURE=1
      export GOVC_USERNAME='[email protected]'
      export GOVC_PASSWORD=<password>
      export GOVC_URL=https://<vc ip>/sdk
       
      # datastore path example - /test-vpx-1688432886-30489-wcp.wcp-sanity/datastore/sharedVmfs-0
      govc disk.rm -ds=<datastore path> 68ba220c-0f83-49eb-b77a-d60471e24844
      结果如下:
      peiyangs@peiyangs-a01 govc % sudo bash orphanedPV.sh
      [06-07-23 11:36:27] Deleting 68ba220c-0f83-49eb-b77a-d60471e24844...OK