个人随记 —— GCP Cloud SQL 的 Private Service Connect 访问方案
一句话简述问题
GCP Cloud SQL 服务并没有官方提供 Private Service Connect 的链接通路,需要手动配置。
方案设计
如图所示,需要申请规划
- VPC、Subnet、Security Group
- Cloud SQL
- Instance Group
- NLB
- Private Service Connect
最后通过在需要访问 RDS-MySQL 的 VPC 中申请 Endpoint,从而打通网络。
-
为什么引入NLB
Private Service Connect 申请需要绑定一个 NLB 来实现。 -
为什么引入 Instance Group
GCP 的 NLB 后端只能挂载 vm,所以需要通过一个 vm 把流量转发到 Cloud SQL 分配的 private ip
GCP 手动方案验证
创建独立的 VPC(metaDB VPC)
为 service 预留 ip range (10.215.118.0/24)
VPC firewall 开放该 ip range 的 ingess/egress 流量,简单起见使用 0.0.0.0/0
创建 CloudSQL 并分配 private ip
创建 cloudSQL,去掉 public ip,勾选 private ip,绑定之前生成的 VPC network(metaDB VPC), 选择预留的 ip range(10.215.118.0/24) , 从而获得在 metaDB VPC 中映射的 private ip(10.215.118.5)。
在分配 private ip 的过程中,console 自动创建了 metaDB VPC 到 google self-managed VPC(cloudSQL 自带) 的 vpc peering。
创建 instance group + vm
- 在 metaDB VPC 中创建一个 subnet 10.20.0.0/16,然后创建 vm 关联 lb-test 分配 internal ip(10.20.0.2)
- 登陆 vm 设置 nat 路由规则,将 Cloud SQL 请求转发从 VM 转发到 CloudSQL
// 临时打开 ip forward 能力
sudo sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 10.215.118.2:3306
iptables -A FORWARD -p tcp -d 10.215.118.2 --dport 3306 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE
- 创建 unmanaged instance group
创建 instance group 绑定之前创建的 vm
创建 Cloud load balance(L4)
创建 ILB,绑定 unmanaged instance group,选择 lb-test subnet,给 lb 分配个 internal ip(10.20.1.13), 开放所有端口。
创建 private service connect service
- 在 metaDB VPC 中给 private service connect 分配个单独的 subnet 10.21.0.0/24
- 创建 private service connect service,绑定 Cloud load balance,选择上步创建的subnet,选择自动同意 endpoint。
搭建 customer VPC 验证通过 PSC 访问 Cloud SQL
在另外一个用户的 project 中
- 创建 dataplane VPC, 新建 subnet,给 private service connect endpoint 和 vm 使用
- 创建 private service connect endpoint, 选择 cloudSQL service name
- 创建 DNS zone, 绑定 private service connect endpoint 的 ip 和 port 443
- 在 subnet 中创建个 vm,登陆 vm,验证使用 endpoint 连接 cloud SQL:
mysql -h10.176.0.4 -P3306 -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 43087
Server version: 5.7.39-google-log (Google)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]>