本文档介绍了如何在 Google Distributed Cloud (GDC) 气隙环境中配置虚拟机 (VM) 实例上的 IP 地址。
您可以允许从外部网络或其他组织访问任何虚拟机 (VM) 实例,这称为“虚拟机入站流量”。组织项目中的虚拟机工作负载可以访问外部网络,也可以访问当前虚拟机(如果该虚拟机向其他组织中的服务公开,则称为虚拟机出站流量)。
您可以使用以下方法之一来控制虚拟机的入站和出站流量:
- 外部负载均衡器和 Cloud NAT 网关(首选):创建外部负载均衡器 (ELB) 以处理入站流量,并创建 Cloud NAT 网关以处理出站流量。
VirtualMachineExternalAccess(VMEA):使用 Distributed Cloud VMM API 或 Distributed Cloud CLI 一起控制虚拟机的入站流量和出站流量。Distributed Cloud 已弃用使用 GDC 控制台配置 VMEA 的方法,并且 VMEA 不再是首选选项。您仍然可以使用 Distributed Cloud VMM API 或 GDC 控制台查看为虚拟机实例启用的入站和出站 IP 地址。
本文档适用于平台管理员或应用运维人员群组中的开发者,这些开发者需要在 Distributed Cloud 环境中为虚拟机配置 IP 地址。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众群体。
准备工作
如需使用 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):查看项目命名空间中的所有资源。
所有虚拟机角色都必须绑定到虚拟机所在项目的命名空间。按照相关步骤验证您的访问权限。
配置 VirtualMachineExternalAccess (VMEA)
VirtualMachineExternalAccess (VMEA) 是一种用于控制虚拟机入站流量和虚拟机出站流量的机制。VMEA 无法分别控制虚拟机入站流量和虚拟机出站流量。虚拟机的入站流量和出站流量必须同时启用或停用。
您可以通过界面或 Distributed Cloud VMM API 配置和控制 VMEA。一个虚拟机只能有一个 VMEA。如果虚拟机没有 VMEA,则默认情况下会停用入站和出站流量。
启用外部访问权限
如需启用具有外部访问权限的虚拟机以进行数据传入和传出,您可以从 GDC 控制台或分布式云 Virtual Machine Manager API 配置 VMEA。
默认情况下,系统允许项目内网络流量,您可以直接访问项目内的虚拟机。网络政策会阻止从项目外部到虚拟机的全部入站流量。您必须手动创建新的网络政策,以允许源 IP 地址通过数据转入来访问虚拟机。此网络政策可以是跨项目流量网络政策,也可以是跨组织流量网络政策。位置取决于您要从哪个位置访问虚拟机。
您可以在 VMEA 规范的 enabled 字段中指定 true 或 false,以启用和停用虚拟机的外部访问权限。对于虚拟机 Ingress,您可以在 VMEA 规范的 ports 字段中指定要添加的每个端口的名称、协议和端口号,以配置端口中的数据传输。
如需通过创建新的 VMEA 来启用虚拟机的外部访问权限,请完成以下操作:
API
运行以下命令:
kubectl --kubeconfig MANAGEMENT_API_SERVER \
apply -n PROJECT -f - <<EOF
apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachineExternalAccess
metadata:
name: VM_NAME
spec:
enabled: true
ports:
- name: PORT_NAME
protocol: PROTOCOL
port: PORT_NUMBER
EOF
执行以下变量替换操作:
- MANAGEMENT_API_SERVER:Management API 服务器的 kubeconfig 文件
- VM_NAME:您的虚拟机的名称
- PORT_NAME:端口名称
- PROTOCOL:您希望入站流量服务使用的协议。协议名称必须采用大写形式,并且是 Kubernetes 支持的协议,例如
TCP、UDP或SCTP - PORT_NUMBER:端口号
如需通过 VMM API 修改现有 VMEA 以启用虚拟机的外部访问权限,请运行以下命令:
kubectl --kubeconfig MANAGEMENT_API_SERVER \
-n PROJECT \
edit virtualmachineexternalaccesses.virtualmachine.gdc.goog VM_NAME
gdcloud
使用带有 --enable-external-access 标志的 gdcloud compute 命令在虚拟机实例上启用外部访问权限:
gdcloud compute instances create VM_NAME \
--project PROJECT \
--machine-type MACHINE_TYPE \
--image IMAGE \
--image-project IMAGE_PROJECT \
--enable-external-access
执行以下变量替换操作:
- VM_NAME:虚拟机的名称
- PROJECT:虚拟机所在的 Distributed Cloud 项目
- MACHINE_TYPE:虚拟机实例的预定义机器类型的名称
- IMAGE:实例的启动映像名称
- IMAGE_PROJECT:实例的启动映像所属的项目
停用外部访问权限
如果虚拟机没有对应的 VMEA,则入站流量和出站流量都会被停用。如果虚拟机具有相应的 VMEA,您可以通过将 enabled 字段设置为 false 或直接删除 VMEA 来停用 VMEA。您可以通过 Distributed Cloud VMM API 执行这些操作。
如需停用外部访问权限,请完成以下步骤:
API
通过删除 VMEA 停用外部访问权限:
kubectl --kubeconfig MANAGEMENT_API_SERVER \
-n PROJECT \
delete virtualmachineexternalaccesses.virtualmachine.gdc.goog VM_NAME
替换以下内容:
- MANAGEMENT_API_SERVER:Management API 服务器的 kubeconfig 文件
- VM_NAME:虚拟机的名称
- PROJECT:虚拟机所在的 Distributed Cloud 项目
通过修改 VMEA 停用外部访问权限:
kubectl --kubeconfig MANAGEMENT_API_SERVER \
-n PROJECT \
edit virtualmachineexternalaccesses.virtualmachine.gdc.goog VM_NAME
将 enabled 字段更新为 false。
入站
查看 Ingress IP 地址
如果虚拟机启用了 Ingress,则在创建后,GDC 控制台上会显示 Ingress IP 地址。您还可以在 GDC 控制台的虚拟机详情页面中找到此入站 IP 地址。
如需获取 IP 地址,请使用 Distributed Cloud VMM API。完成以下操作:
API
提取 IP 地址:
kubectl --kubeconfig MANAGEMENT_API_SERVER \
-n PROJECT \
get virtualmachineexternalaccesses.virtualmachine.gdc.goog VM_NAME \
-ojsonpath='{.status.ingressIP}'
对于具有不同操作系统 (OS) 的虚拟机,请使用 ssh 命令通过入口 IP 地址和您已通过 TCP 启用的端口进入虚拟机。
修改 Ingress
为虚拟机启用 VMEA 后,您可以通过修改 VMEA 自定义入站流量。您可以直接从 GDC 控制台修改虚拟机入站流量的规范。您还可以使用 kubectl CLI 根据 VMEA 的规范修改虚拟机的入站流量。
如需修改 VMEA 以自定义入站流量,请完成以下操作:
例如,使用以下命令通过 TCP 协议在现有虚拟机入站流量中添加端口 PORT_NUMBER:
控制台
直接从 GDC 控制台修改虚拟机 Ingress 服务上的端口:
- 在垂直导航菜单中,点击实例。
- 在该页面上,滚动到网络详情。
点击 Ingress Ports(入站端口)上的修改图标,以修改入站端口。

