前置き
Google Cloudのマネージドな YES SQL データベースサービス、CloudSQL。
CloudSQL
https://cloud.google.com/sql/
WEBサービス自体は Google Cloudのマネージドなkubernetesである、GKE上で動作させるとして
恒久的に保存すべきデータ、かつYES SQLはCloudSQLを使うのが常道だと思われます。
Spannerというのもありますが、MySQLやPostgreSQL使いたいですよね。よね?
そんなわけでPostreSQLの同時接続数アップ(できればAWS Auroraと同じくらい景気良く)、そしてバージョン11への対応お待ちしております。
テーブルのパーティショニング使いたいんです。
はい。
そんなわけでCloudSQLを使うとして、心情的なハードルとなるのがその接続方式。
なんとCloudSQLはエンドポイントがGlobal IP持っちゃってるんですよ。
接続をきちんと限定すればセキュリティは確保できるとはいえ、AWS RDSに慣れ親しんだ身からすると、そうじゃなくても常識的に考えて、結構衝撃的な仕様だと思います。
本来ネットワークの奥深くに隔離されているべきもの。そういう認識ですよね。
そのエキセントリックな仕様のCloud SQLに Private IP接続機能が追加されました。ベータですけれども。
接続がグローバルじゃなくなる以外にも、ネットワークレイテンシが短縮されるという、DBにとって超嬉しい特典もあります。
これはベータだろうが絶対使わねばならん、ということで検証しましたが、どうにもGKEから接続するノウハウが見つからない、ということでまとめてみました。
VPCを作成する
GKEクラスタを作成するVPCを作成します。変数になっている部分は適切な値を入れてください。
このVPCを通してCloudSQLにアクセスするわけですが、firewall的に特別なポートを開ける必要はありませんでした。(3306とか)
gcloud compute networks create $NETWORK_NAME --subnet-mode custom
gcloud compute networks subnets create $SUBNNET_NAME \
--network $NETWORK_NAME \
--region $REGION \
--range $RANGE
gcloud compute firewall-rules create ${NETWORK_NAME}-rule01 --network $NETWORK_NAME --allow tcp:80,icmp
GKEクラスタをつくる
コンテナの足回りであるクラスタを構築します。変数になっている箇所は以下同文。
プリエンティブはお好みですが、クラスタをVPC-Nativeにする必要があります。
Connecting from Google Kubernetes Engine
https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine
そのために以下の設定が必要です。
--enable-ip-alias \
--cluster-ipv4-cidr=/16 \
--services-ipv4-cidr=/22 \
ここテストに出ます。
gcloud container clusters create $CLUSTER_NAME \
--zone=$ZONE \
--cluster-version=1.11.2-gke.18 \
--network=$NETWORK_NAME \
--subnetwork=$SUBNNET_NAME \
--enable-ip-alias \
--cluster-ipv4-cidr=/16 \
--services-ipv4-cidr=/22 \
--num-nodes=$NUM_NODES \
--machine-type=$CLUSTER_MACHINE_TYPE \
--no-enable-basic-auth \
--no-issue-client-certificate \
--metadata disable-legacy-endpoints=true \
--preemptible
DBをつくる
CloudSQL上にDBを構築します。変数になっている箇所は以下同文。
なんとおそるべきことに gcloudからPrivate IPをONにする方法は見つかりませんでした...。
DBを作成した後、Google Cloud Console上からPrivate IP接続に切り替える必要があります。
その際に、GKEクラスタが載っているVPCを指定してください。
わかりやすいので迷わないとは思いますが、それなりに時間がかかります。
もしgcloudコマンドから private IP接続を有効にする方法をご存知の方がいましたら、ぜひコメントください!
gcloud sql instances create $INSTANCE_NAME \
--async \
--availability-type=zonal \
--database-version=POSTGRES_9_6 \
--region=$REGION \
--cpu=$DB_CPU \
--memory=$DB_MEMORY \
--storage-size=$DB_STORAGE_SIZE \
--storage-type=$DB_STORAGE_TYPE
あとは、発行されたPrivateIPアドレスを指定してコンテナからDBに接続するだけです。
このIPもgcloudで取得できたらいいんですが、まだやりかたわかっておりません。
注意
ベータゆえ注意書きにも書いてあるのですが、ここで使用したVPCは削除できなくなります。
私は調子こいて何度も再作成を繰り返していたのですが、6回目の試行でVPC作成上限(Global quotaで5)にひっかかり、プロジェクトごと再作成するハメになりました🤣