Helm in Flux

Jeff Yen
8 min readAug 18, 2024

--

123

Helm release的目標狀態是透過 Kubernetes 自定義資源 HelmRelease 來描述的。根據叢集中 HelmRelease 資源的建立、變更或移除,控制器會執行相應的 Helm 操作。

功能:

  • 監控 HelmRelease 物件並生成 HelmChart 物件
  • 支援由 HelmRepository 和 GitRepository 來源產生的 HelmChart 工件
  • 從 HelmChart 物件中獲取由 source-controller 生成的工件
  • 監控 HelmChart 物件的修訂變更(包括來自 HelmRepository 來源的圖表的 semver 範圍)
  • 執行自動化的 Helm 操作,包括 Helm 測試、回滾和卸載
  • 提供廣泛的配置選項,用於在 Helm 安裝、升級或測試操作失敗時進行自動補救(回滾、卸載、重試)
  • 按特定順序執行 Helm 安裝/升級,考慮在一組 HelmRelease 物件中定義的依賴關係
  • 清理從叢集中移除的 Helm 發行版本(垃圾回收)
  • 報告 Helm 發行版本的狀態(由 notification-controller 提供警報)
  • 內建與 Kustomize 兼容的 Helm 後置渲染器,支援策略性合併、JSON 6902 和映像修補

Helm Releases

HelmRelease API 允許透過 Helm 操作(如安裝、升級、測試、卸載和回滾)來實現控制器驅動的 Helm 發行版本調和。此外,它還能檢測並修正叢集狀態與目標發行版本狀態之間的偏差。

Example

---
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: podinfo
namespace: default
spec:
interval: 5m
url: https://stefanprodan.github.io/podinfo
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: podinfo
namespace: default
spec:
interval: 10m
timeout: 5m
chart:
spec:
chart: podinfo
version: '6.5.*'
sourceRef:
kind: HelmRepository
name: podinfo
interval: 5m
releaseName: podinfo
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
test:
enable: true
driftDetection:
mode: enabled
ignore:
- paths: ["/spec/replicas"]
target:
kind: Deployment
values:
replicaCount: 2

在上述範例中:

  • 建立了一個名為 podinfo 的 HelmRepository,指向可以安裝 podinfo chart 的 Helm 存儲庫。
  • 建立了一個名為 podinfo 的 HelmRelease,它將從 .spec.chart 中創建一個 HelmChart 物件並監控其 Artifact 變更。
  • 控制器將從 HelmChart 的 Artifact 中獲取 chart,並將其與 .spec.releaseName.spec.values 一起使用,以確認 Helm 發行版本是否存在且為最新狀態。
  • 如果 Helm 發行版本不存在、未更新,或未觀察到控制器根據 HelmRelease 的歷史記錄所執行的操作,則控制器將安裝或升級該發行版本。如果此過程失敗,根據相應的補救配置,允許控制器在每次嘗試間重新排隊並重試操作若干次。
  • 如果針對該發行版本的 Helm 測試未曾執行過,HelmRelease 將執行這些測試。
  • 當存儲中的 Helm 發行版本是最新的時候,控制器將檢查叢集中的發行版本是否已偏離目標狀態(根據偏差檢測配置定義)。如果有偏差,控制器將通過重新應用目標狀態來修正偏差。
  • 控制器將按照 .spec.interval 中定義的時間間隔重複上述步驟,或者當配置發生變化且影響到 Helm 發行版本的目標狀態時(例如新的 chart 版本或數值)重複執行。
kubectl apply -f podinfo.yaml

kubectl get helmrelease

Chart reference

.spec.chartRef 是一個可選字段,用來引用一個 OCIRepository 資源或 HelmChart 資源,以從中獲取 Helm chart。控制器會使用引用資源的 .status.artifact 中提供的信息來獲取該 Helm chart。

apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: OCIRepository
metadata:
name: podinfo
namespace: default
spec:
interval: 10m
layerSelector:
mediaType: "application/vnd.cncf.helm.chart.content.v1.tar+gzip"
operation: copy
url: oci://ghcr.io/stefanprodan/charts/podinfo
ref:
semver: ">= 6.0.0"
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: podinfo
namespace: default
spec:
interval: 10m
chartRef:
kind: OCIRepository
name: podinfo
namespace: default
values:
replicaCount: 2

不像Argocd用fluxcd建置的helm release還是可以用helm的指令.

Helm Dependencies

.spec.dependsOn 是一個可選的列表,用來引用其他 HelmRelease 物件,表示該 HelmRelease 依賴於這些物件。如果指定了這個字段,則該 HelmRelease 只有在引用的 HelmRelease 物件處於就緒狀態(即 Ready 條件標記為 True)後才能繼續執行。

---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: backend
namespace: default
spec:
# ...omitted for brevity
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: frontend
namespace: default
spec:
# ...omitted for brevity
dependsOn:
- name: backend

Values檔案

.spec.valuesFrom 是一個可選的列表,用來引用 ConfigMap 和 Secret 資源,從中獲取值。這些值會按照給定的順序合併,後面的值會覆蓋前面的值,然後inline values會覆蓋它們。

spec:
valuesFrom:
- kind: ConfigMap
name: prod-env-values
valuesKey: values-prod.yaml
- kind: Secret
name: prod-tls-values
valuesKey: crt
targetPath: tls.crt
optional: true

Inline values

.spec.values 是一個可選字段,用來在 HelmRelease 中內聯值。當定義了值的引用時,Inline values會與這些引用中的值合併,並覆蓋任何已存在的值。

spec:
values:
replicaCount: 2

--

--