连接到虚拟机

本文档介绍了如何在 Google Distributed Cloud (GDC) 气隙环境中建立与虚拟机 (VM) 实例的网络连接。

Google Distributed Cloud (GDC) 气隙环境使用基于密钥的 SSH 身份验证来建立与虚拟机 (VM) 实例的连接。默认情况下,系统不会为具有操作系统 (OS) 的虚拟机上的本地用户配置密码。

本文档适用于平台管理员或应用运维人员组中连接到 Distributed Cloud 环境中的虚拟机实例的开发者。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众群体

准备工作

在连接到虚拟机之前,您必须满足以下前提条件:

  • 登录集群的访问权限。按照 登录 中的 CLI 步骤登录集群。
  • 如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装、 并配置 gdcloud CLI。 Distributed Cloud 的所有命令都使用 gdcloudkubectl CLI,并且需要操作系统 (OS) 环境。

    获取 kubeconfig 文件路径

    如需针对 Management API 服务器运行命令,请确保您拥有以下资源:

    1. 登录并生成 Management API 服务器的 kubeconfig 文件(如果您没有该文件)。

    2. 使用 Management API 服务器的 kubeconfig 文件的路径替换这些说明中的 MANAGEMENT_API_SERVER

    请求 IAM 角色

    请与您的项目 IAM 管理员联系,以请求您的项目的以下角色:

    • 虚拟机项目管理员 (project-vm-admin):在项目命名空间中创建、修改、列出和删除虚拟机。

    • 项目查看者(project-viewer):查看项目命名空间中的所有资源。

    所有虚拟机角色都必须绑定到虚拟机所在项目的命名空间。 按照相应步骤验证 您的访问权限。

    建立虚拟机连接

    本部分介绍了如何建立与具有特定操作系统 (OS) 的虚拟机的连接。

    连接到虚拟机

    如需建立与具有特定操作系统的虚拟机的连接,请使用 GDC 控制台、gdcloud CLI 或 虚拟机管理器 API

    控制台

    1. 在导航菜单中,点击虚拟机 > 实例

    2. 在虚拟机列表中,找到要连接的正在运行的虚拟机的行。在连接 列中,点击 SSH

    3. 系统会打开 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 连接。

    以下示例代码段展示了一个 VirtualMachine 资源,其中 GuestEnvironmentSynced 条件设置为 True

    {
        "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 文件中。

    请按照以下步骤从命令行连接到虚拟机:

    1. 创建 SSH 密钥对和用户名。

      在 OS 工作站上,使用 ssh-keygen 实用程序创建新的 SSH 密钥对。以下代码示例会创建一个 RSA (Rivest–Shamir–Adleman) 密钥对:

      ssh-keygen -t rsa \
        -f ~/.ssh/KEY_FILENAME \
        -C USERNAME \
        -b 2048
      

      使用以下定义替换变量。

      变量定义
      KEY_FILENAME SSH 密钥文件的名称。例如,如果文件名为 my-ssh-key,则系统会生成一个名为 my-ssh-key 的私钥文件和一个名为 my-ssh-key.pub 的公钥文件。
      USERNAME 您在虚拟机上的用户名,例如 testusertestuser_gmail_com

      ssh-keygen 实用程序会将您的私钥文件保存在 ~/.ssh/KEY_FILENAME 路径中,并将公钥文件保存在 ~/.ssh/KEY_FILENAME.pub 路径中。

      用户 testuser 的公钥类似于以下示例:

      ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... testuser
      
    2. 将您的密钥上传到虚拟机,并使用您的公钥、用户名和密钥的存留时间 (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 您在虚拟机上的用户名,例如 testusertestuser_gmail_com
      VM_NAME 虚拟机实例的名称。
    3. 创建密钥:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        create -f access_request.yaml
      
    4. 检查访问权限请求的状态:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n VM_NAMESPACE \
        get virtualmachineaccessrequests.virtualmachine.gdc.goog
      

      VM_NAMESPACE 替换为虚拟机的命名空间。

      configured 状态表示您可以连接到虚拟机。

    5. 连接到虚拟机:

      ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP
      

      替换以下值:

      • PATH_TO_PRIVATE_KEY 替换为与您添加到虚拟机的公钥对应的 SSH 私钥文件的路径。
      • USERNAME 替换为您在创建 SSH 密钥时指定的用户名。例如,cloudysanfrancisco_example_comcloudysanfrancisco
      • EXTERNAL_IP 替换为虚拟机的外部 入站流量 IP 地址

    问题排查

    本部分介绍了如何在创建访问权限请求后排查连接到虚拟机实例时可能出现的问题。

    请按照以下步骤操作,以找出可能的问题:

    1. 验证虚拟机是否正在运行。在以下命令中,将可修改的变量替换为您的值:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n VM_NAMESPACE \
        get virtualmachines.virtualmachine.gdc.goog VM_NAME
      

      如果虚拟机未运行,您将无法连接或配置新请求。

    2. 验证虚拟机是否已运行几分钟。如果虚拟机刚刚启动,则 SSH 访问所需的必要服务可能尚未运行。 通常,这些服务会在启动后五分钟内运行。

    3. 验证您是否未超出访问权限请求的 TTL 值。时间达到 TTL 值后,系统会移除密钥。

    4. 如果您的 VirtualMachineAccessRequest 显示 configured 状态,请验证以下要求:

      1. 您已在端口 22 上启用向虚拟机传入的数据传输。
      2. 您的机器会路由到虚拟机。例如,您可以使用
        curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22 命令 检查路由。
    5. 如果您的 VirtualMachineAccessRequest 显示 failed 状态,请查看完整状态并查看错误消息,以了解导致请求失败的原因:

      kubectl --kubeconfig MANAGEMENT_API_SERVER \
        -n VM_NAMESPACE \
        describe virtualmachineaccessrequest.virtualmachine.gdc.goog AR_NAME
      

      将上述命令中可修改的变量替换为您自己的值。

    6. 如果 VirtualMachineAccessRequest 的状态为空,则客机环境可能未运行。