【Rancher】Rancher CLIでkubernetesのコンテナを更新する with gitlab-ci
概要と環境
CI/CDのCDの部分をrancher CLIで設定した。
rancherはバージョン2なので、オーケストレーションはk8s。
CI/CDはgitlab-ciから。
gitlabでのCI
gitlabでは.gitlab-ci.ymlというジョブ定義ファイルを作成する。
他のCIツールを使ったことが無いので比較はできないが、どのブランチの時はどのジョブを実行するか、特定のブランチのみ環境変数を参照させる、みたいなことはできる。
やりたいこと
もともとrancher1.6で同じことはしていたので、dockerイメージのbuild部分(つまりCI)はあって、今回そこはいじる必要ナシ。
rancher1.6→2にしたことで、中のオーケストレーションがcattleからkubernetesに変わったこともありCLIに大きな変更があった。それによりbuild、pushしたイメージにアップデートする部分(CD)をリファクタリング。
やりかた
単純にdeploymentのマニフェストを更新してやる。
開発環境はタグをlatestで固定しているので、annotationを書き換えていく。gitlab-ciでは$CI_PIPELINE_IDに毎回異なる値が入るので、そいつをannotationsにつけて更新。
stackoverflow参考にして、imageは変更。 リンク先のimageではCLIのバージョンが古くて、ログイン時にk8sのnamespace(--context)を指定できなかったから。--contextパラメータを使うには2.0.4以降のバージョンが必要。
kubernetes - Upgrade Rancher 2 workload from CLI - Stack Overflow
$RANCHER_URLと$RANCHER_BEARER_TOKENはrancherで発行してgitlabに定義しておく。
image: heunghingwan/rancher-cli-k8s stage: upgrade script: - rancher login $RANCHER_URL --token $RANCHER_BEARER_TOKEN --context your_namespace - rancher kubectl --namespace=default patch deployment nginx -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"id\":\"$CI_PIPELINE_ID\"}}}}}"
あとがき
本番環境のアップデートは任意のタイミングで行う必要があり、CDまで行うのは開発環境だけ、という理由もあってこんなやり方してるけど、本来はイメージタグを書き換えるべき。
gitlab-ciだとタグ名とか取れるみたいなので、これも簡単にできそうではある。