管理 Distributed Cloud 已连接服务器上的虚拟机

本页面介绍了如何管理在运行 VM Runtime on Google Distributed Cloud 的 Google Distributed Cloud Connected 服务器上的虚拟机。在完成本页面上的步骤之前,您必须熟悉 VM Runtime on GDC。如需查看受支持的客机操作系统列表,请参阅适用于 VM Runtime on GDC 的经过验证的客机操作系统

如需了解虚拟机如何作为分布式云互联平台的重要组成部分,请参阅扩展 GKE Enterprise 以管理本地边缘虚拟机

Distributed Cloud 连接集群支持虚拟机 webhook。 这样一来,连接的 Distributed Cloud 就可以验证向本地 Kubernetes API 服务器发出的用户请求。遭拒的要求会生成有关拒绝原因的详细信息。

配置 Symcloud Storage

Google Distributed Cloud Connected 服务器使用 Rakuten Symcloud Storage 作为其存储解决方案。Symcloud Storage 是一种第三方解决方案,可在每个 Distributed Cloud Connected 节点上充当本地存储抽象层,并使其本地存储可供在其他 Distributed Cloud Connected 节点上运行的工作负载使用。

Symcloud Storage 是从 Google Cloud Marketplace 部署的,并受其中所述条款的约束。Google 对将 Symcloud Storage 与 Distributed Cloud Connected 搭配使用提供有限支持,并且可能会寻求第三方提供商的帮助。Symcloud Storage 的软件更新包含在 Distributed Cloud Connected 软件更新中。

按如下方式配置 Google Distributed Cloud Connected 集群,以针对虚拟机启用 Symcloud Storage:

  1. 使用以下命令创建 robinio 命名空间:

    kubectl create ns robinio
    
  2. 获取 Symcloud Storage 许可文件,并使用以下命令将其应用于集群:

    kubectl apply LICENSE_FILE
    
  3. 使用以下命令验证 Symcloud Storage 是否正常运行:

    kubectl apply LICENSE_FILE
    

    该命令会返回类似于以下内容的输出:

     Name:         robin
     Namespace:
     Labels:       app.kubernetes.io/instance=robin
                   app.kubernetes.io/managed-by=robin.io
                   app.kubernetes.io/name=robin
     Annotations:  <none>
     API Version:  manage.robin.io/v1
     Kind:         RobinCluster
     Metadata:
       
     Spec:
       
     Status:
       
       Phase:             Ready
       
    
  4. 通过将以下配置应用于集群来创建 robin-block-immediate 存储类:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: robin-block-immediate
    parameters:
      faultdomain: host
      replication: "3"
      blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  5. 通过将以下配置应用于集群来创建 robin-snapshotclass 卷快照类:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: robin-snapshotclass
      labels:
        app.kubernetes.io/instance: robin
        app.kubernetes.io/managed-by: robin.io
        app.kubernetes.io/name: robin
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete
    

在 Distributed Cloud Connected 上启用 VM Runtime on GDC 支持

默认情况下,VM Runtime on GDC 虚拟机支持在 Distributed Cloud Connected 上处于启用状态。如果您需要手动启用该功能,请完成本部分中的步骤。本部分中的说明假定您已拥有一个可正常运行的 Distributed Cloud Connected 集群。如需在集群中停用 VM Runtime on GDC 虚拟机支持,请撤消本部分中所述的更改。

如需在 GDC 虚拟机子系统上启用 VM Runtime,请完成以下步骤:

  1. 使用以下内容修改 VMRuntime 自定义资源,并将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      annotations:
        baremetal.cluster.gke.io/vmrumtime-force-disable: "false"
        vm.cluster.gke.io/enable-vm-backup: "true"
    spec:
      enabled: true
      storage:
        defaultStorageClass: robin-block-immediate
    haPolicy:
      defaultRecoveryStrategy: Reschedule
      nodeHeartbeatInterval: 15s
      nodeMonitorGracePeriod: 55s

    此过程通常需要几分钟才能完成。

  2. 使用以下命令验证 VMRuntime 自定义资源是否已应用于集群:

    kubectl get vmruntime
    

    该命令会返回类似于以下示例的输出:

    NAME        AGE   ENABLED   READY   PREFLIGHTCHECK
    vmruntime   5m   true      true    true
    
  3. 使用以下内容修改 robin-block-immediate 存储类的 storageprofile,并将其应用到您的集群:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: robin-block-immediate
    spec:
      claimPropertySets:
        accessModes:
          ReadWriteMany
      volumeMode: Block

