更新时间:2025-04-27 GMT+08:00

连接到虚拟机

使用console命令连接到虚拟机

  1. 如需连接到虚拟机的控制台,执行以下命令:

    virtctl console testvm

  2. 按照提示输入创建虚拟机时指定的用户凭据,即可进入虚拟机控制台。结束使用后,可以通过以下命令退出控制台:

    Ctrl + ]

使用VNC连接虚拟机

华为云集群支持使用remote-viewer(需在客户端安装)从本机连接VNC,或者开启VNC代理供远程连接。

  • 如需启动本地VNC viewer:
    virtctl vnc testvm 
  • 如需使用华为云集群提供的VNC代理供远程使用:
    virtctl vnc --proxy-only testvm

配置SSH-Key连接虚拟机

在管理虚拟机时,一个常见的操作模式是在虚拟机启动时注入SSH公钥。这使得自动化工具(如Ansible)能够对虚拟机进行配置,同时也为操作员提供了安全且无需密码访问虚拟机的方式。华为云集群提供了多种向虚拟机注入SSH公钥的方法。一般来说,这些方法分为如下两类:

  • 静态密钥注入:在虚拟机首次启动时放置密钥。

    用户在创建虚拟机时,可以通过cloud-init向虚拟机注入启动脚本,从而实现多种自定义操作。

    可以通过以下方法注入密钥:

    将公钥存入Kubernetes Secret,虚拟机的访问凭证API能够在启动时静态注入。

    • 生成SSH密钥对后,会在键入命令的目录生成私钥和公钥(公钥命名id_rsa.pub)。
    • 包含公钥的Secret通过访问凭证API和noCloud传播方法被分配给虚拟机。
    • 华为云集群通过使用生成的cloud-init元数据而非用户数据,将密钥注入虚拟机。
    1. 使用以下命令创建Kubernetes Secret,存储生成的公钥:
      kubectl create secret generic my-pub-key --from-file=key1=id_rsa.pub
    2. 使用以下命令创建一个虚拟机:
      kubectl create -f - <<EOF
      apiVersion: kubevirt.io/v1
      kind: VirtualMachine
      metadata:
        name: testvm
      spec:
        runStrategy: Always
        template:
          spec:
            domain:
              devices:
                disks:
                - disk:
                    bus: virtio
                  name: containerdisk
                - disk:
                    bus: virtio
                  name: cloudinitdisk
                rng: {}
              resources:
                requests:
                  memory: 1024M
            terminationGracePeriodSeconds: 0
            accessCredentials:
            - sshPublicKey:
                source:
                  secret:
                    secretName: my-pub-key
                propagationMethod:
                  noCloud: {}
            volumes:
            - containerDisk:
                image: quay.io/containerdisks/fedora:latest
              name: containerdisk
            - cloudInitNoCloud:
                userData: |-
                  #cloud-config
                  password: fedora
                  chpasswd: { expire: False }
              name: cloudinitdisk
      EOF
    3. 稍等片刻,使用以下命令查看虚拟机实例的 IP:
      kubectl get vmis
      输出示例:
      NAME     AGE   PHASE     IP              NODENAME        READY
      testvm   12m   Running   172.16.51.103   192.168.88.99   True
    4. 使用示例中Fedora镜像的默认用户名fedora进行SSH登录,免密进入创建的虚拟机终端:
      ssh fedora@172.16.51.103
  • 动态密钥注入:允许在启动和运行时动态更新密钥。
    • 无法向正在运行的虚拟机附加新密钥:若需添加新的密钥,必须重启虚拟机;
    • 依赖qemu-guest-agent:此功能要求虚拟机内部已安装qemu-guest-agent;
    • 文件所有权说明:当使用qemuGuestAgent传播方法时,/home/$USER/.ssh/authorized_keys文件的所有权将归属于guest agent。任何非通过guest agent进行的文件修改将会丢失。

    华为云集群支持通过访问凭证API动态向虚拟机注入密钥。通过qemuGuestAgent传播方法,配置的Kubernetes Secret会在虚拟机启动时附加到该虚拟机。这使得用户可以在运行时通过更新附加的密钥动态注入公钥。

    • 与上面静态密钥注入的例子不同之处,主要是将accessCredentials部分修改为:
      accessCredentials:
            - sshPublicKey:
                source:
                  secret:
                    secretName: my-pub-key
                propagationMethod:
                  qemuGuestAgent:
                    users:
                    - fedora
    • cloudInitNoCloud部分需要添加关闭SELinux,使得qemu-guest-agent可以修改。

      authorized_keys:

      - cloudInitNoCloud:
                userData: |-
                  #cloud-config
                  password: fedora
                  chpasswd: { expire: False }
                  # Disable SELinux for now, so qemu-guest-agent can write the authorized_keys file
                  # The selinux-policy is too restrictive currently, see open bugs:
                  #   - https://bugzilla.redhat.com/show_bug.cgi?id=1917024
                  #   - https://bugzilla.redhat.com/show_bug.cgi?id=2028762
                  #   - https://bugzilla.redhat.com/show_bug.cgi?id=2057310
                  bootcmd:
                    - setenforce 0