创建 Cloud NAT 网关

概览

在此使用场景中,我们将创建一个 Cloud NAT 网关,并为其分配多个出站 IP。这些网关将从与网关中配置的匹配标签匹配的 pod 和虚拟机出站流量。网关会自动为每个可以通过它出站流量的端点分配一个出站 IP。

具有多个出站 IP 地址的网关设置示例

前提条件

在设置网关之前,您必须获取适当的 Identity and Access Management (IAM) 权限,确保您的项目具有适当的网络策略,并启用出站流量。

如需了解详情,请参阅 Cloud NAT 使用入门 。

Cloud NAT 网关使用外部 leaf 子网作为输入。如需详细了解如何为 Cloud NAT 配置外部子网,请参阅 为 Cloud NAT 创建外部子网。

确保 pod 或虚拟机配置兼容

如 NAT 概览中所述,Cloud NAT 与默认项目出站流量配置 不兼容。确保您要与 Cloud NAT 搭配使用的任何 pod 或虚拟机都没有标签 egress.networking.gke.io/enabled:true。

默认情况下,虚拟机外部访问 (VMEA) 会将虚拟机配置为使用默认项目出站流量配置出站流量。换句话说,它 会自动将标签 egress.networking.gke.io/enabled:"true" 添加到 虚拟机。如果该虚拟机也配置为使用 Cloud NAT 网关出站流量,则会导致 NAT 配置之间发生冲突。为避免此 冲突,对于与配置为通过 Cloud NAT 网关出站 流量的虚拟机关联的每个 VMEA,请确保与该虚拟机关联的 VMEA 具有注解 egress.networking.gke.io/use-cloud-nat:"true"。 然后,关联的虚拟机将仅通过 Cloud NAT 网关出站流量。

创建 Cloud NAT 网关

以下示例定义了一个 Cloud NAT 网关,其中包含两个外部叶子子网(subnet-1 和 subnet-2)。该网关将使用这些子网中的所有 IP(一个来自 subnet-1,四个来自 subnet-2),并自动将它们分配给具有指定标签的每个虚拟机或 pod 中的端点。多个 pod 或虚拟机可以获得相同的出站 IP 分配。

apiVersion: networking.gdc.goog/v1
kind: CloudNATGateway
metadata:
  namespace: project-1
  name: gateway-1
spec:
  workloadSelector:  # Immutable
    labelSelector:
      workloads:
        matchLabels:
          app: aa
  subnetRefs:        # Mutable
  - subnet-1
  - subnet-2

检查网关的状态

运行以下 kubectl 命令,检查网关的状态。

export MGMT_KUBECONFIG=<path_to_management_kubeconfig>
kubectl get cloudnatgateways gateway-1 -n project-1 --kubeconfig "${MGMT_KUBECONFIG:?}"

如果配置正确,Cloud NAT 网关的状态条件字段应显示类型为 Ready 的条件设置为 true,并且子网标记为 OK,如以下示例输出所示。

apiVersion: networking.gdc.goog/v1
kind: CloudNATGateway
metadata:
  namespace: project-1
  name: gateway-1
spec:
  workloadSelector:
    labelSelector:
      workloads:
        matchLabels:
          app: aa
  subnetRefs:
  - subnet-1
  - subnet-2
status:
  conditions:
  - lastTransitionTime: "2025-08-20T21:31:36Z"
    message: ""
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: Ready
  - lastTransitionTime: "2025-08-20T21:31:36Z"
    message: ""
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: SubnetsReady
  - lastTransitionTime: "2025-08-20T21:31:36Z"
    message: ""
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: PerimeterConfigurationReady
  - lastTransitionTime: "2025-08-20T21:31:36Z"
    message: ""
    observedGeneration: 1
    reason: Ready
    status: "True"
    type: EgressRoutesReady
  subnets:
  - name: subnet-1
    status: OK
  - name: subnet-2
    status: OK

Cloud NAT 网关状态包含以下 4 种类型的条件:

  • Ready:此条件总结了 Cloud NAT 网关的状态。如果网关已完全设置,则此 条件设置为 true。
  • SubnetsReady:此条件指示分配给网关的子网是否有效。
  • PerimeterConfigurationReady:此条件指示是否已配置边界配置(例如,分配给面向外部的节点的外部 IP 等)。
  • EgressRoutesReady:此条件指示是否已配置从来源端点到出站流量的路由。

测试流量

我们可以通过从分配给网关的某个 pod 或虚拟机向外部端点发出 curl 命令来测试流量。接收端点应看到与网关关联的某个出站 IP。