安装 virtctl 管理工具

您需要使用 virtctl 客户端工具来管理 Distributed Cloud connected 集群上的虚拟机。如需安装该工具,请完成以下步骤:

  1. kubectl 插件的形式安装 virtctl 客户端工具:

    export VERSION=v0.59.0-anthos1.28-gke.8
    gcloud storage cp gs://anthos-baremetal-release/virtctl/${VERSION}/linux-amd64/virtctl/usr/local/bin/virtctl
    cd /usr/local/bin
    sudo ln -s virtctl kubectl-virt
    sudo chmod a+x virtctl
    cd -
  2. 验证 virt 插件是否已安装:

    kubectl plugin list

    如果插件已成功安装,则该命令的输出会将 kubectl-virt 列为其中一个插件。

为虚拟机映像创建 Cloud Storage 存储桶

完成本部分中的步骤,为虚拟机映像创建 Cloud Storage 存储桶。如果您已有已建立的映像库,请跳过此部分。

  1. 完成创建存储桶中的步骤,以创建存储桶。

  2. 使用以下命令配置服务账号和密钥,以便访问相应存储桶:

    export PROJECT_ID=$(gcloud config get-value project)
    gcloud iam service-accounts create image-access
    gcloud projects add-iam-policy-binding $PROJECT_ID \
      --member="serviceAccount:image-access@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role="roles/storage.objectViewer" \
    gcloud iam service-accounts keys create ./image-access-gcr.json \
      --iam-account="image-access@${PROJECT_ID}.iam.gserviceaccount.com"
  3. 在集群中创建一个用于访问相应存储桶的 Secret。如果您的存储桶是公开的,请跳过此步骤。 此密钥必须与您的虚拟机磁盘位于同一命名空间中。您必须在每个受影响的命名空间中创建一个 Secret。

    kubectl create secret generic gcs-image-sa --from-file=creds-gcp.json=./image-access-gcr.json -n NAMESPACE

    CLUSTER_ID 替换为目标命名空间的名称。

  4. 将图片存储在存储桶中。

通过虚拟机映像创建虚拟机磁盘

完成本部分中的步骤,以通过虚拟机映像创建虚拟机磁盘。

从存储在 Cloud Storage 中的映像创建磁盘

通过将以下配置应用于集群,从存储在 Cloud Storage 存储桶中的虚拟机创建虚拟机磁盘:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   source:
     gcs:
       url: gs://{PROJECT_ID}-vm-images/IMAGE_FILE
       secretRef: gcs-image-sa
   size: DISK_SIZE
   storageClassName: robin-block-immediate

替换以下内容:

  • DISK_NAME:相应虚拟机磁盘的名称。
  • NAMESPACE:目标命名空间。
  • IMAGE_FILE:虚拟机映像文件的名称。
  • DISK_SIZE:所需的磁盘大小。此值必须大于虚拟机映像文件的 virtual-size 值。您可以使用命令 qemu-img info DISK_SIZE 查找此值。

如果您未指定 storageClassName 值,系统会使用 VMRuntime 资源中指定的默认值。

通过现有磁盘映像创建磁盘

