なになれ

IT系のことを記録していきます

RenovateでKubernetesエコシステムのバージョン追従を試した

背景

CloudNative Days Tokyo 2021の下記を視聴し、Kubernetesエコシステムのバージョン追従を自動化せねばと思った次第です。

event.cloudnativedays.jp

発表の中では独自の仕組みで実現されているということで、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では、正規表現でバージョンのルールをカスタマイズできます。

詳しいバージョンの記述方法は以下にあります。

Versioning - Renovate Docs

Renovateが動作すると、下記のようにPRが作成されます。

Update dependency kubernetes/ingress-nginx to vcontroller-v1.1.0 by renovate[bot] · Pull Request #2 · hi1280/renovate-kubernetes-example · GitHub

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が作成されます。

Update Helm release ingress-nginx to v4.0.13 by renovate[bot] · Pull Request #1 · hi1280/renovate-kubernetes-example · GitHub

Rawマニフェスト

素のマニフェストを更新する場合です。
結論としては、このケースは上手くいきませんでした。
RenovateのKubernetes対応はKubernetesマニフェスト(YAML)でimageのバージョンを更新するだけです。
マニフェスト自体が更新されることには対応していません。

一応、こちらのケースで試したRenovateのKubernetes対応について紹介します。

renovate.jsonを修正して、Kubernetesに対応します。

renovate.json

...
  "kubernetes": {
    "fileMatch": ["raw/.+\\.yaml"]
  },
...

rawディレクトリ内にあるyamlファイルをKubernetesで利用するマニフェストであると設定しています。

Renovateが動作すると、下記のようにPRが作成されます。

Update k8s.gcr.io/ingress-nginx/controller Docker tag to v1.1.0 by renovate[bot] · Pull Request #4 · hi1280/renovate-kubernetes-example · GitHub

まとめ

RenovateでKustomize、Helm Chartのバージョンに追従できることが確認できました。
Rawマニフェストでは、Renovateでマニフェスト自体を更新することができませんでした。
少し考えれば、Renovateは依存関係のあるモジュールを更新するためのものなので、この動作結果は当然かと思います。
このあたりは独自に仕組みを作るしかなさそうな気がします。

参考