如何在Google Kubernetes Engine中设置集群节点为私有?
解决GKE节点默认分配外部IP的问题
嘿,我之前也碰到过这个困惑——GKE默认给每个节点分配外部IP确实容易让人觉得集群暴露得太宽泛,尤其是像你说的,连Pod里的Mongo都能直接从家用电脑访问,这确实存在安全隐患。下面给你梳理两种靠谱的解决思路:
1. 创建不带外部IP的私有节点池
这是最直接的解决方案,创建新节点池时明确告诉GKE不要分配外部IP就行。用gcloud命令的话,加上--no-address参数即可:
gcloud container node-pools create private-node-pool \ --cluster your-cluster-name \ --zone your-cluster-zone \ --no-address \ --num-nodes 2
- 划重点:这类节点只有内部IP,无法直接从公网访问,但GKE会通过Cloud NAT自动让节点具备访问公网的能力(比如拉取镜像),前提是你的VPC已经配置了NAT服务,没配置的话得先创建一个。
- 如果要替换现有节点池,记得先把旧池里的Pod调度到新池,再删除旧节点池就好。
2. 改用私有集群(更彻底的网络隔离)
如果你的集群完全不需要公网直接访问节点,可以直接创建私有GKE集群。这种集群的所有节点默认只有内部IP,控制平面也仅在内部网络可见(你可以配置授权IP来访问控制平面,方便用kubectl管理)。创建命令示例:
gcloud container clusters create private-cluster \ --zone your-cluster-zone \ --private-cluster \ --master-ipv4-cidr 172.16.0.0/28 \ --enable-master-authorized-networks \ --master-authorized-networks your-home-public-ip/32
- 这里
--master-authorized-networks用来指定能访问控制平面的IP,比如你家用电脑的公网IP,这样你依然能正常管理集群。
另外补充下:你能直接连接到Mongo的原因,大概率是Pod使用了节点端口(NodePort)或者配置了hostNetwork: true,再加上节点有外部IP,才让外部能直接打通。解决节点外部IP的问题后,这种直接访问的路径就会被切断;之后如果需要对外提供服务,建议用LoadBalancer或者Ingress,这才是Kubernetes推荐的安全服务暴露方式。
内容的提问来源于stack exchange,提问作者Ricardo Baptista
相关产品推荐
相关产品推荐

