- マスター(
dev-test
)とリードレプリカ(dev-test-replica
)のインスタンスを用意しておきます。
- マスターとリードレプリカのインスタンス接続名になります。
- マスター
- リードレプリカ
- Cloud SQLのdevというデータベースに
cloudsqlproxy
経由で接続するマスター用とリードレプリカ用のユーザを作成します。
マスター用ユーザ
- ユーザ名:cloudmaster, パスワード:secret
CREATE USER 'cloudmaster'@'cloudsqlproxy~%' IDENTIFIED BY 'secret';
GRANT SELECT,INSERT,UPDATE,DELETE ON dev.* TO 'cloudmaster'@'cloudsqlproxy~%';
FLUSH PRIVILEGES;
リードレプリカ用ユーザ
- ユーザ名:cloudread, パスワード:secret
CREATE USER 'cloudread'@'cloudsqlproxy~%' IDENTIFIED BY 'secret';
GRANT SELECT ON dev.* TO 'cloudread'@'cloudsqlproxy~%';
FLUSH PRIVILEGES;
コンテナ
認証情報
- cloudsql-proxyコンテナがCloudSQLに接続出来るようにするためにサービス アカウントで作成した際にダウンロードしたキーを指定してます。
- この設定はKubernetesのDevelopmentファイルに渡されます。
$kubectl create secret generic cloudsql-oauth-credentials --from-file=credentials.json=[PATH_TO_CREDENTIAL_FILE]
- go言語で開発環境や本番環境ごとにMysqlのユーザ名、パスワードを環境変数で変更出来るようになっている場合は同様に設定しておきます。
--from-literal=username
と--from-literal=password
は作成したMysqlユーザとパスワードになります。
$kubectl create secret generic cloudsql-master-user --from-literal=username=cloudmaster
$kubectl create secret generic cloudsql-master-password --from-literal=password=secret
$kubectl create secret generic cloudsql-read-user --from-literal=username=cloudread
$kubectl create secret generic cloudsql-read-password --from-literal=password=secret
Kubernetes
CloudSQL Proxyコンテナ
- CloudSQL ProxyコンテナからCloud SQLのマスター・リードレプリカに接続する設定になります。
- ポート番号: マスター(3306), リードレプリカ(3307)
-instances
のproject_idはGCPのプロジェクトIDを適宜変更して下さい。
-instances
にマスターのインスタンス接続名を設定した後にカンマ区切りにした後にリードレプリカのインスタンス接続名を設定します。
- image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
name: cloudsql-proxy
command: ["/cloud_sql_proxy", "--dir=/cloudsql",
"-instances=project_id:asia-east1:dev-test=tcp:3306,project_id:asia-east1:dev-test-replica=tcp:3307",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-oauth-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-oauth-credentials
secret:
secretName: cloudsql-oauth-credentials
Developmentファイル
- アプリケーション(go言語)のgo-appコンテナとCloudSQL Proxyコンテナを一つのpodに含めた場合のDevelopmentファイルになります。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: app
spec:
replicas: 1
template:
metadata:
labels:
app: deployment-example
spec:
containers:
- name: go-app
image: asia.gcr.io/project-id/go-app:latest
imagePullPolicy: Always
env:
- name: MASTER_USER
valueFrom:
secretKeyRef:
name: cloudsql-master-user
key: username
- name: MASTER_PASSWORD
valueFrom:
secretKeyRef:
name: cloudsql-master-password
key: password
- name: READ_USER
valueFrom:
secretKeyRef:
name: cloudsql-read-user
key: username
- name: READ_PASSWORD
valueFrom:
secretKeyRef:
name: cloudsql-read-password
key: password
ports:
- containerPort: 8080
protocol: TCP
resources:
requests:
cpu: 20m
memory: 20Mi
- image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
name: cloudsql-proxy
command: ["/cloud_sql_proxy", "--dir=/cloudsql",
"-instances=project_id:asia-east1:dev-test=tcp:3306,project_id:asia-east1:dev-test-replica=tcp:3307",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-oauth-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-oauth-credentials
secret:
secretName: cloudsql-oauth-credentials
- name: ssl-certs
hostPath:
path: /etc/ssl/certs