按如下方式从集群中的现有虚拟机磁盘或映像文件创建虚拟机磁盘。

  1. 通过将以下配置应用于集群来创建目标磁盘:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: IMAGE_DISK_NAME
      namespace: NAMESPACE
    spec:
      source:
        virtualMachineDisk:
          name: EXISTING_DISK_NAME
      size: DISK_SIZE
      storageClassName: robin-block-immediate

    替换以下内容:

    • IMAGE_DISK_NAME:相应虚拟机磁盘的名称。
    • NAMESPACE:目标命名空间。
    • EXISTING_DISK_NAME:现有虚拟机磁盘的名称。
    • DISK_SIZE:所需的磁盘大小。此值必须等于或大于现有磁盘或映像文件的大小。

    您可以使用 qemu-img 工具获取现有磁盘或映像文件的大小,如下所示:

    qemu-img info EXISTING_DISK_NAME

    如果您未指定 storageClassName 值,系统会使用 VMRuntime 资源中指定的默认值。

  2. 通过将以下配置应用到集群,根据现有映像文件创建新磁盘:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
      namespace: NAMESPACE
    spec:
      source:
        virtualMachineDisk:
          name: IMAGE_DISK_NAME
      size: DISK_SIZE
      storageClassName: robin-block-immediate

    替换以下内容:

    • IMAGE_DISK_NAME:您在上一步中创建的虚拟机磁盘的名称。
    • NAMESPACE:目标命名空间。
    • DISK_SIZE:所需的磁盘大小。必须等于您在上一步中创建的虚拟机磁盘的大小。
  3. 使用以下命令将目标磁盘调整为所需大小:

    kubectl edit gdisk DISK_NAME -n NAMESPACE

    替换以下内容:

    • DISK_NAME:您在上一步中创建的虚拟机磁盘的名称。
    • NAMESPACE:目标命名空间。
  4. 修改磁盘配置中的 spec.size 值,并将其应用于集群。

创建空磁盘

通过将以下配置应用于集群,创建一个空的虚拟机磁盘:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   size: DISK_SIZE
   storageClassName: robin-block-immediate

替换以下内容:

  • DISK_NAME:相应虚拟机磁盘的名称。
  • NAMESPACE:目标命名空间。
  • DISK_SIZE:所需的磁盘大小(以吉比字节为单位)。此值必须大于虚拟机映像文件的 virtual-size 值。您可以使用命令 qemu-img info DISK_SIZE 查找此值。

如果您未指定 storageClassName 值,系统会使用 VMRuntime 资源中指定的默认值。

配置虚拟网络

按照网络中的步骤为虚拟机配置虚拟网络。

创建虚拟机

完成本部分中的步骤,在 Distributed Cloud Connected Server 部署中创建虚拟机。本部分中的说明是示例,旨在说明不同场景的配置。如需详细了解如何配置虚拟机,请参阅使用 VM Runtime on GDC 创建具有特定 CPU 和内存资源的虚拟机

使用 Google Cloud 控制台创建虚拟机

如需使用 Google Cloud 控制台创建虚拟机,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请登录:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的弹出式对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往 Virtual Machines

  5. 点击创建

  6. 基本信息部分,执行以下操作:

    1. 名称字段中,输入虚拟机的有意义的名称。

    2. 选择集群字段中,选择虚拟机的目标集群。

    3. 命名空间字段中,选择目标命名空间。

    4. 操作系统类型字段中,选择目标操作系统。

    5. (可选)如果您想向此虚拟机的配置添加一个或多个标签,请点击添加标签

  7. 机器配置部分中,执行以下操作之一:

    • 如果您想为此虚拟机指定 vCPU 数量和内存量,请选择自定义配置,然后输入目标值,再点击下一步

    • 如果您想为此虚拟机使用预定数量的 vCPU 和内存,请选择标准配置,然后从机器类型下拉列表中选择一种机器配置,再点击下一步

  8. 存储部分中,执行以下操作之一:

    • 如果您想为此虚拟机创建新的虚拟磁盘,请选择添加新磁盘,然后在名称字段中输入有意义的名称,在 GiB 字段中输入大小(以 GB 为单位),并在映像字段中输入网址。

    • 如果您想为此虚拟机使用现有虚拟磁盘,请选择选择现有磁盘,然后从选择磁盘下拉列表中选择目标磁盘映像。

    • 使用只读自动删除复选框,指定您是否希望磁盘为只读,以及在删除此虚拟机时是否自动删除磁盘。

    • 驱动程序下拉列表中指定虚拟磁盘驱动程序。

    • 如需向此虚拟机添加其他磁盘,请点击额外磁盘部分中的添加磁盘

    • 点击下一步

  9. 网络部分中,执行以下操作:

    1. 默认网络接口子部分中,在接口名称字段中指定相应虚拟机的默认网络接口的名称。

    2. 网络类型下拉列表中选择相应的网络类型。

    3. 使用允许外部访问复选框指定是否允许外部访问此网络接口。如果您启用此选项,则必须在公开的端口字段中输入以英文逗号分隔的要向外部公开的端口列表。

    4. 如果您想向此虚拟机添加一个或多个次要网络接口,请点击添加网络接口

    5. 点击下一步

  10. 高级选项部分中,使用在更新时自动重启复选框指定在目标集群上
    分布式云连接软件更新后是否重启此虚拟机。

  11. 固件部分中,执行以下操作:

    1. Bootloader 类型字段中,选择目标固件类型。如果您选择 UEFI 固件,则可以选择使用安全启动复选框来启用安全启动。

    2. 在“序列号”字段中为此虚拟机指定一个序列号

    3. UUID 字段中为此虚拟机指定通用唯一标识符 (UUID)。

  12. Cloud-init 部分中,执行以下操作:

    • 网络数据 Secret 字段中指定网络数据 Secret 值。

    • 用户数据密钥字段中指定用户数据密钥值。

  13. 点击创建虚拟机以创建虚拟机。

