10.8. 访问虚拟机控制台

OpenShift Virtualization 提供不同的虚拟机控制台,您可使用这些控制台来完成不同的产品任务。您可以使用 CLI 命令通过 OpenShift Container Platform Web 控制台和访问这些控制台。

注意

目前不支持运行到单个虚拟机的并发 VNC 连接。

10.8.1. 在 OpenShift Container Platform web 控制台中访问虚拟机控制台

您可以使用 OpenShift Container Platform web 控制台中的串口控制台或 VNC 控制台连接至虚拟机。

您可以使用 OpenShift Container Platform Web 控制台中的 desktop viewer 控制台(使用 RDP(远程桌面协议)连接到 Windows 虚拟机。

10.8.1.1. 连接至串行控制台

从 web 控制台的 VirtualMachine 详情页中的 Console 选项卡连接至正在运行的虚拟机的串行控制台。

步骤

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. 点击 Console 选项卡。默认会打开 VNC 控制台。
  4. Disconnect 以确保一次只打开一个控制台会话。否则,VNC 控制台会话会在后台保持活跃。
  5. 点击 VNC Console 下拉菜单并选择 Serial Console
  6. Disconnect 结束控制台会话。
  7. 可选:点 Open Console in New Window 在一个单独的窗口中打开串口控制台。

10.8.1.2. 连接至 VNC 控制台

从 web 控制台的 VirtualMachine 详情页中的 Console 选项卡连接至正在运行的虚拟机的 VNC 控制台。

步骤

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. 点击 Console 选项卡。默认会打开 VNC 控制台。
  4. 可选:点 Open Console in New Window 在一个单独的窗口中打开 VNC 控制台。
  5. 可选:点 Send Key 将密钥组合发送到虚拟机。
  6. 点控制台窗口外,然后点 Disconnect 结束会话。

10.8.1.3. 通过 RDP 连接至 Windows 虚拟机

Desktop viewer 控制台利用远程桌面协议 (RDP),为连接至 Windows 虚拟机提供更好的控制台体验。

要使用 RDP 连接至 Windows 虚拟机,请从 web 控制台上 Virtual Machine Details 屏幕中的 Consoles 选项卡下载虚拟机的 console.rdp 文件,并将其提供给您首选的 RDP 客户端。

先决条件

  • 正在运行的 Windows 虚拟机装有 QEMU 客户机代理。VirtIO 驱动程序中包含 qemu-guest-agent
  • 与 Windows 虚拟机处于相同网络的机器上装有 RDP 客户端。

步骤

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 点 Windows 虚拟机打开 VirtualMachine 详情页。
  3. 点击 Console 选项卡。
  4. 从控制台列表中,选择 Desktop viewer
  5. 点击 Launch Remote Desktop 下载 console.rdp 文件。
  6. 参考您首选的 RDP 客户端中的 console.rdp 文件,以连接到 Windows 虚拟机。

10.8.1.4. 在虚拟机间切换显示

如果您的 Windows 虚拟机附加了 vGPU,您可以使用 web 控制台在默认显示和 vGPU 显示间切换。

先决条件

  • 介质设备在 HyperConverged 自定义资源中配置,并分配给虚拟机。
  • 虚拟机正在运行。

步骤

  1. 在 OpenShift Container Platform 控制台中点 VirtualizationVirtualMachines
  2. 选择 Windows 虚拟机以打开 Overview 屏幕。
  3. 点击 Console 选项卡。
  4. 从控制台列表中,选择 VNC 控制台
  5. Send Key 列表选择适当的组合:

    1. 要访问默认虚拟机显示,请选择 Ctl + Alt+ 1
    2. 要访问 vGPU 显示,请选择 Ctl + Alt + 2

其他资源

10.8.1.5. 使用 Web 控制台复制 SSH 命令

复制命令,以通过 SSH 连接到虚拟机 (VM) 终端。

步骤

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 点虚拟机的 Options 菜单 kebab ,然后选择 Copy SSH 命令
  3. 将其粘贴到终端中以访问虚拟机。

10.8.2. 使用 CLI 命令访问虚拟机控制台

10.8.2.1. 使用 virtctl 通过 SSH 访问虚拟机

您可使用 virtctl ssh 命令,使用本地 SSH 客户端将 SSH 流量转发到虚拟机 (VM)。如果您之前使用虚拟机配置了 SSH 密钥身份验证,请跳至步骤 2,因为不需要第 1 步。

注意

control plane 上的高 SSH 流量可能会减慢 API 服务器的速度。如果您定期需要大量连接,请使用专用的 Kubernetes Service 对象来访问虚拟机。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 已安装 virtctl 客户端。
  • 您要访问的虚拟机正在运行。
  • 您与虚拟机位于同一个项目中。

步骤

  1. 配置 SSH 密钥身份验证:

    1. 使用 ssh-keygen 命令生成 SSH 公钥对:

      $ ssh-keygen -f <key_file> 1
      1
      指定要存储密钥的文件。
    2. 创建一个 SSH 身份验证 secret,其中包含用于访问虚拟机的 SSH 公钥:

      $ oc create secret generic my-pub-key --from-file=key1=<key_file>.pub
    3. VirtualMachine 清单中添加对 secret 的引用。例如:

      apiVersion: kubevirt.io/v1
      kind: VirtualMachine
      metadata:
        name: testvm
      spec:
        running: true
        template:
          spec:
            accessCredentials:
            - sshPublicKey:
                source:
                  secret:
                    secretName: my-pub-key 1
                propagationMethod:
                  configDrive: {} 2
      # ...
      1
      对 SSH 身份验证 Secret 对象的引用。
      2
      SSH 公钥使用 configDrive 供应商以 cloud-init 元数据的形式注入虚拟机。
    4. 重启虚拟机以应用您的更改。
  2. 通过 SSH 连接到虚拟机:

    1. 运行以下命令通过 SSH 访问虚拟机:

      $ virtctl ssh -i <key_file> <vm_username>@<vm_name>
    2. 可选: 要安全地向虚拟机或虚拟机传输文件,请使用以下命令:

      将文件从机器复制到虚拟机

      $ virtctl scp -i <key_file> <filename> <vm_username>@<vm_name>:

      将文件从虚拟机复制到您的机器中

      $ virtctl scp -i <key_file> <vm_username@<vm_name>:<filename> .

10.8.2.2. 使用 OpenSSH 和 virtctl port-forward

您可以使用本地 OpenSSH 客户端和 virtctl port-forward 命令连接到正在运行的虚拟机 (VM)。您可以将此方法与 Ansible 配合使用,以自动配置虚拟机。

对于低流量应用程序,建议使用这个方法,因为端口转发流量通过 control plane 发送。对于 Rsync 或 Remote Desktop 协议等高流量应用程序(如 Rsync 或 Remote Desktop 协议)使用这个方法,因为它对 API 服务器造成大量负担。

先决条件

  • 已安装 virtctl 客户端。
  • 您要访问的虚拟机正在运行。
  • 安装 virtctl 工具的环境具有访问虚拟机所需的集群权限。例如,运行 oc login 或设置了 KUBECONFIG 环境变量。

流程

  1. 在客户端机器上的 ~/.ssh/config 文件中添加以下文本:

    Host vm/*
      ProxyCommand virtctl port-forward --stdio=true %h %p
  2. 运行以下命令来连接到虚拟机:

    $ ssh <user>@vm/<vm_name>.<namespace>

10.8.2.3. 访问虚拟机实例的串行控制台

virtctl console 命令可打开特定虚拟机实例的串行控制台。

先决条件

  • 必须安装 virt-viewer 软件包。
  • 您要访问的虚拟机实例必须正在运行。

流程

  • 使用 virtctl 连接至串行控制台:

    $ virtctl console <VMI>

10.8.2.4. 使用 VNC 访问虚拟机实例的图形控制台

virtctl 客户端实用程序可使用 remote-viewer 功能打开正在运行的虚拟机实例的图形控制台。该功能包含在 virt-viewer 软件包中。

先决条件

  • 必须安装 virt-viewer 软件包。
  • 您要访问的虚拟机实例必须正在运行。
注意

如果要通过 SSH 在远程机器上使用 virtctl,您必须将 X 会话转发至您的机器。

流程

  1. 使用 virtctl 实用程序连接至图形界面:

    $ virtctl vnc <VMI>
  2. 如果命令失败,请尝试使用 -v 标志来收集故障排除信息:

    $ virtctl vnc <VMI> -v 4

10.8.2.5. 通过 RDP 控制台连接至 Windows 虚拟机

使用本地远程桌面协议 (RDP) 客户端创建 Kubernetes Service 对象以连接到 Windows 虚拟机(VM)。

先决条件

  • 正在运行的 Windows 虚拟机装有 QEMU 客户机代理。VirtIO 驱动程序中包含 qemu-guest-agent 对象。
  • 在本地机器上安装了 RDP 客户端。

步骤

  1. 编辑 VirtualMachine 清单,为创建服务添加标签:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-ephemeral
      namespace: example-namespace
    spec:
      running: false
      template:
        metadata:
          labels:
            special: key 1
    # ...
    1
    spec.template.metadata.labels 部分添加标签 special: key
    注意

    虚拟机上的标签会传递到 pod。special: key 标签必须与 Service 清单的 spec.selector 属性中的标签匹配。

  2. 保存 VirtualMachine 清单文件以应用更改。
  3. 创建 Service 清单以公开虚拟机:

    apiVersion: v1
    kind: Service
    metadata:
      name: rdpservice 1
      namespace: example-namespace 2
    spec:
      ports:
      - targetPort: 3389 3
        protocol: TCP
      selector:
        special: key 4
      type: NodePort 5
    # ...
    1
    Service 对象的名称。
    2
    Service 对象所在的命名空间。这必须与 VirtualMachine 清单的 metadata.namespace 字段匹配。
    3
    服务要公开的虚拟机端口。如果虚拟机清单中定义了端口列表,则必须引用打开端口。
    4
    对您在 VirtualMachine 清单的 spec.template.metadata.labels 小节中添加的标签的引用。
    5
    服务的类型。
  4. 保存 Service 清单文件。
  5. 运行以下命令来创建服务:

    $ oc create -f <service_name>.yaml
  6. 启动虚拟机。如果虚拟机已在运行,重启它。
  7. 查询 Service 对象以验证它是否可用:

    $ oc get service -n example-namespace

    NodePort 服务的输出示例

    NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)            AGE
    rdpservice   NodePort    172.30.232.73   <none>       3389:30000/TCP    5m

  8. 运行以下命令来获取节点的 IP 地址:

    $ oc get node <node_name> -o wide

    输出示例

    NAME    STATUS   ROLES   AGE    VERSION  INTERNAL-IP      EXTERNAL-IP
    node01  Ready    worker  6d22h  v1.24.0  192.168.55.101   <none>

  9. 在首选的 RDP 客户端中指定节点 IP 地址和分配的端口。
  10. 输入用户名和密码以连接到 Windows 虚拟机。