kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Helmfile の「テンプレート機能」を試した

前回の記事では Helmfile に入門した!Helm Chart を宣言的に管理することができて便利だった💡

引き続き Helmfile を試していて,GitHub に載っている「The Helmfile Best Practices Guide」を読んでいたら「テンプレート機能」が紹介されていた.Helmfile で多くの Helm Chart を管理していくと,徐々に helmfile.yaml が長くなる可能性がある.そこで「テンプレート機能」を使って共通化をすることで可読性を高くシンプルに記述できるようになる.さっそく試していく!

github.com

「テンプレート機能」を使わずに Helmfile を記述する

まずは「テンプレート機能」を使わずに Helmfile を記述する.今回はサンプルとして bitnami/metrics-serverbitnami/nginx-ingress-controllerHelm Chart でセットアップする.

artifacthub.io

artifacthub.io

ディレクトリ構成は以下とする.helmfile.yaml と環境ごとに values.yaml を用意する.

$ tree .
.
├── helmfile.yaml
├── metrics-server
│   ├── values-development.yaml
│   ├── values-production.yaml
│   └── values-staging.yaml
└── nginx-ingress-controller
    ├── values-development.yaml
    ├── values-production.yaml
    └── values-staging.yaml

2 directories, 7 files

helmfile.yaml を以下のように記述する.複雑な記述はなく bitnami/metrics-serverbitnami/nginx-ingress-controller を含めている.

environments:
  development:
  staging:
  production:

releases:
  - name: metrics-server
    chart: bitnami/metrics-server
    namespace: kube-system
    version: 5.10.0
    values:
      - metrics-server/values-{{`{{ .Environment.Name }}`}}.yaml
  - name: nginx-ingress-controller
    chart: bitnami/nginx-ingress-controller
    namespace: kube-system
    version: 7.6.21
    values:
      - nginx-ingress-controller/values-{{`{{ .Environment.Name }}`}}.yaml

実際に helmfile apply コマンドを実行するとうまくセットアップできた.

$ helmfile -e staging apply

(中略)

UPDATED RELEASES:
NAME                       CHART                              VERSION
metrics-server             bitnami/metrics-server              5.10.0
nginx-ingress-controller   bitnami/nginx-ingress-controller    7.6.21

$ helmfile delete

「テンプレート機能」を使って Helmfile を書く

今度は「テンプレート機能」を使って Helmfile を記述する.以下のように templates を使って Helm Chart の宣言をテンプレート化できる.今回は chartnamespacevalues を含めつつ .Release.Name.Environment.Name をパラメータとして埋め込むようにしている.そして YAML 自体に実装されているマージ機能 << を使って releases を記述している.

environments:
  development:
  staging:
  production:

templates:
  default: &default
    chart: bitnami/{{`{{ .Release.Name }}`}}
    namespace: kube-system
    values:
      - "{{`{{ .Release.Name }}`}}/values-{{`{{ .Environment.Name }}`}}.yaml"

releases:
- name: metrics-server
  version: 5.10.0
  <<: *default
- name: nginx-ingress-controller
  version: 7.6.21
  <<: *default

結果は同じく helmfile apply コマンドを実行してセットアップすることができた.

$ helmfile -e staging apply

(中略)

UPDATED RELEASES:
NAME                       CHART                              VERSION
metrics-server             bitnami/metrics-server              5.10.0
nginx-ingress-controller   bitnami/nginx-ingress-controller    7.6.21

$ helmfile delete

まとめ

Helmfile「テンプレート機能」を使うと helmfile.yaml を 共通化して可読性を高くシンプルに記述できるようになる.今回のサンプルでは「18行」「19行」とむしろ行数が増えてしまったけど,Helm Chart を増やせばメリットが出てくるし,何しろ設定ミスを減らすことにも繋がるため,行数だけでは判断できないと思う.引き続き Helmfile を試していくぞー!

関連記事

kakakakakku.hatenablog.com