本文档介绍了如何建立与 Google Distributed Cloud (GDC) 网闸隔离配置中的虚拟机 (VM) 实例的网络连接。
Google Distributed Cloud (GDC) 网闸隔离配置使用基于密钥的 SSH 身份验证来建立与虚拟机 (VM) 实例的连接。默认情况下,系统不会为具有操作系统 (OS) 的虚拟机上的本地用户配置密码。
本文档适用于平台管理员或应用运维人员群组中连接到 Distributed Cloud 环境中的虚拟机实例的开发者。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。
准备工作
在连接到虚拟机之前,您必须满足以下前提条件:
- 启用访问管理。 如果未在客户机环境中启用访问管理,您将无法继续操作。默认情况下,新虚拟机上会启用访问管理。
- 为传输控制协议 (TCP) 端口 22 上的任何对等方启用虚拟机外部访问权限。
如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。Distributed Cloud 的所有命令都使用 gdcloud 或 kubectl CLI,并且需要操作系统 (OS) 环境。
获取 kubeconfig 文件路径
如需针对 Management API 服务器运行命令,请确保您拥有以下资源:
如果您没有 Management API 服务器的 kubeconfig 文件,请登录并生成该文件。
在这些说明中,请使用 Management API 服务器的 kubeconfig 文件的路径替换
MANAGEMENT_API_SERVER。
申请 IAM 角色
请与您的 IAM 项目管理员联系,请求其为您的项目授予以下角色:
Virtual Machine Project Admin (
project-vm-admin):在项目命名空间中创建、修改、列出和删除虚拟机。Project Viewer(
project-viewer):查看项目命名空间中的所有资源。
所有虚拟机角色都必须绑定到虚拟机所在项目的命名空间。 按照相关步骤验证您的访问权限。
建立虚拟机连接
本部分介绍如何与具有特定操作系统 (OS) 的虚拟机建立连接。
连接到虚拟机
如需与具有特定操作系统的虚拟机建立连接,请使用 GDC 控制台、gdcloud CLI 或 虚拟机管理器 API。
控制台
在导航菜单中,点击虚拟机 > 实例。
在虚拟机列表中,找到要连接到的正在运行的虚拟机所在的行。在连接列中,点击 SSH。
系统会打开 SSH 浏览器终端。在 shell 中输入任意命令,或点击 FTP 浏览文件结构并上传文件。
gdcloud
通过运行 gdcloud compute ssh 命令使用 SSH 连接到虚拟机:
gdcloud compute ssh VM_NAME \
--project=PROJECT_ID
执行以下变量替换操作:
- VM_NAME:虚拟机的名称。
- PROJECT_ID:包含虚拟机的项目 ID。
如果您已为 CLI 设置默认属性,则可以在此命令中省略 --project 标志。例如:
gdcloud compute ssh VM_NAME
API
VirtualMachine 资源使用 GuestEnvironmentSynced 条件来指示其启动状态。当 GuestEnvironmentSynced 条件为 True 时,表示虚拟机已完成启动,可以进行 SSH 连接。
以下示例代码段展示了 GuestEnvironmentSynced 条件设置为 True 的 VirtualMachine 资源:
{
"apiVersion": "virtualmachine.gdc.goog/v1",
"kind": "VirtualMachine",
...
"status": {
"conditions": [
{
"lastTransitionTime": "2026-01-25T09:52:52Z",
"message": "No message available",
"observedGeneration": 3,
"reason": "AccessManagementReady",
"status": "True",
"type": "GuestEnvironmentSynced"
},
],
},
}
确认虚拟机的 GuestEnvironmentSynced 状态为 True 后,请执行以下操作连接到虚拟机:
- 打开终端。
- 创建 SSH 密钥对。
- 上传公钥和用户名,并指定存留时间 (TTL) 值。
GDC 会检索 SSH 密钥和用户名,并使用该用户名创建一个用户账号。在虚拟机上,GDC 会将公钥存储在虚拟机上您用户的 ~/.ssh/authorized_keys 文件中。
执行以下步骤,从命令行连接到虚拟机:
创建 SSH 密钥对和用户名。
在操作系统工作站上,使用
ssh-keygen实用程序创建新的 SSH 密钥对。以下代码示例会创建一个 RSA(Rivest–Shamir–Adleman)密钥对:ssh-keygen -t rsa \ -f ~/.ssh/KEY_FILENAME \ -C USERNAME \ -b 2048根据以下定义替换变量。
变量 定义 KEY_FILENAMESSH 密钥文件的名称。例如,如果文件名为 my-ssh-key,则系统会生成一个名为my-ssh-key的私钥文件和一个名为my-ssh-key.pub的公钥文件。USERNAME您在虚拟机上的用户名,例如 testuser或testuser_gmail_com。ssh-keygen实用程序会将您的私钥文件保存在~/.ssh/KEY_FILENAME路径中,并将公钥文件保存在~/.ssh/KEY_FILENAME.pub路径中。用户
testuser的公钥类似于以下示例:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser将密钥上传到虚拟机,并使用公钥、用户名和密钥的存留时间 (TTL) 值创建 Kubernetes 资源。
以下示例使用
access_request.yaml文件向具有KEY_FILENAME私钥且 TTL 值为 10 分钟的虚拟机实例授予访问权限:apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineAccessRequest metadata: namespace: VM_NAMESPACE name: AR_NAME spec: ssh: key: | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... cloudysanfrancisco ttl: 10m user: USERNAME vm: VM_NAME根据以下定义替换变量:
变量 定义 VM_NAMESPACE虚拟机的命名空间。 AR_NAME访问权限请求名称。 USERNAME您在虚拟机上的用户名,例如 testuser或testuser_gmail_com。VM_NAME虚拟机实例的名称。 创建密钥:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ create -f access_request.yaml查看访问权限请求的状态:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n VM_NAMESPACE \ get virtualmachineaccessrequests.virtualmachine.gdc.goog将
VM_NAMESPACE替换为虚拟机的命名空间。configured状态表示您可以连接到虚拟机。连接到虚拟机:
ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP替换以下值:
PATH_TO_PRIVATE_KEY替换为与您添加到虚拟机的公钥对应的 SSH 密钥文件的路径。- 将
USERNAME替换为您在创建 SSH 密钥时指定的用户名。例如cloudysanfrancisco_example_com或cloudysanfrancisco。 EXTERNAL_IP:替换为虚拟机的外部入站流量 IP 地址。
问题排查
本部分介绍如何排查在创建访问请求后连接到虚拟机实例时可能发生的问题。
请按照以下步骤找出可能存在的问题:
验证虚拟机是否正在运行。在以下命令中,将可修改的变量替换为您的值:
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n VM_NAMESPACE \ get virtualmachines.virtualmachine.gdc.goog VM_NAME如果虚拟机未运行,您将无法连接或配置新请求。
验证虚拟机是否已运行几分钟。如果虚拟机刚刚启动,则 SSH 访问所需的服务可能尚未运行。通常,它们会在启动后 5 分钟内运行。
验证您没有超出访问请求的 TTL 值。当时间达到 TTL 值后,该键会被移除。
如果您的
VirtualMachineAccessRequest显示configured状态,请验证以下要求:- 您在端口 22 上启用了到虚拟机的数据传输。
- 您的机器会路由到虚拟机。例如,您可以使用
curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22命令来检查路由。
如果您的
VirtualMachineAccessRequest显示failed状态,请查看完整状态并查看指示导致请求失败的原因的出错提示:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n VM_NAMESPACE \ describe virtualmachineaccessrequest.virtualmachine.gdc.goog AR_NAME将上述命令中的可修改变量替换为您自己的值。
如果
VirtualMachineAccessRequest的状态为空,则客机环境可能未运行。