配置GKE EGRESS访问AWS RDS失败,求非Terraform/VPC/VPN类解决方案
解决GKE通过NetworkPolicy访问AWS RDS的连通问题
问题分析
你当前的NetworkPolicy仅允许Pod访问指定的Google静态IP,缺少两个关键放行规则:
- 访问AWS RDS公网IP的流量
- Pod解析RDS域名所需的DNS流量
另外需要注意:公有GKE集群中,Pod的出口流量使用节点公网IP,而非Pod自身IP,因此RDS安全组必须将GKE节点的公网IP加入白名单。
修正后的NetworkPolicy配置
替换占位符后应用配置:
yy.yyy.yy.yy/32:AWS RDS的公网IP(可从AWS控制台获取)5432:你的RDS服务端口(MySQL用3306,PostgreSQL用5432等)- 确认DNS标签:GKE新版本可能使用
coredns作为DNS服务,可通过kubectl get pods -n kube-system查看标签
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: test-egress spec: podSelector: matchLabels: app: testapp networking/allow-internet-egress: "true" policyTypes: - Egress egress: # 允许访问目标RDS实例 - to: - ipBlock: cidr: yy.yyy.yy.yy/32 ports: - protocol: TCP port: 5432 # 允许DNS解析(集群内置DNS服务) - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53 - protocol: TCP port: 53 # 保留原有的Google静态IP访问规则(如果需要) - to: - ipBlock: cidr: xx.xxx.xx.xxx/32
验证步骤
- 检查Pod标签匹配:确保目标Pod带有
app: testapp和networking/allow-internet-egress: "true"标签,执行kubectl get pods --show-labels确认。 - 确认RDS安全组配置:将GKE所有节点的公网IP添加到RDS安全组的入站规则中(对应RDS服务端口)。
- 测试Pod连通性:进入Pod内部执行测试命令,例如:
若能建立连接则说明网络规则生效。kubectl exec -it <你的Pod名称> -- telnet yy.yyy.yy.yy 5432 - 检查NetworkPolicy状态:执行
kubectl describe networkpolicy test-egress,确认规则已正确应用且PodSelector匹配目标Pod。
内容的提问来源于stack exchange,提问作者jeqwdkc
相关产品推荐
相关产品推荐

