如何在 Google Kubernetes Engine 上使集群节点私有化?

How to make cluster nodes private on Google Kubernetes Engine?

我注意到集群中的每个节点都分配了一个外部 IP。这似乎是 Google Kubernetes Engine 的默认行为。

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

我试图通过更改集群实例模板设置(将 属性 "External IP" 从 "Ephemeral" 更改为 "None").但是在我这样做之后,GCE 无法启动任何 pods(出现 "Does not have minimum availability" 错误)。新实例甚至没有显示在我集群的节点列表中。

切换回具有外部 IP 的默认实例模板后,一切再次正常。所以似乎出于某种原因 Google Kubernetes Engine 要求集群节点为 public.

您能解释一下这是为什么吗?是否有办法防止 GKE 将集群节点暴露给互联网?我应该设置防火墙吗?我应该使用什么规则(因为节点是动态创建的)?

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

这就是 GKE 的设计方式,据我所知没有任何解决方法。使用 public IP 的 运行ning kubernetes 节点没有任何危害,如果这些是用于节点之间通信的 IP,则无法避免。

至于您的安全问题,如果您 运行 kubernetes 上的示例数据库,即使您使用 public IP 也无法访问它,因为这只能在内部 pod-to-pod 联网,而不是节点本身。

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

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

此外,可以通过在新节点池中的所有节点上应用 GCE 标记来创建 GKE 集群,因此可以在防火墙规则中使用这些标记来 allow/deny desired/undesired 流量节点。这在 --tags 标志下的 this article 中有描述。

Kubernetes Master 运行 在您的网络之外,它需要访问您的节点。这可能是拥有 public 个 IP 的原因。

创建集群时,会自动创建一些防火墙规则。这些是集群需要的,例如来自主节点的入口和集群节点之间的流量。

GCP 中的网络 'default' 具有现成的防火墙规则。这些启用来自 Internet 的所有 SSH 和 RDP 流量,并启用对您的机器的 ping 操作。您可以在不影响集群的情况下删除这些节点,并且您的节点不再可见。

GKE 最近添加了一项新功能,允许您创建 private clusters,这是节点没有 public IP 地址的集群。