Kustomize 組み込みの helmCharts で Helm を管理する
Kustomize で Helm をデプロイできる helmCharts について紹介します。
私の環境の Helm については ArgoCD の Application に inline で記載していて、Kustomize の様にマニフェストの YAML で管理できてい状態でした。そのため Helm Charts に変更しようと考えていましたが、 Kustomize と Helm Charts では管理の仕方が異なるのでどちらかに寄せたいなと考えている最中でした。
Kustomize の helmCharts を使うことで Kustomize のディレクトリ構成と同じようにに Helm を管理できマニフェストの見通しが良くなりました。
モチベーション
Helm については ArgoCD の Application に inline で管理していたが Kustomize と同じように Helm を管理したかった
公式ドキュメント
https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/helmcharts
https://kubectl.docs.kubernetes.io/references/kustomize/builtins/#helmchartinflationgenerator
https://github.com/kubernetes-sigs/kustomize/blob/master/examples/chart.md
Kustomize helmCharts
helmCharts については Kustomize の overlay の機能が柔軟に使えるようになっています。
Helm Charts の設定を name, repo, version, releaseName に定義し valuesFile に ベースとなる values.yaml を定義します。
additionalValuesFIles はファイル毎に定義した内容を patch するような感じで設定を追加できます。
valuesMerge では valuesInline に関してどのように処理するかを指定できます。指定方法につていては override, mege, replace の 3つがありデフォルトは override です。
helmCharts:
- name: longhorn
repo: https://charts.longhorn.io
version: "1.7.1"
releaseName: longhorn
namespace: longhorn-system
valuesFile: ../values.yaml
additionalValuesFiles:
- additional-values.yaml
valuesMerge: override
valuesInline:
persistence:
defaultFsType: xfs
valuesMerge
- merge(既存の設定を保持しつつ、上書きが必要な部分だけ valuesInline で設定したい場合)
valuesInline
の内容がvaluesFile
の値にマージされる- 同じキーが両方に存在した場合、
valuesInline
の値で上書きさるが、それ以外はvaluesFile
の内容を引き継ぐ
- override(局所的な上書きが必要な場合)
valuesFile
の設定全体を無視してvaluesInline
のみを使用するvaluesInline
に含まれないキーに関しては、valuesFile
の値が引き継がれるvaluesInline
に定義された値が優先され、他はvaluesFil
e の設定がそのまま使用される
- replace(
valuesFile
の設定を完全に無視して、valuesInline
での設定のみを反映したい場合)- valuesFile の内容を完全に置き換え、valuesInline の内容だけが使われる
ディレクトリ構成
ディレクトリ構成については Kustomize の様に base, overlay 構成や以下のようにbase フォルダを省略して定義しても良い思います。
https://github.com/AbeYuki/manifest
$tree
.
├── README.md
├── actions-runner-controller
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── airflow
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── airflow-postgresql
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── argo-rollouts
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── argo-workflow
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── cert-manager
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── consul
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── ingress-nginx
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ ├── additional-values.yaml
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── keda
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── kube-state-metrics
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── longhorn
│ ├── production
│ │ ├── additional-values.yaml
│ │ └── kustomization.yaml
│ ├── staging
│ │ ├── additional-values.yaml
│ │ └── kustomization.yaml
│ ├── testing
│ │ ├── additional-values.yaml
│ │ └── kustomization.yaml
│ └── values.yaml
├── metallb
│ ├── production
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── nfs-subdir-external-provisioner
│ ├── production
│ │ ├── additional-values.yaml
│ │ └── kustomization.yaml
│ ├── staging
│ │ └── kustomization.yaml
│ ├── testing
│ │ └── kustomization.yaml
│ └── values.yaml
├── secret
│ ├── airflow
│ │ ├── airflow-ssh-hosts-secret.yaml
│ │ └── dags-repo-secret.yaml
│ ├── argocd
│ │ └── argocd-repo-secret.yaml
│ └── kustomization.yaml
└── vault
├── production
│ └── kustomization.yaml
├── staging
│ ├── additional-values.yaml
│ └── kustomization.yaml
├── testing
│ └── kustomization.yaml
└── values.yaml
実行方法
build
kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone .
deploy
kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone . | kubectl apply -f -
Overlay 構成の注意点
overlay などで values.yaml を kustomization.yaml のディレクトリ外に配置するときは –load-restrictor=LoadRestrictionsNone オプションが必要です。
kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone .
ArgoCD で利用する場合
ArgoCD の Kustomize ではデフォルトで –enable-helm は実行されないようになっているので configMap に設定するか cpm-server に plugin を設定し Application で実行できるようする必要があります。
Argocd が実行する Kustomize のオプションを設定する場合
argocd-cm の configMap 設定
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
kustomize.buildOptions: "--enable-helm"
Helm 設定
configs:
cm:
kustomize.buildOptions: "--enable-helm"
ArgoCD の cpm-server の plugin で実行する場合
cmp を configMap に patch で設定
kind: ConfigMap
metadata:
name: argocd-cmp-cm
namespace: argocd
apiVersion: v1
data:
kustomize-helmcharts.yaml: |
apiVersion: argoproj.io/v1alpha1
kind: ConfigManagementPlugin
metadata:
name: kustomize-helmcharts
spec:
generate:
command:
- sh
- -c
- 'kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone . '
lockRepo: false
argocd-vault-plugin-kustomize-helmcharts.yaml: |
apiVersion: argoproj.io/v1alpha1
kind: ConfigManagementPlugin
metadata:
name: argocd-vault-plugin-kustomize-helmcharts
spec:
generate:
command:
- sh
- -c
- kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone . | argocd-vault-plugin
generate -s argocd:argocd-vault-plugin-credentials -
lockRepo: false
cmp を Helm values.yaml で設定
configs:
cmp:
create: true
plugins:
kustomize-helmcharts: # plugin name
generate:
command:
- sh
- "-c"
- "kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone . "
lockRepo: false
argocd-vault-plugin-kustomize-helmcharts: # plugin name
generate:
command:
- sh
- "-c"
- "kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone . | argocd-vault-plugin generate -s argocd:argocd-vault-plugin-credentials -"
lockRepo: false