如何限制GKE指定工作负载访问同VPC内Cloud SQL数据库
GKE 限定指定工作负载访问同VPC Cloud SQL PostgreSQL 实现方案
你之前的节点池+IP白名单思路的核心卡点是对GKE网络配置的认知偏差:GKE 确实不支持为单个节点池配置集群级别的专属出口IP,但完全不需要靠集群全局IP做白名单,按以下优先级选方案即可实现最小粒度的访问控制:
方案1(生产首选):Workload Identity + IAM数据库认证 + Cloud SQL Auth Proxy
这是GCP官方推荐的零信任访问方案,完全不依赖网络层白名单,粒度精确到单个Pod使用的服务账号:
- 提前给集群开启Workload Identity功能,为需要访问数据库的工作负载创建专属的Kubernetes服务账号(KSA),将其绑定到仅授予
Cloud SQL Client最小权限的GCP服务账号(GSA),其他工作负载使用的KSA一律不绑定该GSA权限 - 开启Cloud SQL PostgreSQL的IAM认证功能,在数据库内为上述GSA创建对应用户,仅授予其业务所需的最小库表权限
- 为授权Pod注入Cloud SQL Auth Proxy Sidecar,Pod通过Proxy连接数据库时会自动用绑定的GSA身份做认证,无合法身份的连接请求会被直接拒绝
- 该方案下哪怕其他未授权Pod网络上能探测到数据库地址,因为没有合法IAM身份、没有数据库权限,完全无法建立有效连接,安全性远高于IP白名单模式。
方案2(网络层强隔离):节点池网络标签 + VPC防火墙 + GKE网络策略
如果需要先在网络层阻断未授权流量,可按以下方式配置:
- 创建专属授权节点池时,为该节点池的所有节点配置独有的VPC网络标签(该配置是节点池级别的,不需要集群全局设置)
- 在VPC防火墙中添加入站规则,仅允许携带上述专属网络标签的实例访问Cloud SQL的5432端口,其余来源的访问全部拒绝
- 开启GKE Dataplane V2或者部署Calico网络插件,配置GKE网络策略,仅允许带指定标签的授权Pod对外发起对Cloud SQL 5432端口的访问,避免同节点上的未授权Pod蹭节点网络权限访问数据库。
方案3(适配IP白名单硬性要求):节点池专属NAT出口
如果你的场景必须用固定IP白名单做访问控制,可以通过专属NAT实现节点池独立出口IP:
- 在集群所属VPC中新建专属Cloud NAT网关,绑定提前申请的静态公网IP作为出口地址
- 配置NAT流量规则,仅将授权节点池的节点内网IP段路由到该专属NAT网关,其余节点池的流量走默认NAT通道
- 将该专属NAT的静态IP加入Cloud SQL的IP白名单即可,同样需要配合集群内网络策略限制Pod粒度的访问权限,避免越权。
注意:所有网络层控制都属于边界防护,生产环境必须在数据库层配置强身份校验,不要仅靠IP白名单做唯一的访问控制手段,避免出现网络规则配置疏漏导致的数据泄露风险。
内容的提问来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

