Google Cloud Container BuilderからGKE(kubectl)を操作したい
この辺の話です
https://github.com/GoogleCloudPlatform/cloud-builders/issues/22
https://github.com/GoogleCloudPlatform/cloud-builders/pull/2
https://gist.github.com/Philmod/290fdabf386646dbbc0b57b00952b944
GKE上で動いてるcontainerをGoogle Cloud Container Builder(以下GCCB)でbuildしたimageで自動更新したいなというのが出発点。
まずは手順
- gcloud commandでclusterに接続するための秘密鍵と証明書をexportしておく
- 同一GCP projectのcloud storageに配置しておく
- cloudbuild.yamlを書く
1. 秘密鍵と証明書をexport
2. 同一GCP projectのcloud storageに配置しておく
- で作成したファイルをstorageに配置する
これは特別困ることもないはず普通にbucket作ってuploadするだけ
※ permissionにだけは注意
3. cloudbuild.yaml
ポイントは
- 更新するイメージをimagesで自動pushされる前に明示的にpush
- gcloud container起動後にkubectlをinstall
- cluster接続用のファイルをcloud storageからgsutilでcopy
steps:
- id: 'build-master'
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/app:$REVISION_ID', '.']
- id: 'push'
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/app:$REVISION_ID']
- id: 'upgrade-server'
name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud components install kubectl
gsutil cp gs://${YOUR_BUCKET}/ca.pem .
gsutil cp gs://${YOUR_BUCKET}/client.pem .
gsutil cp gs://${YOUR_BUCKET}/key.rsa .
kubectl set image deployment/app app=gcr.io/$PROJECT_ID/app:$REVISION_ID --server https://xxx.xxx.xxx.xxx --client-certificate=client.pem --client-key=key.rsa --certificate-authority=ca.pem
kubectl install済みのcontainerをpushしておいたほうが手っ取り早いけどサンプルとして書いてます。
このやり方の問題点とか疑問
GCCBではpush後のstepが定義できないため、明示的にgcr.ioにpushしてしまっている。(imagesで成果物を指定してる前に 二重pushが発生する)
※コメントを頂いて修正
images
を書かなければ二重pushは防げる
そもそもとしてGCCBをCIのような使い方していいものか?
恐らくGCCBではcontainerをbuildすること以外を目的をしておらず
build, push後に何かしたければせっかくpub/subにtopic作ってあるんだから、そこの通知を使って他でやれよってことなんだと思います。(どうなんだろ?)
その考え方自体は妥当性があると思っているので、
pub/sub triggerでCloudFunctionsを起動してなんとか出来ないと模索していたのですが、CloudFunctions上からGKE(kubernetes)のclusterを操作するのができなくはないのですが
すごくめんどくさいんです
issueやPRを追っている限りGCCBでkubectlを使えるようにする予定はあるみたいなのでそこら辺に期待したいです。
今回作業して欲しいなって思った機能としては
- CloudFunctionsから楽にGKEを操作したい
- GCCB imagesのpush後step
- そもそもGCCBをCIとして使おうという考え方が良くない?