API
kubectl --kubeconfig MANAGEMENT_API_SERVER \
-n PROJECT \
patch virtualmachineexternalaccesses.virtualmachine.gdc.goog VM_NAME \
--type "json" -p '[{"op":"add","path":"/spec/ports/-","value": {"name":"PORT_NAME","port":PORT_NUMBER, "Protocol":"TCP"}}]'
替换以下内容:
- MANAGEMENT_API_SERVER:Management API 服务器的 kubeconfig 文件
- VM_NAME:虚拟机的名称
- PROJECT:虚拟机所在的 Distributed Cloud 项目
- PORT_NAME:要添加的端口的名称
- PORT_NUMBER:端口号
启用使用非 TCP 协议的 Ingress
Distributed Cloud 可让您使用不同的协议启用虚拟机 Ingress。默认情况下,虚拟机 Ingress 服务使用 TCP 协议。您可以为虚拟机添加自己的非 TCP 协议入站流量。 Distributed Cloud 支持以下协议:
- 传输控制协议 (TCP)。
- 用户数据报协议 (UDP)。
- 流控制传输协议 (SCTP)。
您可以在创建 VMEA 时指定不同的协议名称,以启用使用非 TCP 协议的数据传输。
出站
组织项目中的虚拟机工作负载可以访问外部网络,也可以向其他组织中的服务公开。如果您为虚拟机启用出站数据传输,系统会生成一个出站 IP 地址。虚拟机使用此 IP 地址连接到外部服务。
如需将此 IP 地址数据转出外部网络,您可能需要应用项目网络政策。如需了解详情,请参阅出站跨组织流量网络政策。
如果虚拟机配置为使用 Cloud NAT 网关发送出站流量,则必须向虚拟机外部访问对象添加以下注解,以保留出站连接:egress.networking.gke.io/use-cloud-nat:"true"
查看出站 IP 地址
如果虚拟机启用了出站流量,则在创建后,GDC 控制台上会显示出站流量 IP 地址。您还可以从虚拟机详情页面中找到此出站 IP 地址。
如需查看出站 IP 地址,请完成以下操作:
API
提取 IP 地址:
kubectl --kubeconfig MANAGEMENT_API_SERVER \
-n PROJECT \
get virtualmachineexternalaccesses.virtualmachine.gdc.goog VM_NAME \
-ojsonpath='{.status.egressIP}'
替换以下内容:
- MANAGEMENT_API_SERVER:Management API 服务器的 kubeconfig 文件
- VM_NAME:虚拟机的名称
- PROJECT:虚拟机所在的 Distributed Cloud 项目
虚拟机出站流量基于项目。同一项目中的虚拟机会包含相同的出站流量 IP 地址。
控制出站流量
在之前的 Distributed Cloud 版本中,您必须重新启动虚拟机,才能将出站流量更改反映到正在运行的虚拟机中。在版本 1.11 中,您无需重启虚拟机即可启用和停用虚拟机出站流量。此更改会在您更新 VMEA 后立即生效。