通过 YAML 文件创建虚拟机

如需通过 YAML 配置文件创建虚拟机,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请登录:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的弹出式对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往 Virtual Machines

  5. 点击 CREATE WITH YAML

  6. 选择集群字段中,选择虚拟机的目标集群。

  7. 将 YAML 格式的虚拟机配置粘贴到 YAML 字段中。

  8. 点击创建

通过可启动的磁盘映像创建虚拟机

如需从可启动的磁盘映像创建虚拟机,请将以下配置应用于集群:

kind: VirtualMachine
metadata:
  name: my-virtual-machine
  namespace: my-vm-namespace
spec:
  osType: Linux/Windows
  guestEnvironment: {} // comment out this line to enable guest environment for access management
  autoRestartOnConfigurationChange: true 
  compute:
    cpu:
      vcpus: 6
    memory:
      capacity: 8Gi
  interfaces:
      - name: eth0
        networkName: network-410
        ipAddresses:
        - 10.223.237.10/25
  disks:
    - virtualMachineDiskName: my-boot-disk
      boot: true
    - virtualMachineDiskName: my-data-disk

替换以下内容:

  • DISK_NAME:相应虚拟机磁盘的名称。
  • NAMESPACE:目标命名空间。

通过 ISO 光盘映像创建虚拟机

如需通过 ISO 光盘映像创建虚拟机,请完成通过 Google Distributed Cloud 中的 ISO 映像创建 Windows 虚拟机中的步骤。

创建支持 GPU 的虚拟机

完成本页面中所述的步骤,创建配置符合您业务需求的虚拟机,然后完成配置虚拟机以使用 GPU 资源中的步骤。

访问虚拟机

完成本部分中的步骤,以访问在 Distributed Cloud 连接的服务器部署上运行的虚拟机。

获取访问凭据

完成本部分中的步骤,以获取使用 Linux 访客环境功能访问虚拟机所需的凭据。

  1. 通过将以下配置应用于集群,为目标虚拟机启用 Linux 访客环境:

    kind: VirtualMachine
    metadata:
     name: my-virtual-machine
     namespace: my-vm-namespace
    spec:
     osType: Linux
     guestEnvironment: {}
     autoRestartOnConfigurationChange: true 
  2. 使用以下命令生成一个包含 SSH 密钥对的 id_rsa.pub 文件:

    ssh-keygen -t rsa
  3. 通过将以下配置应用于集群,创建 VirtualMachineAccessRequest 资源:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachineAccessRequest
    metadata:
     name: RESOURCE_NAME
     namespace: NAMESPACE
    spec:
      vm: VM_NAME
      user: USER_NAME
      ssh:
        key: RSA_KEY
        ttl: 2h

