Helm in ArgoCD

Jeff Yen
6 min readAug 11, 2024

--

123

這次要講用ArgoCD去管理helm的套件,可以通過 UI 安裝 Helm chart,也可以採用宣告式 GitOps 的方式進行安裝。
Helm 只用來通過 helm template 來展開chart。應用程式的生命週期是由 Argo CD 而不是 Helm 來管理的。以下是一個範例:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx
spec:
project: default
source:
chart: nginx
repoURL: registry-1.docker.io/bitnamicharts # note: the oci:// syntax is not included.
targetRevision: 15.9.0
destination:
name: "in-cluster"
namespace: nginx

當使用多種方式提供helm的value時

優先順序為:parameters > valuesObject > values > valueFiles > Helm 儲存庫中的 values.yaml

Values Files

Helm 可以使用不同的,甚至多個 “values.yaml” 文件來導出其參數。可以使用 --values 參數來指定替代或多個values文件。該參數可以重複使用以支持多個values文件:

在 Argo CD v2.6 之前,values文件必須與 Helm chart位於同一個 Git 儲存庫中。這些文件可以位於不同的位置,此時可以使用相對於 Helm 圖表根目錄的相對路徑來訪問它們。從 v2.6 開始,values文件可以來自與 Helm chart不同的Git 儲存庫。

如果 Helm 在template展開期間傳遞了一個不存在的值文件,它將會報錯。可以使用 --ignore-missing-value-files 來忽略丟失的值文件(即,不傳遞給 Helm)。這在實現應用程式集的默認/覆蓋模式時特別有用。

我這裡建議一律都寫在appliaction設定裡面,不要用額外的參數,這樣比較好管理.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx
spec:
project: default
source:
chart: nginx
repoURL: registry-1.docker.io/bitnamicharts # note: the oci:// syntax is not included.
targetRevision: 15.9.0
helm:
releaseName: nginx
valueFiles:
- values.yaml
destination:
name: "in-cluster"
namespace: nginx

Values

Argo CD 支援在應用程式清單中直接使用 source.helm.valuesObject 或用source.helm.values key來實現與values文件等效的功能。我這裡建議用valuesObject,如果用source.helm.values 會用| 去裝vaules值,跑版會看不出來.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: nginx
spec:
project: default
source:
chart: nginx
repoURL: registry-1.docker.io/bitnamicharts # note: the oci:// syntax is not included.
targetRevision: 15.9.0
helm:
releaseName: nginx
valuesObject:
ingress: true
path: /
hosts:
- mydomain.example.com
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
labels: {}
tls:
- secretName: mydomain-tls
hosts:
- mydomain.example.com
destination:
name: "in-cluster"
namespace: nginx

Helm Parameters

Helm 可以設置參數值,這些值會覆蓋 values.yaml 中的任何值。例如,service.type 是在 Helm 圖表中常見的一個參數:

argocd app set helm-guestbook -p service.type=LoadBalancer

但我建議也是寫在文件裡,不然時間一久就忘了也不好交接.

source:
helm:
parameters:
- name: "service.type"
value: LoadBalancer

Helm Value Precedence

我們這次講到這麼多可以輸入helm value的方法,一定要記得以下優先順序:parameters > valuesObject > values > valueFiles > Helm 儲存庫中的 values.yaml。或者更確切地說:

    lowest  -> valueFiles
-> values
-> valuesObject
highest -> parameters

--

--