RenovateでKubernetesエコシステムのバージョン追従を試した
背景
CloudNative Days Tokyo 2021の下記を視聴し、Kubernetesエコシステムのバージョン追従を自動化せねばと思った次第です。
発表の中では独自の仕組みで実現されているということで、Renovateで同じようなことができないかを試しました。
RenovateはGitHub Appで動作し、依存関係のあるモジュールに更新があれば、更新のためのPRを自動的に作成するツールです。
今回の成果物となるリポジトリは以下です。
github.com
なお、本内容は実運用に耐えうるかを試せてないので漏れがあるかもしれません。ご了承ください。
実践
発表にあったKustomize、Helm、Rawマニフェストでそれぞれ試しました。
Renovateの導入
下記からGitHub上にRenovateをセットアップします。
GitHub Apps - Renovate · GitHub
Kustomize
Kustomizeでは、Remote上のkustomization.yamlをBuildできます。Renovateはこの仕組みに対応しています。
kustomize/remoteBuild.md at master · kubernetes-sigs/kustomize · GitHub
元のkustomization.yamlでは、以下のように記載します。
kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization commonLabels: app: example resources: - github.com/kubernetes/ingress-nginx/deploy/static/provider/baremetal?ref=controller-v1.0.5
github.com/kubernetes/ingress-nginx...
でRemote上にあるkustomization.yamlを指定します。
refでGitのタグを指定します。
Gitのタグに更新があればRenovateが更新するPRを作成するという動きになります。
renovate.jsonでRenovateの設定を行います。
renovate.json
{ "extends": [ "config:base" ], ... "packageRules": [ { "matchPackageNames": ["kubernetes/ingress-nginx"], "versioning": "regex:^(?<compatibility>.*)v(?<major>\\d+)(\\.(?<minor>\\d+))?(\\.(?<patch>\\d+))?$" } ] }
matchPackageNames
で、特定のpackageを指定します。
今回の例で使用しているingress-nginxは一つのリポジトリに複数のタグが混在しているため、今回の対象とするタグを指定するためにversioning
の設定を行なっています。
versioning
では、正規表現でバージョンのルールをカスタマイズできます。
詳しいバージョンの記述方法は以下にあります。
Renovateが動作すると、下記のようにPRが作成されます。
Helm
Helmに対応するために、ここではHelm Chartのバージョンを宣言的に管理できるHelmfileを利用します。RenovateはHelmfileに対応しています。
helmfile.yamlは以下のように記載します。
helmfile.yaml
repositories: - name: ingress-nginx url: https://kubernetes.github.io/ingress-nginx releases: - name: ingress-nginx chart: ingress-nginx/ingress-nginx version: 4.0.12
renovate.jsonの設定は特に不要です。
Renovateが動作すると、下記のようにPRが作成されます。
Rawマニフェスト
素のマニフェストを更新する場合です。
結論としては、このケースは上手くいきませんでした。
RenovateのKubernetes対応はKubernetesのマニフェスト(YAML)でimageのバージョンを更新するだけです。
マニフェスト自体が更新されることには対応していません。
一応、こちらのケースで試したRenovateのKubernetes対応について紹介します。
renovate.jsonを修正して、Kubernetesに対応します。
renovate.json
... "kubernetes": { "fileMatch": ["raw/.+\\.yaml"] }, ...
rawディレクトリ内にあるyamlファイルをKubernetesで利用するマニフェストであると設定しています。
Renovateが動作すると、下記のようにPRが作成されます。
まとめ
RenovateでKustomize、Helm Chartのバージョンに追従できることが確認できました。
Rawマニフェストでは、Renovateでマニフェスト自体を更新することができませんでした。
少し考えれば、Renovateは依存関係のあるモジュールを更新するためのものなので、この動作結果は当然かと思います。
このあたりは独自に仕組みを作るしかなさそうな気がします。
参考
- Renovateについて
- Helmfileについて