Argo CD, Helm, Renovateを使ったコンポーネントの継続的アップデート

皆さん、こんにちは!
この記事はSRE Advent Calendar 2023の16日目の記事になります。

今回の話は、k8sクラスタでのコンポーネントの継続的アップデートを行うための工夫についての紹介です。
SREとして信頼性や安定性を担保するためにアップデートの話は必要不可欠化と思うので今回の話にしました。

紹介例がおうちクラスタマニフェストになっていますが、実際の業務にも転用できるので参考になれば幸いです。

TL;DR

  • Kubernetes環境でのセキュリティ、機能性、パフォーマンスの維持には継続的なアップデートが必要不可欠
  • Argo CD, Helm Charts, Renovateの組み合わせを組み合わせることでアップデートの自動化、設定管理、依存関係の更新を迅速かつ安全に行う

継続的アップデートの重要性

システムの信頼性や安定性を担保するためにもアプリケーションやサービス、ツールの継続的なアップデートは重要です。
アップデートを行うことで、セキュリティの向上、バグ修正や機能改善、パフォーマンスや安定性の向上が見込めます。

そのため、Kubernetesクラスタでは、クラスタ自体のバージョンアップや、各種コンポーネントのアップデートはこまめに行うことが重要です。

継続的にアップデートを行う場合の課題

Kubernetesコンポーネントで継続的にアップデートを行う場合には以下のような課題が挙げられます。

  • マニフェスト更新の複雑化
  • APIバージョンやリソース変更への対応
  • 依存関係の解決

今回は、Argo CD, Helm, Renovateを使って課題を解消・低減する方法について紹介します。

Argo CD, Helm, Renovateの組み合わせ

Argo CD, Helm Charts, Renovateといったツールを組み合わせることで解消・低減することができます。
これらのツールは、異なる側面からアプローチし、Kubernetesの運用を簡素化し、自動化します。

Argo CD+Helm

Argo CDは、GitOpsなCDツールでリポジトリにあるマニフェストの状態を監視し、クラスタへ手動もしくは自動でリソースの作成や変更を反映してくれます。
そして、Argo CDはKustomizeやHelmといったツールもサポートしており、それらのマニフェストを指定することもできます。

argo-cd.readthedocs.io

この組み合わせでコンポーネントを管理すれば、Argo CDで自動デプロイする仕組みを構築することが可能です。
例として、実際のおうちクラスタで管理しているWordPressのArgo CD Applicationを張っておきます。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: wordpress
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  sources:
    - ref: home
      repoURL: https://github.com/corrupt952/home
    - path: manifests/wordpress/base
      repoURL: https://github.com/corrupt952/home
    - chart: mariadb
      repoURL: https://charts.bitnami.com/bitnami
      targetRevision: 14.1.4
      helm:
        releaseName: mariadb
        valueFiles:
          - $home/manifests/values/mariadb.yaml
    - chart: wordpress
      repoURL: https://charts.bitnami.com/bitnami
      targetRevision: 18.1.27
      helm:
        releaseName: wordpress
        valueFiles:
          - $home/manifests/values/wordpress.yaml
  destination:
    server: "https://kubernetes.default.svc"
    namespace: wordpress
  syncPolicy:
    syncOptions:
      - CreateNamespace=true
    automated:
      prune: true
      selfHeal: true

アップデートは、Helm Chartsのバージョン(例だとtargetRevision)を上げるだけで比較的容易に行うことができます。

この組み合わせの時点で、挙げた課題についてはほぼ解消・低減できていますが、アップデート作業も楽にしたいのでRenovateを組み合わせます。

Renovate

Argo CD+Helmで管理されているリポジトリにRenovateを追加することで、アップデートをRenovateが自動化してくれます。

以下の例では、Argo CDやKubernetesマニフェストを読み取って各種コンポーネントをアップデートするための設定です。

{
  $schema: "https://docs.renovatebot.com/renovate-schema.json",
  extends: [
    "github>corrupt952/.github:default.json5",
  ],

  argocd: {
    fileMatch: ["manifests/argocd-config/base/.*\\.yaml"],
  },
  kubernetes: {
    fileMatch: ["manifests/.*/base/.*\\.yaml"],
  }
}

さらにRenvoateのAutomergeをパッチやマイナーバージョンにのみ適用することで、Pull Requestを手動でマージしなくてもクラスタへ反映することができるようになります。

おうちクラスタでの実践例

実際のマニフェストや設定は以下のリポジトリにまとめてあります。
参考にする場合は以下を見てみてください。

github.com

ただし、このレポはモノレポ運用しているため、AnsibleのPlaybookが混じっていることに注意してください。

まとめ

Argo CD, Helm, Renovateを組み合わせてコンポーネントの継続的なアップデートを行う方法を紹介しました。

より楽により安全にアップデートするためにも今回紹介した方法が参考になれば幸いです。

それではよい週末・年末を :)