Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前置き

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)にひっかかり、プロジェクトごと再作成するハメになりました🤣

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした