GKE中如何限制Kubernetes服务仅向同子网服务器开放?
在GKE中限制服务仅对同子网虚拟机开放的方案
针对你遇到的问题,这里提供几个更精准私密的解决方案,替代宽泛的公网IP范围限制:
方案1:使用GCP内部负载均衡器(Internal LoadBalancer)
这是最适配你场景的方案,内部LB本身仅在VPC内部可见,不会分配公网IP,天然具备私密性,同时可以精准锁定访问来源为目标子网:
- 定义Service时添加
cloud.google.com/load-balancer-type: "internal"注解,强制创建内部LB - 用子网的内部CIDR而非公网IP范围配置
loadBalancerSourceRanges,直接限定同子网内的所有资源
示例YAML:
apiVersion: v1 kind: Service metadata: name: your-internal-service annotations: cloud.google.com/load-balancer-type: "internal" # 标记为内部负载均衡器 spec: type: LoadBalancer loadBalancerIP: 10.10.0.50 # 可选:指定子网内的静态内部IP,方便虚拟机固定访问 ports: - port: 80 targetPort: 8080 # 对应Pod的服务端口 selector: app: your-app-label # 匹配你的Pod标签 loadBalancerSourceRanges: - 10.10.0.0/24 # 替换为你的子网内部CIDR
部署后,同子网的虚拟机可直接通过这个内部LB的IP访问服务,其他VPC外或非子网内的资源无法访问,完全不需要依赖虚拟机的公网IP。
方案2:NodePort服务+NetworkPolicy+GCP防火墙规则
如果不想使用负载均衡器,可以通过多层限制实现需求:
- 创建NodePort服务,让集群节点开放指定端口
- 用Kubernetes NetworkPolicy限制仅同子网内部IP能访问Pod的服务端口
- 在GCP控制台添加防火墙规则,允许同子网虚拟机访问节点的NodePort端口
NodePort服务示例:
apiVersion: v1 kind: Service metadata: name: your-nodeport-service spec: type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 30080 # 可选:指定固定端口,避免随机分配 selector: app: your-app-label
NetworkPolicy示例(限制Pod访问来源):
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: restrict-subnet-access spec: podSelector: matchLabels: app: your-app-label policyTypes: - Ingress ingress: - from: - ipBlock: cidr: 10.10.0.0/24 # 你的子网CIDR ports: - protocol: TCP port: 8080
GCP防火墙规则配置:
- 方向:ingress
- 目标:GKE节点的标签(比如
gke-<你的集群名>-node) - 来源IP范围:你的子网CIDR(10.10.0.0/24)
- 端口:NodePort的端口(30080)
- 动作:允许
补充说明
你之前尝试ClusterIP失败的原因是:ClusterIP是Kubernetes集群内部的虚拟IP,仅集群内的Pod和节点能直接识别访问,外部虚拟机(即使同子网)无法识别该IP的路由,因此需要通过内部LB或NodePort这类暴露方式让虚拟机访问。
内容的提问来源于stack exchange,提问作者buffcat
相关产品推荐
相关产品推荐

