本文档适用于运行 Anthos clusters on Bare Metal 的应用所有者。本文档介绍如何连接到使用 Anthos VM Runtime 的虚拟机。您可以使用 IP 地址直接连接到虚拟机,也可以使用内置的工具进行 SSH 或控制台访问。
准备工作
要完成本文档,您需要拥有以下资源的访问权限:
- 在其中一个集群中运行的虚拟机。如果需要,请在 Anthos clusters on Bare Metal 中创建虚拟机。
- 作为
kubectl
的插件安装的virtctl
客户端工具。如果需要,请安装 virtctl 客户端工具。
配置对虚拟机的无密码 SSH 访问
通过 Anthos VM 运行时安装的客机代理可以实现对虚拟机的直接无密码 SSH 访问。除此之外,客机代理还会安装 SSH 密钥并使其过期。此功能使 SSH 隧道可以从集群网络外部的客户端访问您的虚拟机。
启用客机代理
如需启用客机代理,请执行以下操作:
检查您的
VirtualMachine
自定义资源,以确认其已配置为启用客机代理:kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
spec.osType
字段应设置为虚拟机的操作系统:Linux
或Windows
。spec.guestEnvironment
部分不应明确配置为空。如果该部分配置为空 (guestEnvironment: {}
),则可以完全移除该部分以启用客机代理。您要访问的虚拟机的
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
自定义资源。如需验证客机代理是否正常运行,请检查虚拟机自定义资源中的
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 访问
如需为您的虚拟机启用无密码 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_NAME
:您要访问的虚拟机的名称。USERNAME
:正在访问虚拟机的用户的用户名。PUBLIC_SSH_KEY
:用于 SSH 访问的公钥。通常,这是id_rsa.pub
文件的内容。EXPIRATION_TIME
:ttl
(存留时间)字段指定 SSH 密钥的有效期。例如,如果您指定
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
:托管您要访问的虚拟机的集群 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
停用客机代理
当您创建新虚拟机并设置 osType
字段时,系统将启用客机代理。此功能目前为预览版,您可以通过修改 VirtualMachine
自定义资源来停用它。停用客机代理会停用对虚拟机的无密码 SSH 访问。
如需停用客机代理,请执行以下操作:
在更改配置之前,请使用
kubectl
停止您的虚拟机:kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
修改虚拟机资源:
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: {}
在编辑器中保存并关闭更新后的虚拟机清单。
使用
kubectl
启动虚拟机:kubectl virt start VM_NAME --kubeconfig KUBECONFIG
使用 IP 地址连接
如果您的虚拟机具有可访问的 IP 地址,并且您已经拥有访问虚拟机的凭据,则可以使用 SSH、VNC 或 RDP 等协议进行连接。
通过 IP 地址连接
如果您可以直接连接到虚拟机的 IP 地址,请使用以下任一方法:
SSH
获取虚拟机的详细信息以查看其 IP 地址:
kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
替换以下值:
VM_NAME
:虚拟机的名称。VM_NAMESPACE
:虚拟机的命名空间。
以下示例输出显示了虚拟机信息和 IP 地址:
NAME STATUS AGE IP vm1 Running 7m 10.200.0.21
使用 SSH 客户端连接到您的虚拟机:
ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
替换以下值:
USERNAME
:虚拟机上帐号的用户名。IP_ADDRESS
:您在上一步获得的虚拟机的 IP 地址。PATH_TO_KEY
:SSH 私钥的路径。
VNC 或 RDP
虚拟网络计算 (VNC) 和远程桌面协议 (RDP) 可让您使用图形控制台访问虚拟机。使用 IP 地址时,您必须在客机操作系统中启用 VNC 或 RDP,然后才能使用 VNC 或 RDP 连接到虚拟机。如需了解如何启用和使用 VNC 或 RDP,请参阅您的客机操作系统的文档。
您还需要使用现有凭据登录虚拟机,例如您在创建虚拟机时为创建初始用户凭据而定义的凭据。
获取虚拟机的详细信息以查看其 IP 地址:
kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
替换以下值:
VM_NAME
:虚拟机的名称。VM_NAMESPACE
:虚拟机的命名空间。
以下示例输出显示了虚拟机信息和 IP 地址:
NAME STATUS AGE IP vm1 Running 7m 10.200.0.21
使用客户端工具和相应端口(例如 VNC 端口
5900
或 RDP 端口3389
)连接到上一步获得的虚拟机的 IP 地址。
通过 Service 连接
如果您的虚拟机连接至默认的 pod-network
,并且您无法直接与虚拟机的 IP 地址通信,请在负载均衡器 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
:要公开进行远程访问的虚拟机的名称。PORT_NAME
:您的协议的名称,例如ssh
、vnc
或rdp
。PROTOCOL_TYPE
:协议类型,例如tcp
(SSH 和 RDP)或udp
(VNC)。EXTERNAL_PORT
:要公开且用于连接的外部端口号。TARGET_PORT
:目标端口,例如22
(SSH)。
在编辑器中保存并关闭
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
:虚拟机上帐号的用户名。LOAD_BALANCER_IP_ADDRESS
:负载均衡器的 IP 地址。PATH_TO_KEY
:SSH 私钥的路径。
使用 SSH 直接连接
如果客户端连接到 Anthos clusters on Bare Metal 节点所在的物理网络,并且您不需要使用 SSH 隧道连接到集群,则可以使用 kubectl virt ssh
进行连接。
如需从控制台使用 SSH 通过
virtctl
插件连接 Linux 虚拟机,请执行以下操作:kubectl virt ssh USERNAME@VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
替换以下值:
USERNAME
:用于访问虚拟机的用户名。如果虚拟机上不存在此帐号,则会创建此帐号。VM_NAME
:您的虚拟机的名称。
使用 SSH 成功连接后,不再需要连接,请退出 SSH 会话:
exit
使用控制台直接连接
如果您没有直接网络连接到 Linux 虚拟机以进行 SSH 访问,请使用 Anthos VM Runtime 控制台连接到虚拟机的控制台。 此方法会打开串行控制台。连接后,您会看到一个命令提示符,而不是图形控制台。
如需从控制台访问 Linux 虚拟机,请使用
virtctl
插件:kubectl virt console VM_NAME --kubeconfig KUBECONFIG
将
VM_NAME
替换为虚拟机名称。出现提示时,请输入您的虚拟机的用户凭据。这些凭据必须存在于虚拟机上,或者在创建虚拟机时应用。如果需要,请参阅以下部分以了解在创建虚拟机时创建初始用户凭据。
成功连接到虚拟机的控制台后,如果不再需要连接,请退出虚拟机会话和控制台:
Ctrl + ]
使用 VNC 直接连接
您可以使用 kubectl virt vnc
命令打开虚拟网络计算 (VNC) 图形控制台以访问虚拟机。此方法适用于运行 Windows 或 Linux 客机操作系统的虚拟机。当您使用 kubectl virt vnc
命令时,Anthos VM Runtime 会为您打开 VNC,因此您无需在客机操作系统中启用 VNC。
您需要使用现有凭据登录虚拟机,例如您在创建虚拟机时为创建初始用户凭据而定义的凭据。
如需使用 VNC 访问虚拟机,请使用
virtctl
插件:kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
将
VM_NAME
替换为虚拟机名称。出现提示时,请输入您的虚拟机的用户凭据。
成功连接虚拟机的 VNC 会话且不再需要连接后,从虚拟机退出登录以关闭 VNC 连接。
创建初始用户凭据
使用控制台连接到虚拟机时,您必须指定用户凭据。对于 Linux 和 Windows 客机操作系统,创建初始用户凭据的过程有所不同。
Linux 客机操作系统
对于 Linux 虚拟机,用户凭据可以内置到自定义映像中,也可以在创建虚拟机时指定。
将
--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
:虚拟机的名称。USERNAME
:要在虚拟机中创建的帐号的用户名。PASSWORD
:用户帐号的密码。
此示例命令会创建一个 Linux 虚拟机来运行 Ubuntu 20.04。建议您在首次登录虚拟机后更改初始凭据。
后续步骤
- 管理 Anthos clusters on Bare Metal 中虚拟机的电源状态。
- 在 Anthos clusters on Bare Metal 中修改虚拟机。
- 在 Anthos clusters on Bare Metal 中查看虚拟机控制台日志。