在之前的文章用Google CDC来同步Cloud SQL的数据到Bigquery_gzroy的博客-CSDN博客中,我通过在一个VM上设置反向代理的方式,使得Datastream可以通过私用连接连到Cloud SQL数据库进行数据复制。但是这种方式不太方便,主要是VM的状态我们不太方便去进行监控,而且资源也占用较大。那么我们是否可以在Kubernetes上面起Pod来提供这个反向代理的连接呢?答案是采用GCP的cloud sql auth proxy来做。
首先我们建立一个job的yaml文件,来启动Pod
- apiVersion: batch/v1
- kind: Job
- metadata:
- name: cloud-sql-proxy
- labels:
- app.kubernetes.io/name: cloud-sql-proxy
- namespace: abc
- spec:
- parallelism: 1
- template:
- spec:
- containers:
- - command:
- - /cloud_sql_proxy
- - -instances=XXXX=tcp:0.0.0.0:5432
- - -ip_address_types=PRIVATE
- image: gcr.io/gce-proxy:1.28.0
- imagePullPolicy: IfNotPresent
- name: cloud-sql-proxy
- resources: {}
- terminationMessagePath: /dev/termination-log
- terminationMessagePolicy: File
- ports:
- - containerPort: 5432
- name: pg-port
- protocol: TCP
- serviceAccountName: cloud-sql-pg
- dnsPolicy: ClusterFirst
- restartPolicy: OnFailure
- schedulerName: default-scheduler
- securityContext: {}
- terminationGracePeriodSeconds: 30
- ttlSecondsAfterFinished: 3600
其中instance参数需要填写我们的cloud sql的connection name, serviceAccountName需要填写我们K8S里面的service account。
然后我们需要绑定K8S service account和GCP service account,因为需要用到GCP的SA账号来去调用cloud sql的资源,这里是用到了GCP kubernetes workload identity的概念。
运行以下命令创建一个GCP的service account
- gcloud iam service-accounts create gke-quickstart-service-account \
- --display-name="GKE Quickstart Service Account"
为这个service account赋予cloud sql权限
- gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
- --member="serviceAccount:gke-quickstart-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \
- --role="roles/cloudsql.client"
把GCP的账号和K8S的账号绑定
- gcloud iam service-accounts add-iam-policy-binding \
- --role="roles/iam.workloadIdentityUser" \
- --member="serviceAccount:YOUR_PROJECT_ID.svc.id.goog[YOUR_K8S_NAMESPACE/YOUR_KSA_NAME]" \
- gke-quickstart-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com
运行K8S命令来对这个账号做annotation
- kubectl annotate serviceaccount \
- YOUR_KSA_NAME \
- iam.gke.io/gcp-service-account=gke-quickstart-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com
之后运行kubectl apply -f部署这个Job就会看到有一个sql proxy的pod成功运行了。
然后可以建一个LoadBalancer的Service来暴露这个Pod的地址和端口
- apiVersion: v1
- kind: Service
- metadata:
- name: cloudsql-service
- namespace: abc
- spec:
- type: LoadBalancer
- selector:
- job-name: cloud-sql-proxy
- ports:
- - protocol: TCP
- port: 5432
- targetPort: 5432
最后我们在datastream里面就可以用Loadbalancer的地址来建立连接了。