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 に定義された値が優先され、他は valuesFile の設定がそのまま使用される
  • 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です