仅为 GKE 集群中的 1 个节点池设置 Cloud NAT

Setup Cloud NAT for only 1 node pool in GKE cluster

我有一个带有多个节点池的私有 gke 集群,阅读 documentation 看来,如果我创建一个 Cloud NAT,它似乎只能对整个集群执行此操作。有没有办法只配置集群的一个子集来访问通过 NAT 发送流量?我四处寻找,似乎无法将网络、IP 范围或子网分配给节点池,所以我不确定这是否可行。

您可以从 Google 检查 old nat gw solution,例如,基于 VM 实例而不是 Cloud NAT。执行所需操作的可能方法如下:

  1. 创建专用GKE node pool with tag
  2. 使用上面的 Terraform 示例或手动创建 NAT VM 实例
  3. 使用创建的 NAT VM 实例作为目标创建默认路由,并将此路由应用于带有您用于创建 GKE 节点池的标签的实例

引用的 nat gw 解决方案使用类似的技术,但它使用整个集群标签而不是单独的节点池标签将路由应用于所有节点池。

首先,我们必须概述您需要设置的内容。

组件:

1.) NAT 网关实例

2.) 网络标签和 VPC 路由

3.) 带有网络标签的节点池。

对于 1 和 2,您需要以与 GCE NAT tutorial 中所示类似的方式将另一个 GCE VM 实例配置为 NAT 网关。这应该会导致创建一个 NAT 实例和一个 VPC 路由,将网络流量从标记的资源引导到 NAT。

确保使用特定于将实例用作 NAT 的节点池的标签。

对于 3。为了将节点池指向 NAT 实例,您必须在节点上使用正确的网络标记,以便正确路由来自这些节点的流量。

Node/Nodepool with tags -> VPC Route -> NAT Instance -> Internet

为了将此应用于整个节点池,您需要在节点池级别应用标签,以便它级联到底层节点上,您可以了解如何操作 here。不幸的是,这对于现有的节点池是不可能的,因此您必须删除并重新创建具有相应标签的现有节点池,如下所示:

gcloud container node-pools create Proxy --cluster=prod-cluster --tags=NatRouteA

可以设置Cloud NAT for specific nodepool using ip-masquerade-agent.
要将代理限制为特定节点池,您需要使用 node affinity and/or taints and tolerations