8.7. 访问虚拟机控制台

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

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

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

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

8.7.1.1. 连接至串行控制台

从 web 控制台上 Virtual Machine Overview 屏幕中的 Console 选项卡连接至正在运行的虚拟机的串行控制台。

流程

  1. 在 OpenShift Virtualization 控制台中,从侧边菜单中点击 WorkloadsVirtualization
  2. Virtual Machines 标签页。
  3. 选择一个虚拟机以打开 Virtual Machine Overview 页。
  4. 点击 Console。默认会打开 VNC 控制台。
  5. 选择 Disconnect before switching,以确保一次只打开一个控制台会话。否则,VNC 控制台会话会在后台保持活跃。
  6. 点击 VNC Console 下拉菜单并选择 Serial Console
  7. Disconnect 结束控制台会话。
  8. 可选:点 Open Console in New Window 在一个单独的窗口中打开串口控制台。

8.7.1.2. 连接至 VNC 控制台

通过 web 控制台中的 Virtual Machine Overview 界面中的 Console 标签页连接到运行虚拟机的 VNC 控制台。

流程

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

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

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

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

先决条件

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

流程

  1. 在 OpenShift Virtualization 控制台中,从侧边菜单中点击 WorkloadsVirtualization
  2. Virtual Machines 标签页。
  3. 选择 Windows 虚拟机以打开 Virtual Machine Overview 屏幕。
  4. 点击 Console 选项卡。
  5. Console 列表中,选择 Desktop Viewer
  6. Network Interface 列表中,选择第 2 层 vNIC。
  7. 点击 Launch Remote Desktop 下载 console.rdp 文件。
  8. 打开 RDP 客户端并引用 console.rdp 文件。例如,使用 Remmina

    $ remmina --connect /path/to/console.rdp
  9. 输入 Administrator 用户名和密码以连接至 Windows 虚拟机。

8.7.1.4. 从 Web 控制台复制 SSH 命令

复制命令,以便从 web 控制台中的 Actions 列表中通过 SSH 访问正在运行的虚拟机 (VM)。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 WorkloadsVirtualization
  2. Virtual Machines 标签页。
  3. 选择一个虚拟机以打开 Virtual Machine Overview 页。
  4. Actions 列表中,选择 Copy SSH Command。现在,您可以将此命令粘贴到 OpenShift CLI (oc)中。

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

8.7.2.1. 通过 SSH 访问虚拟机实例

在虚拟机上公开 22 端口后,就可以使用 SSH 访问虚拟机(VM)。

virtctl expose 命令可将虚拟机实例(VMI)端口转发到节点端口,并创建一个服务以启用对它的访问。以下示例创建 fedora-vm-ssh 服务,它将集群节点的特定端口流量转发到 <fedora-vm> 虚拟机的端口 22。

先决条件

  • 您必须与 VMI 在同一个项目中。
  • 您要访问的 VMI 必须使用 masquerade 绑定方法连接到默认 pod 网络。
  • 您要访问的 VMI 必须正在运行。
  • 安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令来创建 fedora-vm-ssh 服务:

    $ virtctl expose vm <fedora-vm> --port=22 --name=fedora-vm-ssh --type=NodePort 1
    1
    <fedora-vm> 是您在其上运行 fedora-vm-ssh 服务的虚拟机的名称。
  2. 检查服务,找出服务获取的端口:

    $ oc get svc

    输出示例

    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
    fedora-vm-ssh   NodePort   127.0.0.1      <none>        22:32551/TCP   6s

    在本例中,服务获取了 32551 端口。

  3. 通过 SSH 登录 VMI。使用任何集群节点的 ipAddress,以及在上一步中找到的端口:

    $ ssh username@<node_IP_address> -p 32551

8.7.2.2. 使用 YAML 配置通过 SSH 访问虚拟机

您可以启用与虚拟机的 SSH 连接,而无需运行 virtctl expose 命令。当配置并应用虚拟机的 YAML 文件和服务的 YAML 文件时,服务会将 SSH 流量转发到虚拟机。

以下示例显示了虚拟机的 YAML 文件和服务 YAML 文件的配置。

先决条件

  • 安装 OpenShift CLI (oc) 。
  • 使用 oc create namespace 命令并指定命名空间的名称,为虚拟机的 YAML 文件创建一个命名空间。

