Cloud SQL を利用するためには、直接接続するのではなく、 Cloud SQL Proxy を利用します。
Cloud SQL Proxy は Docker image として公開されているため、こちらを使います。
Googleのドキュメント通りに設定すれば通信出来ます。
Pod 内に Proxy の Container を含める構成になっており、この構成をサイドカーパターンと呼びます。
サンプル通りのやり方
ポイントは1つだけ、CloudSQL Client の役割をつけたサービスアカウントを作成し、cloudsql-instance-credentials などの名前で json を保存します。
kubectl create secret generic cloudsql-instance-credentials --from-file credentials.json=./secret/projectname-1234567890.json
簡単にするため、ユーザー名パスワードは埋め込みました。
Pod内のContainer同士は、127.0.0.1 でアクセスできます。
apiVersion: apps/v1 kind: Deployment metadata: name: app-deploy spec: replicas: 1 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app-backend image: gcr.io/project_desu/app:0.9 ports: - containerPort: 3000 env: - name: PORT value: '3000' - name: DATABASE_HOST value: 127.0.0.1 - name: DATABASE_DATABASE value: hoge - name: DATABASE_USER_NAME value: name_desu - name: DATABASE_PASSWORD value: password_desu - image: gcr.io/cloudsql-docker/gce-proxy:1.12 name: cloudsql-proxy ports: - containerPort: 3306 command: ["/cloud_sql_proxy", "--dir=/cloudsql", "-instances=PROJECT_NAME:asia-northeast1:INSTANCE_NAME=tcp::3306", "-credential_file=/secrets/cloudsql/credentials.json"] volumeMounts: - name: cloudsql-instance-credentials mountPath: /secrets/cloudsql readOnly: true - name: ssl-certs mountPath: /etc/ssl/certs - name: cloudsql mountPath: /cloudsql volumes: - name: cloudsql-instance-credentials secret: secretName: cloudsql-instance-credentials - name: ssl-certs hostPath: path: /etc/ssl/certs - name: cloudsql emptyDir:
Service を使い Pod を分ける方法
アプリケーションの数だけ Container が増えることになるため、リソースが限られている時など上記の方法を避けたい場合があります。Serviceを利用しアクセスするためには下記のように設定します。
TCPにバインドするIPアドレス 0.0.0.0 を指定することがポイントです。
これによって、Service経由のホスト名db-cluster-ip で Podにアクセス出来ます。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: db-deploy spec: replicas: 1 selector: matchLabels: app: db template: metadata: labels: app: db spec: containers: - image: gcr.io/cloudsql-docker/gce-proxy:1.12 name: cloudsql-proxy ports: - containerPort: 3306 command: ["/cloud_sql_proxy", "--dir=/cloudsql", "-instances=PROJECT_NAME:asia-northeast1:INSTANCE_NAME=tcp:0.0.0.0:3306", "-credential_file=/secrets/cloudsql/credentials.json"] volumeMounts: - name: cloudsql-instance-credentials mountPath: /secrets/cloudsql readOnly: true - name: ssl-certs mountPath: /etc/ssl/certs - name: cloudsql mountPath: /cloudsql volumes: - name: cloudsql-instance-credentials secret: secretName: cloudsql-instance-credentials - name: ssl-certs hostPath: path: /etc/ssl/certs - name: cloudsql emptyDir:
apiVersion: v1 kind: Service metadata: name: db-cluster-ip spec: type: ClusterIP ports: - port: 3306 targetPort: 3306 selector: app: db