Google Distributed Cloud (GDC) air-gapped 使用基于密钥的 SSH 身份验证建立与虚拟机 (VM) 实例的连接。默认情况下,系统不会为具有操作系统的虚拟机上的本地用户配置密码。
准备工作
在连接到虚拟机之前,您必须满足以下前提条件:
- 启用访问权限管理。 如果未在来宾环境中启用访问权限管理,您将无法继续操作。默认情况下,新虚拟机上会启用访问权限管理。
- 启用虚拟机外部访问权限,允许任何对等方通过传输控制协议 (TCP) 端口 22 进行访问。
ProjectNetworkPolicy
(PNP) 自定义资源。
- 通过在项目中设置 PNP,您可以访问项目或组织之外的虚拟机。
- 如需诊断您是否没有 PNP,请咨询您的基础设施运营商 (IO)。
如需使用 gdcloud
命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud
CLI。Distributed Cloud 的所有命令都使用 gdcloud
或 kubectl
CLI,并且需要操作系统 (OS) 环境。
获取 kubeconfig 文件路径
如需针对管理 API 服务器运行命令,请确保您拥有以下资源:
登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。
使用管理 API 服务器的 kubeconfig 文件路径替换这些说明中的
MANAGEMENT_API_SERVER
。
请求权限和访问权限
如需执行本页面中列出的任务,您必须具有 Project VirtualMachine Admin 角色。按照相关步骤验证您是否在虚拟机所在项目的命名空间中拥有 Project VirtualMachine Admin (project-vm-admin
) 角色。
对于使用 GDC 控制台或 gdcloud CLI 的虚拟机操作,请让您的项目 IAM 管理员为您分配“Project VirtualMachine Admin”角色和“Project Viewer”角色 (project-viewer
)。
建立虚拟机连接
本部分介绍了如何建立与具有特定操作系统 (OS) 的虚拟机的连接。
连接到虚拟机
如需连接到具有特定操作系统的虚拟机,请使用 GDC 控制台、gdcloud CLI 或 Virtual Machine Manager API。
控制台
在导航菜单中,依次点击 Virtual Machines > Instances。
在虚拟机列表中,找到要连接的正在运行的虚拟机所在的行。在连接列中,点击 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
连接到虚拟机:
- 打开终端。
- 创建 SSH 密钥对。
- 上传具有存留时间 (TTL) 值的公钥和用户名。
GDC 会检索 SSH 密钥和用户名,并使用该用户名创建一个用户账号。在虚拟机上,GDC 会将公钥存储在虚拟机上您用户的 ~/.ssh/authorized_keys
文件中。
如需通过命令行连接到虚拟机,请完成以下步骤:
创建 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
您在虚拟机上的用户名,例如 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 create -f access_request.yaml --kubeconfig MANAGEMENT_API_SERVER
查看访问权限请求的状态:
kubectl get virtualmachineaccessrequests.virtualmachine.gdc.goog -n VM_NAMESPACE --kubeconfig MANAGEMENT_API_SERVER
将
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
替换为虚拟机的外部 ingress IP 地址。
问题排查
本部分介绍了如何排查在创建访问请求后连接到虚拟机实例时可能出现的问题。
请按照以下步骤操作,找出可能存在的问题:
验证虚拟机是否正在运行。在以下命令中,将可修改的变量替换为您的值:
kubectl get virtualmachines.virtualmachine.gdc.goog VM_NAME -n VM_NAMESPACE --kubeconfig MANAGEMENT_API_SERVER
如果虚拟机未运行,您将无法连接或配置新请求。
验证虚拟机是否已运行几分钟。如果虚拟机刚刚启动,则 SSH 访问所需的必要服务可能尚未运行。它们通常会在启动后五分钟内运行。
验证您是否未超出访问请求的 TTL 值。时间达到 TTL 值后,系统会移除相应键。
如果您的
VirtualMachineAccessRequest
显示configured
状态,请验证以下要求:- 您已在端口 22 上启用向虚拟机传输数据的功能。
- 您的机器路由到虚拟机。例如,您可以使用
curl -vso /dev/null --connect-timeout 5 EXTERNAL_IP:22
命令来检查路由。
如果您的
VirtualMachineAccessRequest
显示failed
状态,请查看完整状态并查看错误消息,了解导致请求失败的原因:kubectl describe virtualmachineaccessrequest.virtualmachine.gdc.goog AR_NAME -n VM_NAMESPACE --kubeconfig MANAGEMENT_API_SERVER
将上述命令中的可编辑变量替换为您自己的值。
如果
VirtualMachineAccessRequest
的状态为空,则访客环境可能未在运行。