提问者:小点点

如何在谷歌库伯内特斯引擎上使集群节点私有?


我注意到集群中的每个节点都有一个分配给它的外部IP。这似乎是谷歌库伯内特斯引擎的默认行为。

我认为我的集群中的节点应该只能从本地网络访问(通过其虚拟IP),但我甚至可以通过连接到其托管节点(不使用LoadBalancer)直接连接到在我的家用计算机上运行的pod上的mongo服务器。

我试图通过更改集群实例模板设置(将属性“外部IP”从“短暂”更改为“无”)使容器引擎不将外部IP分配给新创建的节点。但是在我这样做之后,GCE无法启动任何pod(得到“没有最低可用性”错误)。新实例甚至没有显示在我集群中的节点列表中。

在切换回带有外部IP的默认实例模板后,一切又顺利了。因此,出于某种原因,谷歌库伯内特斯引擎似乎要求集群节点是公共的。

您能否解释一下为什么会这样,以及是否有办法防止GKE将集群节点暴露在Internet上?我应该设置防火墙吗?我应该使用什么规则(因为节点是动态创建的)?

我认为谷歌不允许私有节点是一种安全问题…假设有人在数据库管理系统上发现了一个安全漏洞。如果我们的数据库节点没有暴露在互联网上,我们会更乐意解决这个问题(应用补丁、升级版本)。


共3个答案

匿名用户

GKE最近添加了一个新功能,允许您创建私有集群,即节点没有公共IP地址的集群。

匿名用户

这就是GKE的设计方式,我知道没有办法绕过它。使用公共IP运行kubernetes节点没有坏处,如果这些是用于节点之间通信的IP,您就无法避免它。

至于您的安全问题,如果您在kubernetes上运行该示例DB,即使您使用公共IP它也无法访问,因为这只会在内部pod到pod网络上,而不是它们自己的节点上。

匿名用户

如本文所述,您可以使用网络标记来识别哪些GCE VM或GKE群集受某些防火墙规则和网络路由的约束。

例如,如果您已创建防火墙规则以允许流量访问端口27017、27018、27019,这是MongoDB使用的默认TCP端口,请为所需实例提供一个标记,然后使用该标记应用允许这些端口访问这些实例的防火墙规则。

此外,还可以通过在新节点池中的所有节点上应用GCE标签来创建GKE集群,因此这些标签可以在防火墙规则中用于允许/拒绝到节点的所需/不需要的流量。这在本文的--tags标志下进行了描述。