我注意到集群中的每个节点都分配有一个外部 IP。这似乎是 Google Kubernetes Engine 的默认行为。
我认为集群中的节点应该只能从本地网络访问(通过其虚拟 IP),但我什至可以通过连接到其托管节点(无需使用负载均衡器)。
我尝试通过更改集群实例模板设置(将属性“外部 IP”从“临时”更改为“无”),使容器引擎不向新创建的节点分配外部 IP。但在我这样做之后,GCE 无法启动任何 Pod(出现“没有最低可用性”错误)。新实例甚至没有显示在我的集群中的节点列表中。
切换回具有外部 IP 的默认实例模板后,一切又恢复正常。所以似乎出于某种原因 Google Kubernetes Engine 要求集群节点是公共的。
您能解释一下这是为什么吗?是否有办法防止 GKE 将集群节点暴露到互联网?我应该设置防火墙吗?我应该使用什么规则(因为节点是动态创建的)?
我认为谷歌不允许私有节点是一种安全问题......假设有人发现数据库管理系统上的安全漏洞。如果我们的数据库节点没有暴露在互联网上,我们会更愿意修复这个问题(应用补丁、升级版本)。
GKE 最近添加了一项新功能,允许您创建私有集群,这是节点没有公共 IP 地址的集群。
这就是 GKE 的设计方式,据我所知,没有办法解决它。使用公共 IP 运行 Kubernetes 节点没有任何害处,如果这些是用于节点之间通信的 IP,则无法避免它。
就您的安全问题而言,如果您在 kubernetes 上运行该示例数据库,即使您使用公共 IP,它也将无法访问,因为这仅在内部 Pod 到 Pod 网络上,而不是在节点本身上。
Kubernetes Master 在您的网络外部运行,它需要访问您的节点。这可能是拥有公共 IP 的原因。
创建集群时,会自动创建一些防火墙规则。这些是集群所需要的,例如来自主节点的入口和集群节点之间的流量。
GCP 中的网络“默认”具有现成的防火墙规则。它们启用来自互联网的所有 SSH 和 RDP 流量,并启用对您的计算机执行 ping 操作。您可以删除它们而不影响集群,并且您的节点不再可见。
现在这是可能的,
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 是您需要公共端点