半農半エンジニアの記録

関西在住エンジニア。個人で勉強・開発したこと、その他趣味のことを書いてます。農業してます。

【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だとタグ名とか取れるみたいなので、これも簡単にできそうではある。

gitlab.com