連線至使用 VM Runtime on GDC 的 VM

透過 GDC 上的 VM 執行階段,您可以使用 IP 位址直接連線至虛擬機器 (VM),或透過內建的 virtctl 工具進行 SSH、序列控制台和 VNC 存取。您也可以使用訪客代理程式,設定無密碼 SSH 存取權。

事前準備

如要完成這份文件,您必須存取下列資源:

設定無密碼 SSH 存取 VM

VM Runtime on GDC 會安裝訪客代理程式,讓您直接透過 SSH 存取 VM,不需輸入密碼。除了其他職責外,訪客代理程式也會安裝和淘汰安全殼層金鑰。這項功能會啟用 SSH 通道,讓您從叢集網路外的用戶端存取 VM。

啟用訪客代理

如要啟用訪客代理程式,請按照下列步驟操作:

  1. 檢查 VirtualMachine 自訂資源,確認已設定啟用訪客代理程式:

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    spec.osType 欄位應設為 VM 的作業系統,Linux 或 Windows。請勿將 spec.guestEnvironment 區段明確設為空白。如果該區段設為空白 (guestEnvironment: {}),您可以完全移除該區段,啟用訪客代理程式。

    您要存取的 VM VirtualMachine 自訂資源應如下所示:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: sample-vm
    spec:
      compute:
        cpu:
          vcpus: 2
        memory:
          capacity: 4Gi
    ...
      osType: Linux
    ...
    
  2. 如有需要,請使用 kubectl edit 更新 VirtualMachine 自訂資源。

  3. 如要確認訪客代理程式是否正常運作,請檢查 VM 自訂資源中的 status:

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    如果客體代理程式正常運作,GuestEnvironmentEnabled 和 GuestEnvironmentDataSynced 條件會顯示 status: "True"。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      ...
      name: vm-sample-01
      ...
    status:
      conditions:
      - lastTransitionTime: "2022-10-05T22:40:26Z"
        message: ""
        observedGeneration: 1
        reason: UserConfiguration
        status: "True"
        type: GuestEnvironmentEnabled
      - lastTransitionTime: "2022-10-06T21:55:57Z"
        message: ""
        observedGeneration: 1
        reason: GuestEnvironmentDataSynced
        status: "True"
        type: GuestEnvironmentSynced
      ...
    

啟用無密碼 SSH 存取權