替换以下内容:

  • RESOURCE_NAME:此虚拟机访问请求资源的描述性名称。
  • NAMESPACE:目标命名空间。
  • VM_NAME:目标虚拟机的名称。
  • USER_NAME:要向其授予访问权限的用户的名称。
  • RSA_KEY:您在上一步中生成的 id_rsa.pub 文件的内容。
  1. 使用以下命令检查访问权限请求的状态:

    kubectl get vmar
    

    当命令返回 Configured 状态时,请继续执行下一步。

  2. 通过 SSH 或远程桌面访问虚拟机:

    • 如果虚拟机已连接到本地网络,您可以直接访问该虚拟机。
    • 如果虚拟机连接到 Pod 网络,您必须创建负载均衡器服务才能访问所需的端口。

启动、重启或停止虚拟机

使用以下命令启动、重启或停止虚拟机:

  • 启动虚拟机kubectl virt start vmVM_NAME-nNAMESPACE
  • 重启虚拟机kubectl virt restart vmVM_NAME-nNAMESPACE
  • 停止虚拟机kubectl virt stop vmVM_NAME-nNAMESPACE

替换以下内容:

  • VM_NAME:目标虚拟机的名称。
  • NAMESPACE:目标命名空间。

使用 Google Cloud 控制台启动或停止虚拟机

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请登录:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往 Virtual Machines

  5. 在虚拟机列表中,选中目标虚拟机对应的复选框。

  6. 根据需要,点击页面顶部的开始停止

使用 Google Cloud 控制台查看虚拟机的状态

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请登录:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的弹出式对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往 Virtual Machines

  5. 点击目标虚拟机。

  6. 在随即显示的页面中,点击详情事件YAML 标签页,查看有关此虚拟机的相应信息。

修改虚拟机

如需修改虚拟机,您必须将其删除,然后使用更新后的配置重新创建虚拟机。

使用 Google Cloud 控制台删除虚拟机

  1. 在 Google Cloud 控制台中,前往集群页面。

    转到集群

  2. 选择目标 Google Cloud 项目。

  3. (可选)如果您尚未登录目标集群,请登录:

    1. 在左侧导航窗格中,点击集群

    2. Anthos 管理的集群列表中,点击目标集群。

    3. 在右侧的信息窗格中,点击登录

    4. 在随即显示的对话框中,选择您的首选身份验证方法,输入您的凭据,然后点击登录

  4. 前往虚拟机页面。

    前往 Virtual Machines

  5. 在虚拟机列表中,选中目标虚拟机对应的复选框。

  6. 点击页面顶部的删除

  7. 在随即显示的确认对话框中,输入虚拟机的名称,然后点击删除

备份虚拟机

本部分介绍了如何配置环境以备份虚拟机工作负载,以及如何管理备份。如需启用此功能,请与您的 Google 代表联系。

前提条件

  1. 如果您尚未创建 robin-block-immediate 自定义资源,请创建类型为 StorageClass 的自定义资源,其中包含以下内容,然后将其应用于您的集群:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: robin-block-immediate
     annotations:
       storageclass.kubernetes.io/is-default-class: "true"
    parameters:
     faultdomain: host
     replication: "3"
     blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
  2. 如果您尚未创建 robin-snapshotclass 类型的自定义资源,请创建一个包含以下内容的自定义资源,并将其应用于您的集群:VolumeSnapshotClass

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
     name: robin-snapshotclass
     labels:
       app.kubernetes.io/instance: robin
       app.kubernetes.io/managed-by: robin.io
       app.kubernetes.io/name: robin
     annotations:
       snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete

创建在线备份仓库

在线备份存储库是与 S3 兼容的在线存储位置,用于存储虚拟机备份。 它还存储备份、备份方案、恢复方案的记录,并充当恢复虚拟机备份的目标位置。

