如何在 Google Kubernetes Engine 上将集群节点设为私有?

问题描述 投票:0回答:5

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

我认为集群中的节点应该只能从本地网络访问(通过其虚拟 IP),但我什至可以通过连接到其托管节点(无需使用负载均衡器)。

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

切换回具有外部 IP 的默认实例模板后,一切又恢复正常。所以似乎出于某种原因 Google Kubernetes Engine 要求集群节点是公共的。

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

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

kubernetes google-kubernetes-engine gke-networking
5个回答
2
投票

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


0
投票

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

就您的安全问题而言,如果您在 kubernetes 上运行该示例数据库,即使您使用公共 IP,它也将无法访问,因为这仅在内部 Pod 到 Pod 网络上,而不是在节点本身上。


0
投票

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

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

此外,还可以在新节点池中的所有节点上应用 GCE 标签来创建 GKE 集群,因此可以在防火墙规则中使用这些标签来允许/拒绝到节点的所需/不需要的流量。这在本文中的

--tags
标志下进行了描述。


0
投票

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

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

GCP 中的网络“默认”具有现成的防火墙规则。它们启用来自互联网的所有 SSH 和 RDP 流量,并启用对您的计算机执行 ping 操作。您可以删除它们而不影响集群,并且您的节点不再可见。


0
投票

现在这是可能的,

gcloud container clusters create private-cluster-0 \
    --create-subnetwork name=my-subnet-0 \
    --enable-master-authorized-networks \
    --enable-ip-alias \
    --enable-private-nodes \
    --enable-private-endpoint \
    --master-ipv4-cidr 172.16.0.32/28

remove --enable-private-endpoint 是您需要公共端点

© www.soinside.com 2019 - 2024. All rights reserved.