【GKE】Cloud SQLに接続する。(Cloud SQL Proxyを使用)

GCP kubenertes


GKEからCloud SQLに接続する方法として焦点にあげられる事が多いのが

  • Private IP (or) PublicIPを使う
  • Cloud SQL Proxyを使う

の二があります。元々Cloud SQLは作成時にpublic ipが作成される仕様でしたが、バージョンアップによってプライベートIPで接続できるようになったみたいです。
また元がpublic ipで共有される仕組みなので基本はVPC的な同じ論理ネットワーク上にないです。

特にPublicでもアクセスしたいと言う内容でなければ、レイテンシー的にもセキュリティ的にもPrivate IPを使用した方がよさそうですが・・・

公式より下記のご通達(cloud sql proxyは必須用のようですね。)

https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine?hl=ja

プライベート IP を使用する場合でも、Cloud SQL Proxy を使用して Cloud SQL に接続することをおすすめします。これは、プロキシによって IAM を使用した強力な暗号化と認証を使用でき、データベースを安全に保つためです。

Google Cloud SQL APIを有効にする

まずは以下のリンクからGoogle Cloud SQL APIを有効にします。

https://cloud.google.com/sql/docs/mysql/admin-api/?hl=ja

Google Cloud SQL API コンポーネントと Google Cloud SQL コンポーネントは違うことに注意してください。後者のコンポーネントは、Google Cloud Platform Console と Cloud SDK でインスタンスを管理するために有効にする必要があります。 との事です。両方有効にしましょう。

参考サイト

https://qiita.com/gohatomo/items/6428d03d4c02c0a1e66a

Cloud SQLを作成

完了したら、cloud sqlを作成しましょう。

IAMのサービスアカウントの作成

まずは専用のサービスアカウントを作成します。
サービスアカウントは下記で確認します。プロジェクト名を選択するとサービスアカウントの一覧を参照できます。

今回は該当のサービスアカウントがなかったので作成します。

作成時にCloud SQLサービスエージェントを選択します。

テスト用コンテナの作成

cent osとmariadbを使って接続できたか確認できるコンテナを作成します。

FROM centos:8

RUN dnf -y update && dnf clean all

ENV TZ='Asia/Tokyo'
RUN dnf -y install langpacks-ja && \
    dnf clean all && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ENV LANG="ja_JP.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

RUN dnf -y install mariadb && \
    dnf clean all
CMD ["/sbin/init"]

上記のdockerfileを使いイメージを作成します。
dockerfileがあるフォルダに移動し下記コマンドを実行

docker build -t [アカウント名]/[イメージ名] .

次にイメージをpushします。

docker push [アカウント名]/[イメージ名]

Cloud SQLに接続する

Cloud SQLにCloud SQL Proxyを使う場合
次にサービスアカウントの情報 、パスワード情報、Cloud SQLのインスタンス名を渡せばproxy経由で接続可能です。
Cloud SQL Proxyが実行されていれば127.0.0.1に対して接続すればCloud SQLに接続できます。

DBの認証情報用のシークレットを作成する

$ kubectl create secret generic <任意のSecret名> \
  --from-literal=username=<CloudSQLで作成したユーザ名> \
  --from-literal=password=<CloudSQLで作成したパスワード> \
  --from-literal=database=<CloudSQLで作成したデータベース名>

サービスアカウントキーの登録

下記のサービスアカウントのメールですが、上記で作成したアカウント情報から参照できます。

gcloud iam service-accounts keys create <任意のキー名>.json \
  --iam-account <サービスアカウントのメール>

上記コマンドでキーを作成したら下記コマンドでキーを登録します。

kubectl create secret generic <任意のSecret名> \
--from-file=service_account.json=key.json

上記でDB用のシークレットとサービスアカウントのシークレットを作成したので、この二つを使ってyamlを作成する。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: <任意の名前>
spec:
  selector:
    matchLabels:
      app: <任意の名前>
  template:
    metadata:
      labels:
        app: <任意の名前>
    spec:
      containers:
      - name: <任意のコンテナ名>
        image: <事前にpushしたContainer Resistoryのイメージ名>
        env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: <DB用のSecret名>
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: <DB用のSecret名>
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: <DB用のSecret名>
              key: database
      - name: cloud-sql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.17
        command:
          - "/cloud_sql_proxy"
          - "-instances=<CloudSQLのインスタンス接続名>=tcp:3306"
          - "-credential_file=/secrets/service_account.json"
        securityContext:
          runAsNonRoot: true
        volumeMounts:
        - name: <サービスアカウントのSecret名>
          mountPath: /secrets/
          readOnly: true
      volumes:
      - name: <サービスアカウントのSecret名>
        secret:
          secretName: <サービスアカウントのSecret名>

まとめ

今回のポイントとしてはCloud Sqlを使用する為に

  • IAMでサービスアカウントを作成する。
  • 2つのsecret(DB情報・サービスアカウント情報)を作成する。
  • 2つのsecretを用いてcloud proxyを使用する。