本文適用於執行 Google Distributed Cloud 的應用程式擁有者。本文說明如何連線至使用 GDC 虛擬機器執行階段的虛擬機器 (VM)。您可以直接使用 IP 位址連線至 VM,也可以使用內建工具進行 SSH 或主控台存取。
事前準備
如要完成這份文件,您必須存取下列資源:
- 在其中一個叢集中執行的 VM。如有需要,請在 Google Distributed Cloud 中建立 VM。
virtctl
用戶端工具已安裝為kubectl
的外掛程式。視需要安裝 virtctl 用戶端工具。
設定 VM 的無密碼 SSH 存取權
VM Runtime on GDC 會安裝客層代理程式,方便您直接透過 SSH 存取 VM,不必輸入密碼。除了其他工作外,客體代理程式還會安裝及過期安全殼層金鑰。這項功能可啟用 SSH 通道,讓叢集網路外部的用戶端存取 VM。
啟用訪客代理程式
如要啟用訪客代理程式,請按照下列步驟操作:
檢查
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 ...
如有需要,請使用
kubectl edit
更新VirtualMachine
自訂資源。如要確認訪客代理程式是否正常運作,請檢查 VM 自訂資源中的
status
:kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
當訪客代理程式運作時,您會看到
status: "True"
GuestEnvironmentEnabled
和GuestEnvironmentDataSynced
條件。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
:用於安全殼層存取的公開金鑰。一般來說,這是id_rsa.pub
檔案的內容。EXPIRATION_TIME
:ttl
(存留時間) 欄位會指定安全殼層金鑰的有效時間長度。舉例來說,如果您指定
30m
,SSH 金鑰會在 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 位址。
透過服務連線
如果 VM 連線至預設 pod-network
,但您無法直接與 VM 的 IP 位址通訊,請將 VM 顯示在負載平衡器 Service
後方。
在您選擇的編輯器中建立
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 和遠端桌面協定的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
使用標準通訊協定連線至負載平衡器的
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
連線。
如要使用 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
使用控制台直接連線
如果無法直接連線至 Linux VM 進行 SSH 存取,請使用 GDC 控制台上的 VM 執行階段連線至 VM 的控制台。這個方法會開啟序列主控台。連線後,系統會提供指令提示,而非圖形主控台。
如要從控制台存取 Linux VM,請使用
virtctl
外掛程式:kubectl virt console VM_NAME --kubeconfig KUBECONFIG
將您的 VM 名稱替換為
VM_NAME
。系統顯示提示時,請輸入 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 名稱替換為
VM_NAME
。系統顯示提示時,請輸入 VM 的使用者憑證。
成功連線至 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
請按照下列步驟重設現有使用者的密碼,或為新使用者建立初始密碼:
在 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 控制台記錄。