为公共GKE集群设置Cloud NAT

15
我想设置一个NAT网关,使用Cloud NAT,以便公共GKE集群中的VMs/Pods使用静态IP地址。我面临的问题是,如果VM有其他选项,则似乎仅使用NAT网关,即:
GCP仅在没有其他匹配的流量路由或路径时才使用Cloud NAT转发流量。
但是,在公共GKE集群的情况下,VM具有短暂的外部IP,因此它们不使用网关。
根据文档:
如果在VM的接口上配置了外部IP[...],则不会对这些数据包执行NAT。然而,分配给接口的别名IP范围仍然可以使用NAT,因为它们无法使用外部IP连接到Internet。
有了这个配置,您可以直接通过SSH连接到GKE VM,但GKE pod/容器仍然可以使用Cloud NAT连接到Internet。
这就是我想要的,但我不明白要设置什么。别名IP范围分配给接口仍然可以使用NAT意味着什么?如何设置这个?
3个回答

7
“不幸的是,目前情况并非如此。虽然Cloud NAT仍处于Beta版本,但某些设置尚未完整放置,因此Pod即使使用IP别名仍然使用SNAT。由于SNAT到节点的IP,Pod将不使用Cloud NAT。”
正如Patrick W在上面所说的那样,目前文档中描述的方式并不适用。我也尝试过,并与在Kubernetes Engine频道的GCP Slack小组的人交谈过。在测试中,他们也确认它只能与GKE私有集群一起使用。我们还没有开始使用私有集群。我无法找到有关这个简单问题的可靠文档:如果我创建一个私有集群,是否可以在该集群中仍然具有公共的K8S服务(即负载均衡器)?关于私有GKE集群的所有文档都表明您不希望有任何外部流量进入,但我们正在运行生产面向互联网的服务在我们的GKE集群上。
我向GCP支持部门提交了一个关于Cloud NAT问题的工单,以下是他们的回复:
“我一直在审核您的配置,Cloud NAT无法工作的原因是因为您的集群不是私有的。要使用Cloud NAT与GKE结合使用,您必须创建一个私有集群。在非私有集群中,群集的公共IP地址用于主节点和节点之间的通信。这就是为什么GKE不会考虑您拥有的Cloud NAT配置。创建私有集群将允许您将Cloud NAT和GKE组合使用。
我理解我们的文档并不清晰,并已报告此问题以澄清并解释它应该如何工作。”
我回复要求他们按照文档中描述的方式使其正常工作,而不是更改他们的文档。我正在等待他们的更新...”

3
回答自己的问题,以便其他人可以找到:GCP Slack Kubernetes 频道回答/确认了我的问题:“是的。我们在私有集群中拥有面向互联网的服务类型 LB。在这种情况下,我将尽快将所有的 GKE 集群转换为私有集群。我建议你也这样做,Sylvain。 - Ryan White
3
确认,我刚刚在我们的一个开发环境中以“私有集群”模式(我们使用 Terraform 进行所有操作)重建了 GKE 集群,并且确实:节点不再具有公共 IP 地址,我成功将它们以前使用的静态公共 IP 映射到我们的 Cloud NAT 档案中,现在节点和其中的 PODs 在出站时都会被 NAT 到 Cloud NAT IP 池!很酷! - Ryan White
4
你们知道2019年有没有发生什么变化吗? :) - alexpirine

7
使用谷歌的Cloud NAT与公共GKE集群一起使用是可行的!
首先,需要使用保留的外部IP设置Cloud NAT网关和路由器。
完成此操作后,需要更改ip-masq-agent配置,以使内部群集中来自外部IP的请求不对Pod IP进行伪装。更改在ip-masq-agent的ConfigMap中的nonMasqueradeCidrs列表中进行。
这是工作原理:对于nonMasqueradeCidrs列表中IP的所有传出请求,不进行IP伪装。因此,请求似乎并非来自节点IP,而是来自Pod IP。然后,此内部IP将由Cloud NAT网关/路由器自动进行NAT。结果是,该请求似乎来自Cloud NAT路由器的(稳定)IP。
来源:

5
这里的想法是,如果您为集群使用本地VPC(IP别名),您的Pod在路由出集群时将不使用SNAT。 没有SNAT,Pod将不使用节点的外部IP地址,因此应该使用Cloud NAT。
不幸的是,目前情况并非如此。 虽然Cloud NAT仍处于Beta版,但某些设置尚未完全就位,因此即使进行IP别名,Pod仍在使用SNAT。 由于SNAT到节点的IP,Pod将不使用Cloud NAT。
话虽如此,为什么不使用私有集群呢?它更安全,并且可以与Cloud NAT配合使用。 您无法直接SSH到节点,但是A)您可以在项目中创建一个堡垒VM实例,该实例可以 使用内部IP标志进行SSH,B)大多数情况下您通常不需要SSH进入节点。

谢谢,我确实在想为什么即使启用了IP别名,Cloud NAT也没有被使用。看起来我们唯一的选择就是切换到私有集群或自己部署NAT网关了。 - Sylvain
自从私有集群进入Beta测试以来,我一直在使用它们,效果非常好,特别是在使用Cloud NAT时非常方便。 - Patrick W
1
@PatrickW,你是如何处理私有集群中的 kubectl 的? - jonathancardoso
即使使用私有集群,主端点仍然可以公开暴露。如果您知道只会在同一VPC内管理集群,请继续删除外部端点。否则,请保留外部端点并使用主授权网络来保护它。 - Patrick W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接