はじめに
GKEでCronJobを使おうとしたのですが、接続用のCloudSQLProxyのコンテナがうまく落ちなくてこまっていました。
そもそも1バッチ動かすためのpodの中にバッチを動かすアプリケーションコンテナと、CloudSQLProxyコンテナが動いていたため、podの使用cupリクエストは200mとなかなかかさむなぁとおもっていたのです。
そこでGCPの人とちょっと話たところ、CloudSQLはプライベートIPに対応したとのことで、GKEからCloudSQLへプライベートIPで接続を試してみたところだいぶスッキリしたので記載しておきます。
CloudSQLのプライベートIPは2018/12/12現在ベータ版です
ご了承の上お使いください
CloudSQLのプライベートIPを有効にする
プライベートIPにチェックをつけて自動割り当てボタンをおします。
それが終わったら保存します。完了までに数分かかります。
※1 プライベートIPはCloudSQL第二世代じゃないと使えません
※2 GKEのリージョンと同じリージョンである必要があります。
※3 GKEのバージョンは1.8以上である必要があります。
参照
https://cloud.google.com/sql/docs/mysql/private-ip
出来上がったプライベートIPをメモっておきます
アプリ側の接続をCloudSQLProxy経由からプライベートIPに変更します
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cron-batch
spec:
schedule: "*/5 * * * *" # <=テストのため5分ごとに走らせる
failedJobsHistoryLimit: 1
successfulJobsHistoryLimit: 1
jobTemplate:
spec:
template:
metadata:
spec:
containers:
- name: cron-batch
image: [イメージ名]
command: [コマンドは適当にSQLへの接続があるものを指定]
env:
- name: MYSQL_DSN
value: [プライベートIP] # <= 元はプロキシ接続だったので、127.0.0.1だったはず!これをプライベートIPに変更
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: username
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: password
- name: MYSQL_DATABASE
value: ******
アプリケーション側へのホストの渡し方はこれに限ったことではないので、ご自身のプロジェクトに合わせてください
これで繋がるかとおもったらSQLSTATE[HY000] [2002] Operation timed out"といわれた
なぜか、、
VPCネイティブはGKEクラスタの作成時にチェックをつけることで有効にできます。
私は無効で作成してしまっていたので、クラスタを作り直しました
これで無事CronJobがSuccessedになりました。めでたしめでたし
参考