連線至使用 VM Runtime on GDC 的 VM

本文適用於執行 Google Distributed Cloud 的應用程式擁有者。本文說明如何連線至使用 GDC 虛擬機器執行階段的虛擬機器 (VM)。您可以直接使用 IP 位址連線至 VM,也可以使用內建工具進行 SSH 或主控台存取。

事前準備

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

設定 VM 的無密碼 SSH 存取權

VM Runtime on GDC 會安裝客層代理程式,方便您直接透過 SSH 存取 VM,不必輸入密碼。除了其他工作外,客體代理程式還會安裝及過期安全殼層金鑰。這項功能可啟用 SSH 通道,讓叢集網路外部的用戶端存取 VM。

啟用訪客代理程式

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

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

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    spec.osType 欄位應設為 VM 的作業系統,LinuxWindowsspec.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
    

    當訪客代理程式運作時,您會看到 status: "True" GuestEnvironmentEnabledGuestEnvironmentDataSynced 條件。

    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:用於安全殼層存取的公開金鑰。一般來說,這是 id_rsa.pub 檔案的內容。
    • EXPIRATION_TIMEttl (存留時間) 欄位會指定安全殼層金鑰的有效時間長度。

      舉例來說,如果您指定 30m,SSH 金鑰會在 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 位址。

透過服務連線

如果 VM 連線至預設 pod-network,但您無法直接與 VM 的 IP 位址通訊,請將 VM 顯示在負載平衡器 Service 後方。

  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:通訊協定的名稱,例如 sshvncrdp
    • PROTOCOL_TYPE:通訊協定類型,例如 SSH 和遠端桌面協定的 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. 使用標準通訊協定連線至負載平衡器的 EXTERNAL-IP 位址,例如使用 SSH 用戶端:

    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
    

使用控制台直接連線

如果無法直接連線至 Linux VM 進行 SSH 存取,請使用 GDC 控制台上的 VM 執行階段連線至 VM 的控制台。這個方法會開啟序列主控台。連線後,系統會提供指令提示,而非圖形主控台。

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

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    將您的 VM 名稱替換為 VM_NAME

    系統顯示提示時,請輸入 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 名稱替換為 VM_NAME

    系統顯示提示時,請輸入 VM 的使用者憑證。

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

建立初始使用者憑證

使用控制台連線至 VM 時,您必須指定使用者憑證。建立初始使用者憑證的程序,會因 Linux 和 Windows 客戶作業系統而異。

Linux 客戶端 OS

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

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

    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
    

後續步驟