HelmRelease で Helm チャートをデプロイする
Helm リポジトリと OCI レジストリからチャートをインストールしてアップグレードし、自動ロールバックも行います。
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 し、その後に調整を行います。
人気のガイド
-
Push と Pull:Flux が Kubernetes にデリバリーする仕組み Git 主導の pull 型デリバリーが、デプロイ、セキュリティ、復旧の方法をどう変えるか。 -
GitRepository と Kustomization で最初のアプリケーションをデプロイする Kustomization リソースを使って Flux を Git のマニフェストに向け、同期の様子を確認します。 -
同期動作を制御する:間隔、prune、ドリフトの修正、ロールバック Flux がいつ変更を適用するか、何を削除するか、どう一時停止するか、失敗したデプロイをどう元に戻すかを決めます。 -
Flux Image Automation でイメージの更新を自動化する 新しいコンテナイメージのタグを Flux に検出させ、Git に commit させます。 -
Flux でマルチクラスターを構成する 共有インフラとクラスターごとの違いを持たせて、1 つのリポジトリから複数のクラスターを管理します。 -
Flux CD と Argo CD:GitOps ツールの選び方 アーキテクチャ、UI、Helm、シークレット、テナンシー、イメージの自動化を比較して、適切なツールを選びます。