创建 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-1subnet-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。