LoginSignup
23
10

More than 5 years have passed since last update.

GKEからCloudSQLにprivte ipで接続する

Posted at

前置き

Google Cloudのマネージドな YES SQL データベースサービス、CloudSQL。

CloudSQL
https://cloud.google.com/sql/

WEBサービス自体は Google Cloudのマネージドなkubernetesである、GKE上で動作させるとして

GKE
https://cloud.google.com/kubernetes-engine/

恒久的に保存すべきデータ、かつYES SQLはCloudSQLを使うのが常道だと思われます。
Spannerというのもありますが、MySQLやPostgreSQL使いたいですよね。よね?

そんなわけでPostreSQLの同時接続数アップ(できればAWS Auroraと同じくらい景気良く)、そしてバージョン11への対応お待ちしております。
テーブルのパーティショニング使いたいんです。

はい。
そんなわけでCloudSQLを使うとして、心情的なハードルとなるのがその接続方式。
なんとCloudSQLはエンドポイントがGlobal IP持っちゃってるんですよ。
接続をきちんと限定すればセキュリティは確保できるとはいえ、AWS RDSに慣れ親しんだ身からすると、そうじゃなくても常識的に考えて、結構衝撃的な仕様だと思います。
本来ネットワークの奥深くに隔離されているべきもの。そういう認識ですよね。

そのエキセントリックな仕様のCloud SQLに Private IP接続機能が追加されました。ベータですけれども。

gke.png

接続がグローバルじゃなくなる以外にも、ネットワークレイテンシが短縮されるという、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)にひっかかり、プロジェクトごと再作成するハメになりました🤣

23
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
10