流程

  1. 在虚拟机的 YAML 文件中,添加标签和一个值来公开 SSH 连接的服务。为接口启用伪装(masquerade)功能:

    VirtualMachine 定义示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      namespace: ssh-ns 1
      name: vm-ssh
    spec:
      running: false
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm-ssh
            special: vm-ssh 2
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: containerdisk
              - disk:
                  bus: virtio
                name: cloudinitdisk
              interfaces:
              - masquerade: {} 3
                name: testmasquerade 4
              rng: {}
            machine:
              type: ""
            resources:
              requests:
                memory: 1024M
          networks:
          - name: testmasquerade
            pod: {}
          volumes:
          - name: containerdisk
            containerDisk:
              image: kubevirt/fedora-cloud-container-disk-demo
          - name: cloudinitdisk
            cloudInitNoCloud:
              userData: |
                #cloud-config
                user: fedora
                password: fedora
                chpasswd: {expire: False}
    # ...

    1
    oc create namespace 命令创建的命名空间的名称。
    2
    服务用于标识为 SSH 流量连接启用的虚拟机实例的标签。标签可以是任何 key:value 对,作为标签(label)添加到此 YAML 文件,也可以作为服务 YAML 文件中的 selector 添加。
    3
    接口类型是 masquerade
    4
    此接口的名称为 testmasquerade
  2. 创建虚拟机:

    $ oc create -f <path_for_the_VM_YAML_file>
  3. 启动虚拟机:

    $ virtctl start vm-ssh
  4. 在服务的 YAML 文件中,指定服务名称、端口号和目标端口。

    Service 定义示例

    apiVersion: v1
    kind: Service
    metadata:
      name: svc-ssh 1
      namespace: ssh-ns 2
    spec:
      ports:
      - targetPort: 22 3
        protocol: TCP
        port: 27017
      selector:
        special: vm-ssh 4
      type: NodePort
    # ...

    1
    SSH 服务的名称。
    2
    oc create namespace 命令创建的命名空间的名称。
    3
    SSH 连接的目标端口号。
    4
    选择器名称和值必须与虚拟机的 YAML 文件中指定的标签匹配。
  5. 创建服务:

    $ oc create -f <path_for_the_service_YAML_file>
  6. 验证虚拟机是否正在运行:

    $ oc get vmi

    输出示例

    NAME    AGE     PHASE       IP              NODENAME
    vm-ssh 6s       Running     10.244.196.152  node01

  7. 检查服务,找出服务获取的端口:

    $ oc get svc

    输出示例

    NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
    svc-ssh     NodePort       10.106.236.208 <none>        27017:30093/TCP   22s

    在本例中,服务获取了端口号 30093。

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

    $ oc get node <node_name> -o wide

    输出示例

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

  9. 通过 SSH 登录虚拟机运行的节点的 IP 地址和端口号。使用 oc get svc 命令显示的端口号,以及 oc get node 命令显示的节点 IP 地址。以下示例显示了带有用户名、节点 IP 地址和端口号的 ssh 命令:

    $ ssh fedora@192.168.55.101 -p 30093

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

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

先决条件

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

流程

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

    $ virtctl console <VMI>

8.7.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

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

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

要通过 RDP 连接至 Windows 虚拟机,请为 RDP 客户端指定附加的 L2 vNIC 的 IP 地址。

先决条件

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

流程

  1. 以具有访问令牌的用户身份通过 oc CLI 工具登录 OpenShift Virtualization 集群。

    $ oc login -u <user> https://<cluster.example.com>:8443
  2. 使用 oc describe vmi 显示正在运行的 Windows 虚拟机的配置。

    $ oc describe vmi <windows-vmi-name>

    输出示例

    ...
    spec:
      networks:
      - name: default
        pod: {}
      - multus:
          networkName: cnv-bridge
        name: bridge-net
    ...
    status:
      interfaces:
      - interfaceName: eth0
        ipAddress: 198.51.100.0/24
        ipAddresses:
          198.51.100.0/24
        mac: a0:36:9f:0f:b1:70
        name: default
      - interfaceName: eth1
        ipAddress: 192.0.2.0/24
        ipAddresses:
          192.0.2.0/24
          2001:db8::/32
        mac: 00:17:a4:77:77:25
        name: bridge-net
    ...

  3. 找出并复制第 2 层网络接口的 IP 地址。在以上示例中是 192.0.2.0,如果您首选 IPv6,则为 2001:db8::
  4. 打开 RDP 客户端,并使用上一步中复制的 IP 地址进行连接。
  5. 输入 Administrator 用户名和密码以连接至 Windows 虚拟机。