kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Helmfile で Helm Chart を宣言的に管理する

Helm を使うと Kubernetes クラスタ上に簡単にアプリケーションなどをインストールできる.そして Helm ChartArtifact Hub で確認できる.また values.yaml と組み合わせれば Helm Chart のデフォルト設定を変更することもできる.しかし helm コマンドを使って実行する場合,以下のようになり「宣言的に」管理できないという課題も残る.今回は Jenkins をサンプルとして使う.

$ helm install my-jenkins jenkins/jenkins --version 3.3.23 -f values.yaml

artifacthub.io

Helmfile とは ⎈

そこで Helmfile を紹介する💡Helmfile を使うと helm コマンドを実行するときの設定を YAML で「宣言的に」管理できるようになる.現在もアクティブ開発されていて利用実績も多そう.今回は Helmfile を試していく!

github.com

前提として helmfile コマンドを準備しておく.今回は Homebrew を使う.また helmfile diff コマンドを使うこともあるため helm-diff も追加でインストールしておく.それにしても v0.140 ってスゴイ👀

$ brew install helmfile
$ helm plugin install https://github.com/databus23/helm-diff

$ helmfile version
helmfile version v0.140.0

Helmfile に入門する ⎈

Helmfile では,以下のように helmfile.yaml を作るところから開始する.helm コマンド的には helm install my-jenkins jenkins/jenkins --version 3.3.23 -f values.yaml と同じ意味になる.サンプルとして values.yaml も載せておく.今回は serviceTypeservicePort を変更する.

📁 helmfile.yaml

releases:
  - name: my-jenkins
    chart: jenkins/jenkins
    version: 3.3.23
    values:
      - values.yaml

📁 values.yaml

controller:
  serviceType: NodePort
  servicePort: 8888

さっそく helmfile apply コマンドを使って Helm Chart をインストールする.

$ helmfile apply

(中略)

UPDATED RELEASES:
NAME         CHART             VERSION
my-jenkins   jenkins/jenkins    3.3.23

すぐに Jenkins にアクセスできるようになる.画面右下に書いてある通り Jenkins 2.289.1 になっていた.

f:id:kakku22:20210908202659p:plain

Helm Chart を更新する ⎈

次に Helm Chart を更新する.以下のように helmfile.yamlversion: 3.3.23version: 3.4.1 にする.

releases:
  - name: my-jenkins
    chart: jenkins/jenkins
    version: 3.4.1
    values:
      - values.yaml

実行をする前に helmfile diff コマンドを使って差分を確認することもできる.今回はバージョン間の差が少なかった.

$ helmfile diff
Comparing release=my-jenkins, chart=jenkins/jenkins

(中略)

default, my-jenkins, StatefulSet (apps) has changed:
  # Source: jenkins/templates/jenkins-controller-statefulset.yaml
  apiVersion: apps/v1
  kind: StatefulSet
  metadata:
    name: my-jenkins
    namespace: default
    labels:
      "app.kubernetes.io/name": 'jenkins'
-     "helm.sh/chart": "jenkins-3.3.23"
+     "helm.sh/chart": "jenkins-3.4.1"
      "app.kubernetes.io/managed-by": "Helm"
      "app.kubernetes.io/instance": "my-jenkins"
      "app.kubernetes.io/component": "jenkins-controller"

(中略)

もう1度 helmfile apply コマンドを実行するとすぐに更新される!簡単!

$ helmfile apply

(中略)

UPDATED RELEASES:
NAME         CHART             VERSION
my-jenkins   jenkins/jenkins     3.4.1

1度削除をしておく.

$ helmfile delete

DELETED RELEASES:
NAME
my-jenkins

Helmfile で複数環境を作る ⎈

もう少し Helmfile の良さを試していく.Helmfile では productionstaging など「複数環境」を作ることができる.helmfile.yaml に以下のように environments を設定して {{ .Environment.Name }} で参照することができる.

📁 helmfile.yaml

environments:
  development:
  staging:
  production:

releases:
  - name: my-jenkins
    chart: jenkins/jenkins
    version: 3.4.1
    values:
      - values-{{ .Environment.Name }}.yaml

そして values-production.yamlvalues-staging.yaml など,環境ごとに values.yaml を用意しておく.今回試す values-staging.yaml では servicePort8889 に変えた.

$ tree .
.
├── helmfile.yaml
├── values-development.yaml
├── values-production.yaml
└── values-staging.yaml

0 directories, 4 files

📁 values-staging.yaml

controller:
  servicePort: 8889

さっそく -e オプションを使って staging 環境を作る.指定した通り servicePort8889 になっている.便利!

$ helmfile -e staging apply

(中略)

UPDATED RELEASES:
NAME         CHART             VERSION
my-jenkins   jenkins/jenkins     3.4.1

$ kubectl describe services my-jenkins | egrep '^Port:'
Port:              http  8889/TCP

まとめ ⎈

今回は Helmfile に入門した.Helmfile にはまだ他にも機能があるため引き続き試していくぞー!

github.com