【GKE】Cloud SQLに接続する。(Cloud SQL Proxyを使用)
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を有効にする
まずは以下のリンクからCloud SQL Admin 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/6428d03d4c02c0a1e66aCloud SQLを作成
完了したら、cloud sqlを作成しましょう。
IAMのサービスアカウントの作成
まずは専用のサービスアカウントを作成します。
サービスアカウントは下記で確認します。プロジェクト名を選択するとサービスアカウントの一覧を参照できます。
今回は該当のサービスアカウントがなかったので作成します。
作成時にCloud SQLサービスエージェントを選択します。
上記間違えてました。
google公式をちゃんとみると
cloud sql クライアント
cloud sql 編集者
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名>
上記CloudSQLのインスタンス接続名は下記cloud sqlの画面より参照できます。
まとめ
今回のポイントとしてはCloud Sqlを使用する為に
- cloud SQL とcloud SQL apiは有効にする。
- IAMでサービスアカウントを作成する。
- 2つのsecret(DB情報・サービスアカウント情報)を作成する。
- 2つのsecretを用いてcloud proxyを使用する。