我想使用Cloud NAT设置NAT网关,以便公共GKE群集中的VM / Pod使用静态IP地址。
我面临的问题是NAT网关似乎仅在VM没有其他选择的情况下才使用,即:
仅当没有其他匹配的路由或路径时,GCP才会使用Cloud NAT转发流量。
但是对于公共GKE集群,VM具有临时外部IP,因此它们不使用网关。
根据文档:
如果您在VM的接口上配置了外部IP,则不会对此类数据包执行NAT。但是,分配给接口的别名IP范围仍然可以使用NAT,因为它们不能使用外部IP来访问Internet。
和
使用此配置,您可以通过SSH直接连接到GKE虚拟机,但是GKE容器/容器使用Cloud NAT来访问Internet。
这就是我想要的,但是我看不到要在这里设置什么。
insertAfterQ="OtherCustomTab"
暗示什么以及如何设置?
答案 0 :(得分:2)
”不幸的是,当前情况并非如此。尽管Cloud NAT仍处于Beta版,但某些设置尚未完全到位,因此即使使用IP别名,pod仍在使用SNAT。由于节点IP的SNAT,吊舱将不会使用Cloud NAT。“
确实,正如Patrick W上面所说,它当前无法像所记录的那样工作。我也尝试过,并在Kubernetes Engine频道的GCP Slack组与其他人进行了交谈。他们还在测试中确认它仅适用于GKE私有集群。我们尚未开始使用私有集群。在这个简单的问题上,我找不到可靠的文档:如果创建一个私有集群,该集群中是否仍可以有公共K8S服务(又名负载均衡器)?有关私有GKE群集的所有文档都表明您不希望任何外部流量进入,但我们正在GKE群集上运行面向Internet的生产服务。
我向GCP支持提交了有关Cloud NAT问题的票证,他们的意思是:
““我一直在审查您的配置,并且Cloud NAT无法正常工作的原因是您的集群不是私有的。 要将Cloud NAT与GKE一起使用,您必须创建一个私有集群。在非专用群集中,群集的公用IP地址用于主机和节点之间的通信。这就是为什么GKE不考虑您拥有的Cloud NAT配置的原因。 创建私有集群将使您可以将Cloud NAT和GKE结合在一起。
我了解从我们的文档中了解得还不是很清楚,我已经报告了此问题,并对其进行了确切解释。”
我回复了他们,要求他们按记录进行工作,而不是更改他们的文件。我正在等待他们的更新...
答案 1 :(得分:1)
这里的想法是,如果您对群集使用本地VPC(Ip别名),则your pods will not use SNAT when routing out of the cluster。如果没有SNAT,则pod不会使用该节点的外部IP,因此应该使用Cloud NAT。
不幸的是,当前情况并非如此。尽管Cloud NAT仍处于Beta版,但某些设置尚未完全就绪,因此即使使用IP别名,吊舱仍在使用SNAT。由于节点IP的SNAT,Pod将不会使用Cloud NAT。
话虽如此,为什么不使用私有集群?它更加安全,可以与Cloud NAT一起使用。您不能直接通过SSH进入节点,但是A)您可以在项目中创建可以SSH using the internal IP flag的堡垒VM实例,并且B)通常在大多数情况下不需要通过SSH进入节点。
答案 2 :(得分:1)
将谷歌的 Cloud NAT 与公共 GKE 集群一起使用是可行的!
首先需要使用保留的外部 IP 设置云 NAT 网关和路由器。
一旦完成,ip-masq-agent
配置需要更改为不伪装外部 IP 的 pod IP,这些外部 IP 是来自集群内部的请求的目标。在 ip-masq-agent 的 ConfigMap 中的 nonMasqueradeCidrs
列表中更改配置。
这种工作方式是,对于 nonMasqueradeCidrs
列表中的 IP 的每个传出请求都没有进行 IP 伪装。所以请求似乎不是来自节点 IP,而是来自 pod IP。然后,Cloud NAT 网关/路由器会自动对这个内部 IP 进行 NAT。结果是请求似乎来自云 NAT 路由器的(稳定)IP。
来源:
答案 3 :(得分:0)
这可能对某人有帮助:
您可以简单地使用TF 11
版本运行该terraform脚本。它将创建VM并将其用作NAT网关,并通过它路由所有公共VM流量。
对于生产用例,还具有HA设置: