GCP设置Proxy来连接Cloud SQL

在之前的文章用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的地址来建立连接了。

你可能感兴趣的:(云服务,云计算,sql,数据库)