Flux CD Flux CD

HelmRelease で Helm チャートをデプロイする

Helm リポジトリと OCI レジストリからチャートをインストールしてアップグレードし、自動ロールバックも行います。

12 min learn.level.中級

Flux は、独自の helm-controller を通じて Helm チャートをデプロイします。チャートを保持する source と、どのチャートの、どのバージョンを、どの values でデプロイするかを示す HelmRelease を宣言します。コントローラーは、スケジュールに従って Helm のインストールとアップグレードを実行し、リリースのライフサイクル全体を宣言的に処理します。このガイドでは、例として公開されている podinfo チャートを使います。

チャートの source を宣言する

HelmRepository は、チャートの場所を source-controller に伝えます。apps/podinfo/helmrepository.yaml:

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: podinfo
  namespace: podinfo
spec:
  interval: 1h
  url: https://stefanprodan.github.io/podinfo

これだけでは、どのチャートが利用可能かが一覧になるだけです。まだ何もインストールされません。source は、アプリケーションの namespace にも flux-system にも置くことができ、どちらでも構いません。

リリースを宣言する

apps/podinfo/helmrelease.yaml:

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: podinfo
  namespace: podinfo
spec:
  interval: 10m
  chart:
    spec:
      chart: podinfo
      version: "6.x"
      sourceRef:
        kind: HelmRepository
        name: podinfo
      interval: 1h
  install:
    remediation:
      retries: 3
  upgrade:
    remediation:
      retries: 3
  values:
    replicaCount: 2
    ui:
      color: "#34577c"

重要なポイントは次のとおりです。

  • chart.spec は、チャート、バージョンまたは semver の範囲(6.x は新しいマイナーおよびパッチのリリースに追従)、そしてそれが来る source を指定します。
  • interval は、Flux がリリースの変更とドリフトを確認する頻度です。
  • values は values.yaml に相当するもので、インラインで記述します。より大きな設定には、valuesFrom で ConfigMap や Secret から values を読み込みます。
  • remediation は、インストールやアップグレードが失敗したときの動作を制御します。許可された再試行の後、アップグレードの失敗は、デフォルトで最後の正常なリリースへのロールバックをトリガーします。

同じフォルダーに podinfo 用の通常の namespace.yaml を追加し、最初のアプリケーションのガイドとまったく同じように、そのフォルダーを Flux の Kustomization で登録します。

flux create kustomization podinfo \
  --source=GitRepository/flux-system \
  --path=./apps/podinfo --prune=true --interval=10m \
  --export > clusters/dev/podinfo.yaml

commit して push します。podinfo の Kustomization が調整されたら、リリースを確認します。

flux get helmreleases -A
kubectl get all -n podinfo

リリース、インストールされたチャートのバージョン、Helm が作成した Pod が表示されます。Helm のリリースは、通常の Helm CLI からも見えます(helm list -n podinfo)が、変更する場所としては、Git を扱ってください。

環境ごとの values

共通のデフォルトの上に、環境固有の設定を重ねるには、ベースのリリースを保持し、Kustomize で環境ごとにパッチを当てるか、valuesFrom を使います。

spec:
  valuesFrom:
    - kind: ConfigMap
      name: podinfo-values
      valuesKey: values.yaml

valuesFrom の値が最初にマージされ、インラインの values がそれを上書きします。参照されている ConfigMap や Secret が変更されると、helm-controller がその変更を取り込み、リリースをアップグレードします。これは、Deployment が読み取る通常の ConfigMap とは異なります。チャート自身の ConfigMap に焼き込まれた設定には、チャートの Pod テンプレートにチェックサムのアノテーションを追加して、設定が変わったときに Pod が再起動されるようにします。

  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

OCI レジストリのチャート

Helm チャートは、ますます OCI レジストリに置かれるようになっています。タイプが oci の HelmRepository を使います。

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
  name: podinfo-oci
  namespace: podinfo
spec:
  type: oci
  interval: 1h
  url: oci://ghcr.io/stefanprodan/charts

HelmRelease は、podinfo-oci を指す sourceRef 以外は同じです。プライベートレジストリには、レジストリの認証情報を持つ secretRef を追加します。OCIRepository の source を通じてチャートを参照することもでき、これにより、複数のリリースが 1 つのチャートバージョンを共有し、アーティファクトのダイジェストの変更に応じて調整できます。

ドリフトの検出とアップグレード

デフォルトでは、helm-controller は、リリースの spec やチャートが変更されたときに、リリースを再適用します。リリースが作成したリソースの手動編集も検出して修正するには、ドリフト検出を有効にします。

spec:
  driftDetection:
    mode: enabled

これがないと、チャートが管理する Deployment の手動の kubectl edit は、次のアップグレードまで残り続ける可能性があります。interval と組み合わせて、Flux が定期的に実際の状態をリリースと比較するようにします。

ロールバックとトラブルシューティング

flux get helmreleases -A
kubectl describe helmrelease podinfo -n podinfo
flux reconcile helmrelease podinfo -n podinfo

describe は、失敗した Helm のアクションとそのエラーを表示します。アップグレードが失敗すると、コントローラーは remediation の設定に基づいて自動的にロールバックし、HelmRelease は失敗を報告するので、Git を修正できます。恒久的な修正は常に commit です。たとえば、チャートのバージョンアップを revert し、その後に調整を行います。

人気のガイド