创建 Cloud NAT 网关

概览

在此使用情形中,我们将创建一个分配了多个出站 IP 的 Cloud NAT 网关。这些网关将从与网关中配置的匹配标签相匹配的 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 具有注解 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 之一。