管理 Distributed Cloud Connected 机架上的虚拟机

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

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

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

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

默认情况下,Distributed Cloud Connected 上的 VM Runtime on GDC 虚拟机支持处于停用状态。如需启用该功能,请完成本部分中的步骤。本部分中的说明假定您已拥有一个功能完善的 Distributed Cloud connected 集群。

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

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      # Enable Anthos VM Runtime support
      enabled: true
      # vmImageFormat defaults to "raw" if not set
      vmImageFormat: "raw"
      # Set node grace period to 55 seconds;
      haPolicy:
        defaultRecoveryStrategy: Reschedule
        nodeHeartbeatInterval: 15s
        nodeMonitorGracePeriod: 55s

    请勿更改 vmImageFormat 参数的值。 Distributed Cloud Connected 不支持任何其他虚拟磁盘格式。

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

    请勿更改 vmImageFormat 参数的值。 Distributed Cloud Connected 不支持任何其他虚拟磁盘格式。

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

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

    kubectl get vmruntime -o yaml

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

     - apiVersion: vm.cluster.gke.io/v1
       kind: VMRuntime
       metadata:
         name: vmruntime
         ...
       spec:
         enabled: true
         vmImageFormat: raw
       status:
         ...
       ready: true
         ...
    
  3. 使用以下命令验证您的集群是否已启用 VM Runtime on GDC 虚拟机支持:

    kubectl get pods -n vm-system

    该命令会返回输出,显示在集群上运行的 GDC 子系统 Pod 中的虚拟机运行时,类似于以下示例:

    NAME                                                READY   STATUS         RESTARTS        AGE
    cdi-apiserver-6c76c6cf7b-n68wn                      1/1     Running        0               132m
    cdi-deployment-f78fd599-vj7tv                       1/1     Running        0               132m
    cdi-operator-65c4df9647-fcb9d                       1/1     Running        0               134m
    cdi-uploadproxy-7765ffb694-6j7bf                    1/1     Running        0               132m
    macvtap-fjfjr                                       1/1     Running        0               134m
    virt-api-77dd99dbbb-bs2fb                           1/1     Running        0               132m
    virt-api-77dd99dbbb-pqc27                           1/1     Running        0               132m
    virt-controller-5b44dbbbd7-hc222                    1/1     Running        0               132m
    virt-controller-5b44dbbbd7-p8xkk                    1/1     Running        0               132m
    virt-handler-n76fs                                  1/1     Running        0               132m
    virt-operator-86565697d9-fpxqh                      2/2     Running        0               134m
    virt-operator-86565697d9-jnbt7                      2/2     Running        0               134m
    vm-controller-controller-manager-7844d5fb7b-72d8m   2/2     Running        0               134m
    vmruntime-controller-manager-845649c847-m78r9       2/2     Running        0               175m
    

安装 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 列为其中一个插件。

在 Distributed Cloud connected 上预配虚拟机

本部分提供了一些配置示例,展示了如何使用 Symcloud Storage 抽象层在已连接的分布式云集群上预配 Linux 虚拟机和 Windows 虚拟机。

请注意,您无法使用 kubectl virt 命令直接在 Distributed Cloud Connected 集群上创建虚拟机,因为 Distributed Cloud Connected 不会为虚拟机提供文件系统存储。

在完成本部分中的步骤之前,您必须先完成为 Symcloud Storage 配置 Distributed Cloud connected 中的步骤。如果您稍后在集群上停用 Symcloud Storage,则配置为使用 Symcloud Storage 的虚拟机将失败。

在 Distributed Cloud connected 上预配 Linux 虚拟机

以下示例展示了如何预配运行 Ubuntu Server 22.04 的 Linux 虚拟机和 Symcloud Storage。安装源是 Ubuntu Server 22.04 ISO 光盘映像。

  1. 为 Ubuntu Server 安装光盘映像创建一个包含以下内容的 VirtualMachineDisk 资源,然后将其应用于集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: ubuntu-iso-disk
    spec:
      size: 20Gi
      storageClassName: robin
      diskType: cdrom
      source:
        http:
          url: https://releases.ubuntu.com/jammy/ubuntu-22.04.3-live-server-amd64.iso
  2. 为虚拟机的虚拟硬盘创建一个包含以下内容的 VirtualMachineDisk 资源,然后将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: "ubuntu-main-disk"
    spec:
      size: 200Gi
      storageClassName: robin
  3. 创建包含以下内容的 VirtualMachineType 资源,以指定虚拟机的配置,然后将其应用于集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineType
    metadata:
      name: small-2-20
    spec:
      cpu:
        vcpus: 2
      memory:
        capacity: 20Gi
  4. 创建一个包含以下内容的 VirtualMachine 资源,该资源可在集群上实例化并启动虚拟机,然后将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: ubu-vm
      name: ubu-vm #  Propagate the virtual machine name to the VMI
    spec:
      osType: Linux
      compute:
        virtualMachineTypeName: small-2-20
      interfaces:
        - name: eth0
          networkName: my-network
          default: true
      disks:
        - virtualMachineDiskName: ubuntu-main-disk
          boot: true
        - virtualMachineDiskName: ubuntu-iso-disk

    您还必须在集群上配置以下功能:

  5. 在虚拟机上安装 Ubuntu Server:

    1. 等待 importer Pod 下载 Ubuntu Server 安装光盘映像。
    2. 检查虚拟机的状态:

      kubectl get gvm VM_NAME

      VM_NAME 替换为虚拟机的名称,在本例中为 ubu-vm

    3. 使用 SSH 或远程桌面登录虚拟机。

    4. 完成 Ubuntu Linux 安装步骤。

  6. 清理:

    1. 停止虚拟机:

      kubectl virt stop VM_NAME

      VM_NAME 替换为虚拟机的名称,在本例中为 ubu-vm

    2. 修改虚拟机的 YAML 文件,以移除对安装光盘映像的引用:

      kubectl edit gvm VM_NAME

      VM_NAME 替换为虚拟机的名称,在本例中为 ubu-vm

    3. 启动虚拟机:

      kubectl virt start VM_NAME

      VM_NAME 替换为虚拟机的名称,在本例中为 ubu-vm

    4. 删除安装光盘映像的 VirtualMachineDisk 资源:

      kubectl delete virtualmachinedisk ubuntu-iso-disk

