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