透過 GDC 上的 VM 執行階段,您可以使用 IP 位址直接連線至虛擬機器 (VM),或透過內建的 virtctl 工具進行 SSH、序列控制台和 VNC 存取。您也可以使用訪客代理程式,設定無密碼 SSH 存取權。
事前準備
如要完成這份文件,您必須存取下列資源:
- 在其中一個叢集內執行的 VM。如有需要,請在 Google Distributed Cloud 中建立 VM。
virtctl用戶端工具已安裝為kubectl的外掛程式。如有需要,請安裝 virtctl 用戶端工具。
設定無密碼 SSH 存取 VM
VM Runtime on GDC 會安裝訪客代理程式,讓您直接透過 SSH 存取 VM,不需輸入密碼。除了其他職責外,訪客代理程式也會安裝和淘汰安全殼層金鑰。這項功能會啟用 SSH 通道,讓您從叢集網路外的用戶端存取 VM。
啟用訪客代理
如要啟用訪客代理程式,請按照下列步驟操作:
檢查
VirtualMachine自訂資源,確認已設定啟用訪客代理程式:kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIGspec.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 ...如有需要,請使用
kubectl edit更新VirtualMachine自訂資源。如要確認訪客代理程式是否正常運作,請檢查 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 存取權,請按照下列步驟操作:
在您選擇的編輯器中建立
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(天)
使用
kubectl apply從資訊清單檔案建立VirtualMachineAccessRequest。舉例來說,如果資訊清單檔案名稱為vm-access-request.yaml,kubectl apply -f MANIFEST --kubeconfig KUBECONFIG更改下列內容:
MANIFEST:存取要求資訊清單檔案的名稱。例如:vm-access-request.yaml。KUBECONFIG:託管您要存取的 VM 的叢集 kubeconfig 檔案路徑。
如要確認存取權要求設定是否成功,請檢查
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。
如要停用客體代理程式,請按照下列步驟操作:
變更設定前,請使用
kubectl停止 VM:kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
編輯 VM 資源:
kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG更新
VirtualMachine設定,明確新增空白spec.guestEnvironment:apiVersion: vm.cluster.gke.io/v1alpha1 kind: VirtualMachine metadata: name: vm-example namespace: default spec: compute: ... osType: Linux guestEnvironment: {}在編輯器中儲存並關閉更新後的 VM 資訊清單。
使用
kubectl啟動 VM:kubectl virt start VM_NAME --kubeconfig KUBECONFIG
使用 IP 位址連線
如果 VM 有可存取的 IP 位址,且您已有存取 VM 的憑證,則可使用 SSH、VNC 或 RDP 等通訊協定連線。
透過 IP 位址連線
如果您可以直接連線至 VM 的 IP 位址,請使用下列其中一種方法:
安全殼層 (SSH)
取得 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使用 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 時,定義用於建立初始使用者憑證的憑證。
取得 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使用用戶端工具和適當的通訊埠 (例如 VNC 通訊埠
5900或 RDP 通訊埠3389),連線至上一步取得的 VM IP 位址。
透過 Service 連線
如果 VM 連線至預設 pod-network,且您無法直接與 VM 的 IP 位址通訊,請透過負載平衡器 Service 公開 VM。
在您選擇的編輯器中建立
Service資訊清單,例如my-service-load-balancer.yaml:nano my-service-load-balancer.yaml複製並貼上下列 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。
在編輯器中儲存並關閉
Service資訊清單。使用
kubectl建立Service:kubectl apply -f my-service-load-balancer.yaml --kubeconfig KUBECONFIG取得負載平衡器服務的
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使用標準通訊協定 (例如 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 連線。
如要透過控制台使用 SSH 連線至 Linux VM,並啟用
virtctl外掛程式,請按照下列步驟操作:kubectl virt ssh USERNAME@VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG替換下列值:
USERNAME:存取 VM 的使用者名稱。如果 VM 上沒有這個帳戶,系統會建立該帳戶。VM_NAME:VM 名稱。
成功使用 SSH 連線至 VM 後,如果不再需要連線,請結束 SSH 工作階段:
exit
使用控制台直接連線
如果沒有直接網路連線,無法透過 SSH 存取 Linux VM,請使用 VM Runtime on GDC 控制台連線至 VM 控制台。這個方法會開啟序列控制台。連線後,您會看到命令提示字元,而非圖形主控台。
如要從控制台存取 Linux VM,請使用
virtctl外掛程式:kubectl virt console VM_NAME --kubeconfig KUBECONFIG將
VM_NAME替換為 VM 名稱。系統提示時,請輸入 VM 的使用者憑證。這些憑證必須存在於 VM 上,或在建立 VM 時套用。如有需要,請參閱下一節,瞭解如何在建立 VM 時建立初始使用者憑證。
成功連線至 VM 的控制台後,如果不再需要連線,請結束 VM 工作階段和控制台:
Ctrl + ]
使用 VNC 直接連線
您可以使用 kubectl virt vnc 指令開啟虛擬網路運算 (VNC) 圖形控制台,存取 VM。這個方法適用於執行 Windows 或 Linux 訪客 OS 的 VM。使用 kubectl virt vnc 指令時,GDC VM 執行階段會為您開啟 VNC,因此您不必在客體 OS 中啟用 VNC。
您需要現有的憑證才能登入 VM,例如您在建立 VM 時定義的初始使用者憑證。
如要使用 VNC 存取 VM,請使用
virtctl外掛程式:kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG將
VM_NAME替換為 VM 名稱。出現提示時,請輸入 VM 的使用者憑證。
成功連線至 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
請按照下列步驟,重設現有使用者的密碼,或為新使用者建立初始密碼:
在 Windows VM 中啟用訪客代理程式:
在管理員工作站上,使用下列指令重設 (或設定,如果您使用新的使用者名稱) 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
後續步驟
- 管理 Google Distributed Cloud 中 VM 的電源狀態。
- 在 Google Distributed Cloud 編輯 VM。
- 在 Google Distributed Cloud 查看 VM 控制台記錄。