概要
GKEにCloud Buildを使ってデプロイする。
Cloud Build内のstepでkubectlの代わりにkustomizeを使う。
手順
1. Code Buildを有効にする
Webコンソール等でCode Buildを有効にする
2. Code BuildのIAMにGKE権限付与
Code BuildのIAM(ex. 123456789012@cloudbuild.gserviceaccount.com)に
"Kubernetes Engine 管理者" の権限を与える。
3. cloud-builders-community/kustomize を使う
cloud-builders-communityにkustomize入りbuilderがあるのでそれを使う。
READMEにあるように
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
cd cloud-builders-community/kustomize
gcloud builds submit --config cloudbuild.yaml .
する。
(事前に gcloud config set project
が必要)
そうするとREADMEにあるように
- id: deploy
name: 'gcr.io/$PROJECT_ID/kustomize'
args:
- 'build'
- 'overlays/prod'
env:
- 'APPLY=true'
- 'CLOUDSDK_COMPUTE_ZONE=us-west1'
- 'CLOUDSDK_CONTAINER_CLUSTER=tf-k8s'
- 'GCLOUD_PROJECT=compound-dev'
というようにstepを記述してkustomizeを実行できる。
その他
stageでconfを分ける
このあたりはいまいち固まりきってないけど
- develop
- ブランチへのpushをトリガーにする
- latest, develop等のタグへDockerイメージをpush
- Deploymentを強制的に更新するためにsedで無理やりテンプレート置換してgitのハッシュをannotationに入れる
- production
- タグのpushをトリガーにする
- $TAG_NAMEをDockerイメージをpush
- kustomizeのimageTagsでイメージのタグを上書き指定
としてみている。いろいろ気持ち悪さがあるのでもうちょっとなんとかしたい。。
sedのところはkubectl patch deploymentするのとどっちがいいか微妙なところ。
# ...
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
metadata:
annotations:
git-sha: _COMIT_SHA_
# ...
steps:
# ...
- name: 'gcr.io/$PROJECT_ID/kustomize'
entrypoint: bash
args:
- '-c'
- |
gcloud container clusters get-credentials --zone "$$CLOUDSDK_COMPUTE_ZONE" "$$CLOUDSDK_CONTAINER_CLUSTER"
kustomize build "overlays/develop" | sed -e "s/__COMMIT_SHA__/$COMMIT_SHA/g" | kubectl apply -f -
env:
- 'APPLY=true'
- 'CLOUDSDK_COMPUTE_ZONE=$_ZONE'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-cluster'
- 'GCLOUD_PROJECT=$PROJECT_ID'
# ...
imageTags:
- name: asia.gcr.io/my-project/my-app
newTag: v0.0.2
steps:
- name: 'gcr.io/cloud-builders/docker'
args:
- 'build'
- '--tag=asia.gcr.io/$PROJECT_ID/my-app:$TAG_NAME'
- '.'
- name: 'gcr.io/cloud-builders/docker'
args: ["push", "asia.gcr.io/$PROJECT_ID/my-app:$TAG_NAME"]
- name: 'gcr.io/$PROJECT_ID/kustomize'
args:
- 'build'
- 'overlays/production'
env:
- 'APPLY=true'
- 'CLOUDSDK_COMPUTE_ZONE=$_ZONE'
- 'CLOUDSDK_CONTAINER_CLUSTER=my-cluster'
- 'GCLOUD_PROJECT=$PROJECT_ID'
参考
Cloud BuildとkustomizeでGKEのCDパイプラインを作る - y-ohgi's blog
https://y-ohgi.hatenablog.com/entry/2018/09/06/080921