启用 IP 地址

本文档介绍了如何在 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 服务器运行命令,请确保您拥有以下资源:

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

  2. 使用 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 服务上的端口:

  1. 在垂直导航菜单中,点击实例。
  2. 在该页面上,滚动到网络详情。
  3. 点击 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 后立即生效。