概要
GKEのDocker上GoアプリからCloud Sql Proxy経由でCloudSQL第2世代に接続させてみたので備忘録として残しておく
手順
DB作成
google cloud console上でcloudSQLのdbを作成する

第2世代を選択する
DB名はdb-devにする
GKEからDB接続確認とユーザ権限作成
接続確認、ユーザ権限作成用のインスタンスを作成する
gcloud compute instances create sql-client --scopes=sql-admin --machine-type=f1-micro \
--network=lovelytokyo --subnet=lovelytokyo \
--zone=asia-northeast1-b  
接続する
gcloud compute ssh debian@sql-client
cloud_sql_proxyをインストールする
curl https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -o cloud_sql_proxy
chmod +x cloud_sql_proxy
sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
mysql clientをインストールする
sudo apt-get install mysql-client
cloud_sql_proxyを起動する
sudo ./cloud_sql_proxy -dir=/cloudsql -instances='lovelytokyo:asia-northeast1:db-dev=tcp:3306'
接続する
mysql --user root --host localhost --protocol TCP --password
db作成する
CREATE DATABASE hawai DEFAULT CHARACTER SET utf8;
DB hawaiにユーザcloudmaster がproxy経由でアクセスした際の権限を設定する
GRANT SELECT,INSERT,UPDATE,DELETE ON hawai.* TO 'cloudmaster'@'cloudsqlproxy~%';
FLUSH PRIVILEGES;
GKEのDocker上GOアプリから接続
1. サービスアカウントキーの作成
google cloud console上でサービスアカウントキーを作成する



作成されたCloud SQL Service accountのjsonファイルをダウンロードし、以下に保存
/path/to/secrets/cloudsql/lovelytokyo-xxxx-xxx.json
2. インスタンスからCloudSQLへアクセスするためのsecret作成
この時、jsonファイルのパスは、1.で保存したパスにする
kubectl create secret generic cloudsql-oauth-credentials --from-file=credentials.json=/path/to/secrets/cloudsql/lovelytokyo-xxxx-xxx.json
3. データベース・アクセス時に使うユーザとパスワード作成
goアプリで使う
kubectl create secret generic cloudsql-master-user --from-literal=username=cloudmaster
kubectl create secret generic cloudsql-master-password --from-literal=password=masterpasswd
GOアプリのdeployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name:app-sample
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        application: app-sample
        tier: app
    spec:
      imagePullSecrets:
      - name : gcp-registry-key
      containers:
      - image: gcr.io/lovelytokyo/app-sample
        name: app-sample
        ports:
        - containerPort: 8080
          protocol: TCP
        imagePullPolicy: Always
        env:
          - name: MASTER_USER
            valueFrom:
              secretKeyRef:
                name: cloudsql-master-user (3.で作成したものを参照する)
                key: username
          - name: MASTER_PASSWORD
            valueFrom:
              secretKeyRef:
                name: cloudsql-master-password  (3.で作成したものを参照する)
                key: password
      - image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                  "-instances=lovelytokyo:asia-northeast1:db-dev=tcp:3306",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir:
アプリでの接続サンプル
環境変数に設定した、ユーザ名とパスワードを使って接続する
user := os.Getenv("MASTER_USER")
  passwd := os.Getenv("MASTER_PASSWORD")
  db := "hawai"
  connStr := fmt.Sprintf("%s:%s@tcp(localhost:3306)/%s%s", user, passwd, db, option)