在 Distributed Cloud Connected 上预配 Windows 虚拟机

以下示例展示了如何使用 Symcloud Storage 预配 Windows 虚拟机。这些步骤与预配 Linux 虚拟机类似,但需要额外添加 virtio 驱动程序磁盘映像,这是安装 Windows 所必需的。

  1. 获取 Windows 的许可副本及其安装介质映像。

  2. 为 Windows 安装光盘映像创建一个包含以下内容的 VirtualMachineDisk 资源,然后将其应用于集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: windows-iso-disk
      namespace: default
    spec:
      size: 5Gi
      storageClassName: robin
      diskType: cdrom
      source:
        http:
          url: WINDOWS_ISO_URL

    NAT_GATEWAY 替换为目标 Windows 安装 ISO 光盘映像的完整网址。

  3. virtio 驱动程序创建一个包含以下内容的 VirtualMachineDisk 资源,然后将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: windows-virtio-driver
      namespace: default
    spec:
      size: 1Gi
      storageClassName: robin
      diskType: cdrom
      source:
        http:
          url: https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
  4. 为虚拟机的虚拟硬盘创建一个包含以下内容的 VirtualMachineDisk 资源,然后将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: windows-main-disk
      namespace: default
    spec:
      size: 15Gi
      storageClassName: robin
  5. 创建包含以下内容的 VirtualMachineType 资源,以指定虚拟机的配置,然后将其应用于集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineType
    metadata:
      name: small-2-20
    spec:
      cpu:
        vcpus: 2
      memory:
        capacity: 20Gi
  6. 创建一个包含以下内容的 VirtualMachine 资源,该资源可在集群上实例化并启动虚拟机,然后将其应用于您的集群:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: win-vm
      name: win-vm #  Propagate the virtual machine name to the VMI
    spec:
      osType: Windows
      compute:
        virtualMachineTypeName: my-vmt
      interfaces:
        - name: eth0
          networkName: my-network
          default: true
      disks:
        - virtualMachineDiskName: windows-main-disk
          boot: true
        - virtualMachineDiskName: windows-iso-disk
        - virtualMachineDiskName: win-virtio-driver

    您还必须在集群上配置以下功能:

  7. 在虚拟机上安装 Windows:

    1. 等待 importer Pod 下载 Windows 安装光盘映像。
    2. 检查虚拟机的状态:

      kubectl get gvm VM_NAME

      VM_NAME 替换为虚拟机的名称,在本例中为 win-vm

    3. 按照连接到 Windows 虚拟机并完成操作系统安装中的步骤完成 Windows 安装。

  8. 清理:

    1. 停止虚拟机:

      kubectl virt stop VM_NAME

      VM_NAME 替换为虚拟机的名称,在本例中为 win-vm

    2. 完成分离 ISO 映像和驱动程序磁盘中的步骤。

管理在 Distributed Cloud Connected 上运行的虚拟机

如需查看有关管理在 Distributed Cloud Connected 上运行的虚拟机的说明,请参阅以下 VM Runtime on GDC 文档:

如需管理在 Distributed Cloud Connected 上运行的虚拟机,您必须先配置 kubectl 连接

在 Distributed Cloud Connected 上停用 VM Runtime on GDC

按照本部分中的步骤操作,可在 Distributed Cloud Connected 上停用 VM Runtime on GDC。在已连接的 Distributed Cloud 上停用 VM Runtime on GDC 之前,您必须停止并删除已连接的 Distributed Cloud 集群上的所有虚拟机,如删除虚拟机中所述。

如需在 Distributed Cloud Connected 上停用 VM Runtime on GDC,请修改 VMRuntime 自定义资源,将 enabled spec 参数设置为 false,如下所示,然后将其应用到您的集群:

apiVersion: vm.cluster.gke.io/v1
kind: VMRuntime
metadata:
  name: vmruntime
spec:
  # Disable Anthos VM Runtime
  enabled: false
  # vmImageFormat defaults to "raw" if not set
  vmImageFormat: "raw"

查看 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"
  ...
  ...

后续步骤