如要為 VM 啟用無密碼 SSH 存取權,請按照下列步驟操作:

  1. 在您選擇的編輯器中建立 VirtualMachineAccessRequest 資訊清單檔案,例如 vm-access-request.yaml:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      name: VMAR_NAME
      namespace: VM_NAMESPACE
    spec:
      vm: VM_NAME
      user: USERNAME
      ssh:
        key: PUBLIC_SSH_KEY
        ttl: EXPIRATION_TIME
    

    更改下列內容:

    • VMAR_NAME:存取權要求資源的名稱。
    • VM_NAMESPACE:要存取的 VM 命名空間。
    • VM_NAME:要存取的 VM 名稱。
    • USERNAME:存取 VM 的使用者名稱。
    • PUBLIC_SSH_KEY:SSH 存取的公開金鑰。通常是 id_rsa.pub 檔案的內容。
    • EXPIRATION_TIME:ttl (存留時間) 欄位會指定安全殼層金鑰的有效時間長度。

      舉例來說,如果指定 30m,安全殼層金鑰會在 30 分鐘後到期。

      這個旗標使用下列單位:

      • s (秒)
      • m (分鐘)
      • h 小時
      • d (天)
  2. 使用 kubectl apply 從資訊清單檔案建立 VirtualMachineAccessRequest。舉例來說,如果資訊清單檔案名稱為 vm-access-request.yaml,

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

    更改下列內容:

    • MANIFEST:存取要求資訊清單檔案的名稱。例如:vm-access-request.yaml。
    • KUBECONFIG:託管您要存取的 VM 的叢集 kubeconfig 檔案路徑。
  3. 如要確認存取權要求設定是否成功,請檢查 VirtualMachineAccessRequest 的狀態:

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    設定成功後,status 區段會包含 state: configured:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      ...
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"vm.cluster.gke.io/v1","kind":"VirtualMachineAccessRequest",
          "metadata":{"annotations":{},"name":"vmar-sample","namespace":"default"},
          "spec":{"ssh":{"key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc=
              sample-user@sample-host","ttl":"5h"},"user":"sample-user","vm":"vm-sample-01"}}
      creationTimestamp: "2022-10-06T21:55:57Z"
      finalizers:
      - vm.cluster.gke.io/vmar-finalizer
      generation: 2
      name: vmar-sample
      namespace: default
      resourceVersion: "13033921"
      uid: 282d72ad-f48d-4e89-af22-336940ac9f58
    spec:
      ssh:
        key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc= sample-user@sample-host
        ttl: 5m0s
      user: sample-user
      vm: vm-sample-01
    status:
      processedAt: "2022-10-06T21:55:57Z"
      state: configured
    

停用訪客代理

建立新的 VM 並設定 osType 欄位時,系統會啟用訪客代理程式。這項功能處於預先發布版階段時,您可以編輯 VirtualMachine 自訂資源來停用。停用客體代理程式後,就無法透過無密碼 SSH 存取 VM。

如要停用客體代理程式,請按照下列步驟操作:

  1. 變更設定前,請使用 kubectl 停止 VM:

    kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
    
  1. 編輯 VM 資源:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. 更新 VirtualMachine 設定,明確新增空白 spec.guestEnvironment:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vm-example
      namespace: default
    spec:
      compute:
      ...
      osType: Linux
      guestEnvironment: {}
    
  3. 在編輯器中儲存並關閉更新後的 VM 資訊清單。

  4. 使用 kubectl 啟動 VM:

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

使用 IP 位址連線

如果 VM 有可存取的 IP 位址,且您已有存取 VM 的憑證,則可使用 SSH、VNC 或 RDP 等通訊協定連線。

透過 IP 位址連線

如果您可以直接連線至 VM 的 IP 位址,請使用下列其中一種方法:

安全殼層 (SSH)

  1. 取得 VM 的詳細資料,查看其 IP 位址:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    替換下列值:

    • VM_NAME:VM 名稱。
    • VM_NAMESPACE:VM 的命名空間。

    下列輸出範例顯示 VM 資訊和 IP 位址:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. 使用 SSH 用戶端連線至 VM:

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

    替換下列值:

    • USERNAME:VM 帳戶的使用者名稱。
    • IP_ADDRESS:在上一個步驟中取得的 VM IP 位址。
    • PATH_TO_KEY:私人安全殼層金鑰的路徑。

VNC 或 RDP

虛擬網路運算 (VNC) 和遠端桌面通訊協定 (RDP) 可讓您使用圖形控制台存取 VM。使用 IP 位址時,您必須先在客體 OS 中啟用 VNC 或 RDP,才能使用其中一項連線至 VM。如要瞭解如何啟用及使用 VNC 或 RDP,請參閱客體 OS 的說明文件。

您也需要現有的憑證才能登入 VM,例如在建立 VM 時,定義用於建立初始使用者憑證的憑證。

  1. 取得 VM 的詳細資料,查看其 IP 位址:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    替換下列值:

    • VM_NAME:VM 名稱。
    • VM_NAMESPACE:VM 的命名空間。

    下列輸出範例顯示 VM 資訊和 IP 位址:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. 使用用戶端工具和適當的通訊埠 (例如 VNC 通訊埠 5900 或 RDP 通訊埠 3389),連線至上一步取得的 VM IP 位址。

透過 Service 連線

如果 VM 連線至預設 pod-network,且您無法直接與 VM 的 IP 位址通訊,請透過負載平衡器 Service 公開 VM。

  1. 在您選擇的編輯器中建立 Service 資訊清單,例如 my-service-load-balancer.yaml:

    nano my-service-load-balancer.yaml
    
  2. 複製並貼上下列 YAML 資訊清單:

    apiVersion: v1
    kind: Service
    metadata:
      name: VM_NAME-service
    spec:
      selector:
        kubevirt/vm: VM_NAME
      ports:
      - name: PORT_NAME
        protocol: PROTOCOL_TYPE
        port: EXTERNAL_PORT
        targetPort: TARGET_PORT
      type: LoadBalancer
    

    在這個 Service 資訊清單類型中,替換下列值:

    • VM_NAME:VM 的名稱,用於公開遠端存取。
    • PORT_NAME:通訊協定名稱,例如 ssh、vnc 或 rdp。
    • PROTOCOL_TYPE:通訊協定類型,例如 SSH 和 RDP 的 TCP,或 VNC 的 UDP。
    • EXTERNAL_PORT:要公開的外部通訊埠編號,以及用於連線的編號。
    • TARGET_PORT:目標通訊埠,例如 SSH 的 22。
  3. 在編輯器中儲存並關閉 Service 資訊清單。

  4. 使用 kubectl 建立 Service:

    kubectl apply -f my-service-load-balancer.yaml  --kubeconfig KUBECONFIG
    
  5. 取得負載平衡器服務的 EXTERNAL-IP 位址:

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

    系統會顯示負載平衡器的 IP 位址,如以下輸出範例所示:

    NAME          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    vm1-service   LoadBalancer   172.26.232.167   10.200.0.51   22:31141/TCP   6d20h
    
  6. 使用標準通訊協定 (例如 SSH 用戶端) 連線至負載平衡器的 EXTERNAL-IP 位址:

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

    替換下列值:

    • USERNAME:VM 帳戶的使用者名稱。
    • LOAD_BALANCER_IP_ADDRESS:負載平衡器的 IP 位址。
    • PATH_TO_KEY:私人安全殼層金鑰的路徑。

直接使用 SSH 連線

如果用戶端與裸機叢集節點連線至相同的實體網路,且您不需要使用 SSH 通道連線至叢集,則可使用 kubectl virt ssh 連線。

  1. 如要透過控制台使用 SSH 連線至 Linux VM,並啟用 virtctl 外掛程式,請按照下列步驟操作:

    kubectl virt ssh USERNAME@VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    替換下列值:

    • USERNAME:存取 VM 的使用者名稱。如果 VM 上沒有這個帳戶,系統會建立該帳戶。
    • VM_NAME:VM 名稱。
  2. 成功使用 SSH 連線至 VM 後,如果不再需要連線,請結束 SSH 工作階段:

    exit
    

使用控制台直接連線

如果沒有直接網路連線,無法透過 SSH 存取 Linux VM,請使用 VM Runtime on GDC 控制台連線至 VM 控制台。這個方法會開啟序列控制台。連線後,您會看到命令提示字元,而非圖形主控台。

  1. 如要從控制台存取 Linux VM,請使用 virtctl 外掛程式:

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    將 VM_NAME 替換為 VM 名稱。

    系統提示時,請輸入 VM 的使用者憑證。這些憑證必須存在於 VM 上,或在建立 VM 時套用。如有需要,請參閱下一節,瞭解如何在建立 VM 時建立初始使用者憑證。

  2. 成功連線至 VM 的控制台後,如果不再需要連線,請結束 VM 工作階段和控制台:

    Ctrl + ]
    

使用 VNC 直接連線

您可以使用 kubectl virt vnc 指令開啟虛擬網路運算 (VNC) 圖形控制台,存取 VM。這個方法適用於執行 Windows 或 Linux 訪客 OS 的 VM。使用 kubectl virt vnc 指令時,GDC VM 執行階段會為您開啟 VNC,因此您不必在客體 OS 中啟用 VNC。

您需要現有的憑證才能登入 VM,例如您在建立 VM 時定義的初始使用者憑證。

  1. 如要使用 VNC 存取 VM,請使用 virtctl 外掛程式:

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    將 VM_NAME 替換為 VM 名稱。

    出現提示時,請輸入 VM 的使用者憑證。

  2. 成功連線至 VM 的 VNC 工作階段後,如果不再需要連線,請登出 VM 以關閉 VNC 連線。

建立初始使用者憑證

使用控制台連線至 VM 時,必須指定使用者憑證。Linux 和 Windows 訪客作業系統建立初始使用者憑證的程序不同。

Linux 客體 OS

如果是 Linux VM,使用者憑證可以內建於自訂映像檔,也可以在建立 VM 時指定。

  • 搭配 kubectl virt create 指令使用 --configure-initial-password 參數:

    kubectl virt create vm VM_NAME \
        --image ubuntu20.04 \
        --os-type Linux \
        --configure-initial-password USERNAME:PASSWORD \
        --kubeconfig KUBECONFIG
    

    替換下列值:

    • VM_NAME:VM 名稱。
    • USERNAME:要在 VM 上建立的帳戶使用者名稱。
    • PASSWORD:使用者帳戶的密碼。

    這個範例指令會建立執行 Ubuntu 20.04 的 Linux VM。建議您在首次登入 VM 後變更初始憑證。

Windows 訪客 OS

請按照下列步驟,重設現有使用者的密碼,或為新使用者建立初始密碼:

  1. 在 Windows VM 中啟用訪客代理程式:

    1. 設定 VM 以啟用訪客代理程式。

    2. 使用 VNC 或 RDP 連線至 VM。

    3. 在 VM 中,前往 guest agent 磁碟機。在大多數情況下,這是磁碟機 E:。

    4. 使用 PowerShell 執行 install.ps1。

      系統會安裝並啟動訪客代理程式。後續重新啟動 VM 時,訪客代理程式會自動啟動。

    5. 關閉遠端工作階段。

  2. 在管理員工作站上,使用下列指令重設 (或設定,如果您使用新的使用者名稱) Windows VM 密碼:

    kubectl virt reset-windows-password VM_NAME \
        --user=USERNAME \
        --namespace=VM_NAMESPACE
    

    更改下列內容:

    • VM_NAME:VM 的名稱。
    • USERNAME:要重設 (或設定) 密碼的使用者名稱。如果使用者名稱是新的,指令會建立新的 Windows 帳戶並設定初始密碼。
    • VM_NAMESPACE:(選用) VM 的命名空間。這個標記是選用的,如未指定,系統會使用預設命名空間 default。

    如要重設 (或設定) 密碼,而不顯示確認提示,請使用選用的 --force 旗標。使用 --force 旗標時,提示會警告您重設現有帳戶密碼的後果。如果沒有 --force 旗標,指令會提示您確認重設密碼,並顯示下列文字:

    This command creates an account and sets an initial password for the
    user USERNAME if the account does not already exist.
    If the account already exists, resetting the password can cause the
    LOSS OF ENCRYPTED DATA secured with the current password, including
    files and stored passwords.
    
    Would you like to set or reset the password for USERNAME (Y/n)?
    

    確認 (或強制) 重設密碼後,指令會傳回指定 VM 和使用者名稱的新密碼:

    Resetting and retrieving password for USERNAME on VM_NAME
    
    vm_name:    VM_NAME
    username:   USERNAME
    password:   PASSWORD
    

後續步驟