关于从Google Cloud Composer连接Google Cloud SQL(MySQL)的技术方案问询
嘿,我来梳理下从新版Cloud Composer连接Cloud SQL(MySQL)并把数据导入BigQuery的可行方案,还有你关心的代理暴露和Service Broker相关问题:
1. Cloud SQL代理(推荐生产环境使用)
这是Google官方推荐的安全连接方式,有两种落地形式:
任务内临时启动代理:在Airflow任务(比如BashOperator或PythonOperator)里先下载启动代理,再执行数据导出+导入流程。示例命令如下:
# 下载Cloud SQL代理二进制文件 wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy chmod +x cloud_sql_proxy # 后台启动代理,绑定本地3306端口 ./cloud_sql_proxy -instances=你的项目ID:地区:SQL实例名=tcp:3306 & # 导出MySQL数据到Cloud Storage mysqldump -h 127.0.0.1 -u 用户名 -p密码 数据库名 | gsutil cp - gs://你的存储桶名/数据备份.sql # 从GCS导入数据到BigQuery bq load --source_format=SQL 你的BigQuery数据集.表名 gs://你的存储桶名/数据备份.sql记得给Composer关联的服务账号添加Cloud SQL Client、Storage Object Creator、BigQuery Data Editor这几个权限,不然会遇到权限报错。
Sidecar容器常驻代理:如果不想每次任务都重复启动代理,可以给Composer的Airflow Worker Pod添加一个Cloud SQL代理的Sidecar容器。这样Worker Pod里的所有任务都能直接通过
localhost:3306连接Cloud SQL,效率更高。典型的Pod配置片段如下:containers: - name: cloud-sql-proxy image: gcr.io/cloudsql-docker/gce-proxy:1.33.1 command: - "/cloud_sql_proxy" - "-instances=你的项目ID:地区:SQL实例名=tcp:3306" - "-credential_file=/secrets/service_account.json" volumeMounts: - name: service-account-secret mountPath: /secrets/ readOnly: true volumes: - name: service-account-secret secret: secretName: composer-service-account-secret你可以通过Composer的自定义Pod模板功能来配置这个Sidecar。
2. 私有IP直接连接(同VPC场景)
如果你的Cloud SQL实例和Composer的Kubernetes集群在同一个VPC网络里,可以直接用Cloud SQL的私有IP地址连接,不需要代理。只要给Composer服务账号授权Cloud SQL Client权限,任务里直接把私有IP作为MySQL主机地址就行,后续导出到GCS再导入BigQuery的流程和上面一致。
3. 公网IP连接(不推荐)
直接用Cloud SQL的公网IP,然后在Cloud SQL的“授权网络”列表里添加Composer集群的出口IP。但这种方式安全性差,容易被攻击,只适合测试环境临时用。
能否在Composer的K8s Pod上暴露Cloud SQL代理?
当然可以!刚才提到的Sidecar容器方式就是把代理部署在Worker Pod内部,任务通过localhost访问。如果想让集群内其他Pod也能用到这个代理,你可以把Cloud SQL代理单独部署成一个K8s Deployment,再创建一个ClusterIP或NodePort Service暴露3306端口。不过对于Composer本身的任务来说,Sidecar模式已经足够贴合需求了,毕竟任务都是在Worker Pod里运行的。
是否可通过Kubernetes Service Broker引入Cloud SQL代理?
Google Cloud的Service Broker确实整合了Cloud SQL服务,你可以通过它在K8s集群里创建Cloud SQL实例的绑定,自动部署代理并生成Service供应用访问。不过对于Composer来说,直接用Sidecar或任务内启动代理的方式更直接——毕竟Composer的任务执行模型是基于Worker Pod的,Sidecar能更高效地为任务提供连接能力。如果你的集群已经配置了Service Broker,也可以尝试这种方式,但要确保Composer的Worker Pod能访问到Service Broker创建的代理Service。
内容的提问来源于stack exchange,提问作者Raj