完成以下步骤,为您的虚拟机创建在线备份代码库:

  1. 按照创建存储分区中的说明创建 Cloud Storage 存储桶。

  2. 使用以下命令创建服务账号和密钥,以便访问相应存储桶:

    export PROJECT_ID=$(gcloud config get-value project)
    export SVC_ACCOUNT=backup-access
    gcloud iam service-accounts create $SVC_ACCOUNT
    gcloud projects add-iam-policy-binding $PROJECT_ID \ 
       --member="serviceAccount:${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/backupdr.cloudStorageOperator"
    gcloud storage hmac create  ${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com > hmac_temp_key_file
    awk 'NR==1{print "ACCESS_ID=" $NF} NR==2{print "SECRET=" $NF}' < hmac_temp_key_file > hmac_key_file
  3. 使用以下命令配置用于访问备份存储桶的 Secret:

    source ./hmac_key_file
    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=$SECRET \
       --from-literal=access-key-id=$ACCESS_ID -n NAMESPACE
    

    替换以下内容:

    • SECRET_NAME:相应 Secret 的描述性名称。
    • NAMESPACE:目标命名空间。
  4. 创建 BackupRepository 资源,并将以下配置应用于您的集群:

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: "REPOSITORY_NAME"
    spec:
      secretReference:
        namespace: NAMESPACE
        name: gcs-hmac-secret
      endpoint: "https://storage.googleapis.com"
      type: "S3"
      s3Options:
        bucket: "BUCKET_NAME"
        region: "REGION"
        forcePathStyle: true
      importPolicy: "ReadWrite"
    # Force attachment for convenience.
    force: true

    替换以下内容:

    • REPOSITORY_NAME:代码库的描述性名称。
    • BUCKET_NAME:备份存储桶的名称。
    • NAMESPACE:目标命名空间。
    • REGION:目标分布式云集群已创建的 Google Cloud 区域。
  5. 使用以下命令验证集群是否可以访问备份存储库:

    kubectl get BackupRepository
    

创建本地备份仓库

本地备份代码库是与 S3 兼容的存储位置,用于存储虚拟机备份,位于已连接 Distributed Cloud 的集群本地。本地备份代码库在功能上与在线备份代码库完全相同。

  1. 生成一个 AES256 加密密钥,用于应用级配置加密:

    openssl rand -base64 32
    

    该命令会输出一个 base64 编码的随机 256 位密钥。例如:

    aBcD_eFgH1iJkLmN0pQrStUvWxFyZgAhIjKlMnOpQ=
    
  2. 对密钥进行双重编码,以用作 BackupRepository 资源的 YAML 配置中的载荷:

    echo -n "AES_KEY" | base64
    

    AES_KEY 替换为您在上一步中生成的 base64 编码 AES256 密钥。将此密钥存储在本地文件中。

  3. 使用以下命令配置用于访问备份存储库的 Secret:

    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=ENCODED_AES_KEY \
       --namespace NAMESPACE
    

    替换以下内容:

    • ENCODED_AES_KEY:您在上一步中生成的双重编码 AES256 密钥。
    • SECRET_NAME:相应 Secret 的描述性名称。
    • NAMESPACE:目标命名空间。
  4. 通过将以下配置应用于集群来配置 BackupRepository

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: REPOSITORY_NAME
    spec:
      force: true
      importPolicy: ReadWrite
      localOptions:
        encryptionKey:
          name: SECRET_NAME
          namespace: NAMESPACE
      type: Local
  5. 使用以下命令验证集群是否可以访问备份存储库:

    kubectl get BackupRepository
    

    替换以下内容:

    • REPOSITORY_NAME:代码库的描述性名称。
    • SECRET_NAME:您在上一步中创建的 Kubernetes Secret 的名称。
    • NAMESPACE:您创建 Kubernetes Secret 的命名空间。

创建备份方案

备份方案用于定义运行虚拟机备份的自动化时间表。创建一个包含以下内容的 VirtualMachineBackupPlan 资源,并将其应用于您的集群:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineBackupPlan
metadata:
  name: BACKUP_PLAN_NAME
  namespace: NAMESPACE
spec:
  backupConfig:
    backupRepository: REPOSITORY_NAME
    backupScope:
      selectedVirtualMachines:
      - resourceName: VM_NAME
    volumeStrategy: LocalSnapshotOnly
  backupSchedule:
    cronSchedule: "CRON_SCHEDULE"
    paused: PAUSED
  retentionPolicy:
    backupDeleteLockDays: PLAN_LOCK_LENGTH
    backupRetainDays: 4
    locked: RETENTION_POLICY_LOCKED
  numBackupsToRetain: BACKUPS_RETAINED

替换以下内容:

  • BACKUP_PLAN_NAME:备份方案的描述性名称。
  • NAMESPACE:目标命名空间的名称。
  • REPOSITORY_NAME:目标备份仓库。
  • CRON_SCHEDULEcron- 用于运行备份的标准时间表。 备份之间的最短允许间隔为 10 分钟。
  • PAUSED:指定相应备份方案是否已暂停。有效值为 truefalse
  • VM_NAME:指定要通过此备份方案备份的虚拟机工作负载。您可以为每个备份方案指定多个虚拟机资源。
  • * BACKUP_LOCK_LENGTH:指定自备份创建之日起,无法删除备份的天数。
  • * BACKUP_RETENTION_LENGTH:指定保留相应备份的天数。 保留期限结束后,系统会删除相应备份。如果省略,则默认为 4
  • * RETENTION_POLICY_LOCKED:指定相应备份方案的保留政策是否已锁定。有效值为 truefalse
  • * BACKUPS_RETAINED/var>:指定此备份方案中要保留的备份数量。 达到此阈值后,系统会按从旧到新的顺序删除备份。

列出现有备份方案

如需列出现有备份方案,请使用以下命令:

kubectl get VirtualMachineBackupPlans -A

该命令会返回类似于以下内容的输出:

NAMESPACE      NAME                                LASTBACKUPTIME   LASTBACKUPSTATE   NEXTBACKUPTIME   PAUSED
vm-workloads   bkp-template-vm-windows-vm-local
vm-workloads   sched-snapshotonly-bkp-plan-10min                                                       false

手动备份虚拟机

完成本部分中的步骤,以手动备份虚拟机。

  1. 通过将以下配置应用于集群,在目标虚拟机所在的命名空间中创建 VirtualMachineBackupPlanTemplate 资源:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupPlanTemplate
    metadata:
      name: TEMPLATE_NAME
      namespace: NAMESPACE
    spec:
      backupRepository: REPOSITORY_NAME

    替换以下内容:

    • TEMPLATE_NAME:此备份模板的描述性名称。
    • REPOSITORY_NAME:目标备份代码库的名称。
    • NAMESPACE:目标命名空间。
  2. 通过创建具有以下配置的 VirtualMachineBackupRequest 资源并将其应用于集群来触发备份:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupRequest
    metadata:
      name: BACKUP_REQUEST_NAME
      namespace: NAMESPACE
    spec:
      vmBackupPlanTemplate: TEMPLATE_NAME
      virtualMachine: VM_NAME
      vmBackupName: BACKUP_NAME

    替换以下内容:

    • BACKUP_REQUEST_NAME:此备份请求的描述性名称。
    • TEMPLATE_NAME:您在上一步中创建的备份模板的名称。
    • NAMESPACE:目标命名空间的名称。
    • VM_NAME:目标虚拟机的名称。
    • BACKUP_NAME:此备份的描述性名称。
  3. 使用以下命令验证备份的完整性:

    kubectl get vmbackup BACKUP_NAME -n NAMESPACE
    

    替换以下内容:

    • BACKUP_NAME:目标备份的名称。
    • NAMESPACE:目标命名空间。

    该命令会返回类似于以下内容的输出:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackup
    metadata:
      creationTimestamp: "2024-04-09T17:57:44Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-backup-finalizer
      generation: 1
      name: vmt13-backup-0409-2
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Backup
        name: vmt13-backup-0409-2
        uid: 0ee0b92c-1e27-48cc-8f8f-5606ea925e88
      resourceVersion: "36192759"
      uid: e471f8c7-637c-485f-acda-108017a5638f
    spec:
      backupConfig:
        backupRepository: default
        backupScope:
          selectedVirtualMachines:
          - resourceName: vm-t13
        volumeStrategy: Portable
      vmBackupPlan: MyVmPlan-vm-vm-t13-portable
    status:
      backedUpVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      backedUpVirtualMachines:
      - vm-t13
      backup: vmt13-backup-0409-2
      backupStatus:
        clusterMetadata:
          k8sVersion: "1.28"
        completeTime: "2024-04-09T18:07:36Z"
        createTime: "2024-04-09T17:57:44Z"
        jobCreated: true
        resourceCount: 849
        sizeBytes: 1948672
        state: Succeeded
    

列出虚拟机备份

如需查看现有的虚拟机备份,请使用以下命令:

kubectl get VirtualMachineBackups -A

该命令会返回类似于以下内容的输出:

NAMESPACE      NAME        STATE       CREATETIME
vm-workloads   vm-backup   Succeeded   2025-04-08T04:37:32Z

从备份恢复虚拟机

如需从备份中恢复虚拟机,请完成本部分中的步骤。

  1. 通过创建具有以下配置的 VirtualMachineRestoreRequest 资源并将其应用于集群,来触发恢复流程:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestoreRequest
    metadata:
      name: restore-req
      namespace: NAMESPACE
    spec:
      vmBackup: BACKUP_NAME
      restoreName: RESTORE_NAME
      restoredResourceName: RESTORED_VM_NAME
      restoredResourceDescription: RESTORE_DESCRIPTION

    替换以下内容:

    • BACKUP_NAME:目标备份的名称。
    • RESTORE_NAME:相应恢复操作的描述性名称。
    • NAMESPACE:目标命名空间。
    • RESTORED_VM_NAME:恢复期间为虚拟机指定的名称。 此名称不得与集群中已有的任何虚拟机冲突。
    • RESTORE_DESCRIPTION:相应恢复操作的说明。
  2. 使用以下命令检查恢复操作的进度:

    kubectl get virtualmachinerestores.vm.cluster.gke.io RESTORE_NAME -n NAMESPACE
    

    替换以下内容:

    • RESTORE_NAME:目标恢复操作的名称。
    • NAMESPACE:目标命名空间。

    该命令会返回类似于以下内容的输出:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestore
    metadata:
      creationTimestamp: "2024-04-09T18:09:51Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-restore-finalizer
      generation: 1
      name: vmt13-restore-0409-2-1
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Restore
        name: vmt13-restore-0409-2-1
        uid: 4ce1ca83-eba0-4cc3-bad3-af6cf9185d7d
      resourceVersion: "36194596"
      uid: aba50b59-e18d-4687-ad11-47baa45478b4
    spec:
      targetVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      targetVirtualMachines:
      - vm-t13
      vmBackup: vmt13-backup-0409-2
    status:
      restore: vmt13-restore-0409-2-1
      restoreStatus:
        completeTime: "2024-04-09T18:10:00Z"
        jobCreated: true
        resourcesRestoredCount: 5
        restoredVolumesCount: 2
        startTime: "2024-04-09T18:09:51Z"
        state: Succeeded
        stateReason: restore is successful
    

查看恢复操作

如需查看迄今为止已启动的恢复操作,请使用以下命令:

kubectl get VirtualMachineRestore.vm.cluster.gke.io -A

该命令会返回类似于以下内容的输出:

NAMESPACE      NAME        STARTTIME              RESTORE     STATE
vm-workloads   restore-1   2025-04-08T04:41:04Z   restore-1   Succeeded

删除虚拟机备份

如需删除虚拟机备份,请创建具有以下配置的 VirtualMachineDeleteBackupRequest 资源,并将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDeleteBackupRequest
    metadata:
      name: vmdbr
      namespace: BACKUP_NAME
    spec:
      vmBackup: NAMESPACE
   

替换以下内容:

  • NAMESPACE:目标命名空间的名称。
  • BACKUP_NAME:目标备份的名称。

查看 AppArmor 沙盒审核日志

分布式云会自动使用 audit-mode 中的 AppArmor 政策对虚拟机工作负载进行沙盒处理。发生政策违规时,系统会发出一条审核日志条目。例如:

{
  "jsonPayload": {
    "_SOURCE_REALTIME_TIMESTAMP": "1734596844149104",
    "SYSLOG_TIMESTAMP": "Dec 19 08:27:24 ",
    "MESSAGE": "type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"",
    "PRIORITY": "6",
    ...
    "SYSLOG_RAW": "<14>Dec 19 08:27:24 audisp-syslog: type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"\n",
    "SYSLOG_IDENTIFIER": "audisp-syslog",
    "_GID": "0",
  },
  "timestamp": "2024-12-19T08:27:24.149109Z",
  "labels": {
    "gke.googleapis.com/log_type": "system"
  },
  "receiveTimestamp": "2024-12-19T08:27:24.721842807Z"
  ...
  ...
}

后续步骤