kubectl applyでしかインストールできないアプリをFluxCD×Renovateで管理する

目的

walnuts.devのk8sクラスタは、FluxCDを使って管理されています。

github.com

多くのアプリケーションはFluxCD特有のHelm用設定ファイルやdeployment.yamlなどのManifestをコミットすることで本番環境に自動適用される、という運用になっています。

しかし、Helmに対応しておらず、kubectl apply -f https://github.com/<org>/<repo>/releases/download/<version>/<hoge>.yamlを実行してインストールしなさい、的なアプリケーションも意外とあります。(flannel、kubevirtなど)

そこで今回は、そのようなアプリケーションにおいて、手動による操作を省きFluxCDの管理下に置く、さらにRenovateで更新まで自動化することを目標にします。

Kustomize

FluxCDではkind: KustomizationのManifestを置くことで、kustomize buildをflux上で行うことができます。

Kustomizeでは、resourcesに適用するファイルの相対パスを書いていきますが、ここに直接URLを書くことができます。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - https://github.com/flannel-io/flannel/releases/download/v0.24.2/kube-flannel.yml

こうすることで、リモートのファイルをわざわざwgetして、コミットして...といった手間が生じなくなります。楽~

Renovate

このままでは一生更新されないので、Renovateを用いて先ほどのresources内のタグを自動更新します。Renovateというとnpmなどパッケージマネージャーの依存関係を更新する、というイメージがありますが、調べてみるといろいろなDataSourceを用いることができることがわかります。

docs.renovatebot.com

この中にgithub-tagsというものがありました。今回の用途にマッチしそうですね。

customManagers

customManagersのcustomType: "regex"を用いることで、自前で対象ファイルをパースし、パッケージ名(今回は<user|org>/)やバージョンを取得することができます。

{
  ...
  customManagers: [
    {
      customType: "regex",
      fileMatch: "^k8s/apps/.*/kustomization.yaml$",
      matchStringsStrategy: "any",
      matchStrings: [
        "https:\\/\\/github\\.com\\/(?<depName>.*?)\\/releases\\/download\\/(?<currentValue>\\S+)\\/.*\\s*",
      ],
      datasourceTemplate: "github-tags",
    },
  ],
  ...
}

この設定を入れると、リポジトリ内の、/k8s/apps/<hoge>/kustomization.yamlファイルにおいてhttps://github.com/<depName>/releases/download/<currentValue>/<hoge>という文字列を探し出し、github-tagsという名前のdatasourceTemplateにおけるdepNamecurrentValueに対応付けてくれます。

このrenovate設定をリポジトリに入れることで、自動的にPullRequestを作ってくれます。便利ですね~~~~

https://github.com/walnuts1018/infra/pull/96

packageRules

packageRulesを定義することで、特定の条件下での振る舞いを変えることができます。 これを用いることでパッチバージョンについてはAutoMergeを有効化する、といった設定が行えます。

{
  ...
  packageRules: [
    {
      matchUpdateTypes: ["patch"],
      matchDatasources: ["github-tags"],
      automerge: true,
    },
  ],
...
}

この辺りはご自宅のテスト環境とお好み次第、といった感じですね~

renovate.jsonの完全版はこちら

最後に

flannelとkubevirtくらいしか影響がないので正直そこまで困っていなかったですが、世界がちょっとだけ平和になった気がします。

HelmReleaseの自動更新はid:nonyleneさんの Renovate で Flux 配下の Helm Chart をアップデートする - Unyablog. が大変役に立ったのでみなさんも是非。