GKEからCloud SQL(MySQL)にアクセスする

言語は Golang を使用します。いくつか方法があるようです。

  • Cloud SQL Proxy、Workload Identity
  • Cloud SQL Proxy、サービス アカウント キーファイル
  • Private IP による接続
  • Go による外部接続

ここでは、Cloud SQL Proxy、サービス アカウント キーファイルで接続します。ドキュメントはこちら。
https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine?hl=ja

構成

Golang アプリケーションから Cloud SQL へのアクセスは以下のようになります。

Golang アプリケーション -> Cloud SQL Proxy -> Cloud SQL

Golang アプリケーションと Cloud SQL Proxy は同じ Pod 内で動作します。この構成をサイドカーと呼ぶようです。

Cloud SQL であらかじめユーザーを作成しておきます。
Golang アプリケーションでは、そのユーザーの名前とパスワードを指定します。MySQL のホストは127.0.0.1、ポートは3306です。
Cloud SQL Proxy では、Cloud SQL のインスタンス名を指定します。

1
2
gcloud iam service-accounts keys create cloudsql.json --iam-account cloudsql@cocotola.iam.gserviceaccount.com
kubectl create secret generic cloudsql-secret --from-file=service_account.json=cloudsql.json -n cocotola
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
apiVersion: apps/v1
kind: Deployment
metadata:
name: cocotola
namespace: default
spec:
selector:
matchLabels:
run: cocotola
template:
metadata:
labels:
run: cocotola
spec:
containers:
- image: gcr.io/cocotola/cocotola-app:COMMIT_SHA
imagePullPolicy: IfNotPresent
name: cocotola
ports:
- containerPort: 8080
protocol: TCP
readinessProbe:
httpGet:
path: /healthcheck
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
- name: cloud-sql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.17
command:
- "/cloud_sql_proxy"
- "-instances=cocotola:asia-northeast1:cocotola-tokyo=tcp:3306"
- "-credential_file=/secrets/service_account.json"
securityContext:
runAsNonRoot: true
volumeMounts:
- name: cloudsql-secret-volume
mountPath: /secrets/
readOnly: true
volumes:
- name: cloudsql-secret-volume
secret:
secretName: cloudsql-secret
---
apiVersion: v1
kind: Service
metadata:
name: cocotola
namespace: default
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
run: cocotola
type: NodePort