Helmを使ってアプリケーションをデプロイしてみた

2023/07/30に公開

Helmを触ってある程度使い方が理解できたので、やったことをまとめておこうと思います。

今回作成したファイルはGitHubにアップロードしてあります。

https://github.com/BooookStore/playground/tree/2e8b9fa6f81a7bdbf8dc4cb6dd08cc0246d374c5/helm-my-playground-wiremock

Helmの公式ドキュメントは以下です。日本語もありましたが、英語の方が内容が充実していました。
https://helm.sh/docs/

HelmはKubernetesのパッケージマネージャーです。 aptdnf を使えばLinuxマシンにソフトウェアをインストールできるのと同様に、Helmを使えば簡単にKubernetesにアプリケーションをデプロイできます。インストールだけでなく、アプリケーションの削除・更新といった操作もできます。

Helmはチャートと呼ばれるアプリケーションの雛形を元に、リリースと呼ばれる単位でアプリケーションをKubernetesにデプロイします。リリースは一つのチャートに対し複数作ることができます。チャートは自身で作ることもできますし、インターネットで共有することもできます。https://artifacthub.io/ にはインターネットで公開されているチャートを検索してインストールすることができます。

今回はゼロからチャートを作ってWiremockを手元のKubernetes環境にデプロイしてみます。

Helmチャートを作成する

Helm create <チャート名> コマンドで新規チャートを作成できます。

❯ helm create helm-my-playground-wiremock
Creating helm-my-playground-wiremock

新規作成後のフォルダ構成は以下のようになっています。

❯ tree helm-my-playground-wiremock
helm-my-playground-wiremock
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

4 directories, 10 files

下記の公式ガイドでそれぞれのディレクトリ、ファイルについて解説があります。helm createコマンドで作成されないディレクトリやファイルについても説明があるので詳しく知りたい人は一読しておくと良いと思います。

https://helm.sh/docs/topics/charts/#the-chart-file-structure

ここでは基本的なものを簡単に説明しておきます。

  1. Chart.yaml ... このディレクトリがチャートであることを示すファイルです。チャートに関する基本的な事柄(名前やバージョンなど)を記載します。
  2. templatesディレクトリ ... values.yamlと組み合わせ、デプロイするKubernetesマニフェストファイルのテンプレートを配置します。複数ファイル配置できます。
  3. values.yaml ... templatesディレクトリのKubernetesマニフェストファイルと組み合わせる値を記載します。この値はデフォルト値であり、コマンドの引数で上書きすることもできます。

Deploymentを定義する

Helmはtemplates以下にあるファイルをvalues.yamlファイルでレンダリングしKubernetesへデプロイします。なので、DeploymentやServiceといったKubernetesマニフェストファイルはtemplates以下に配置します。

今回はWiremockをデプロイしたいので以下のようなファイルをtemplatesに配置しました。初期生成されたその他のファイルは削除しています。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicas }}
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
        - name: wiremock
          image: wiremock/wiremock:{{ .Values.image.tag }}

Kubernetesのマニフェストの構造をしていますが {{ }} で囲われた要素があるのがわかります。この要素はレンダリングによって特定の値に書き換えられます。(HelmはGoのテンプレートを使っています。)書き換える値はオブジェクトと変数名で指定します。例えば {{ .Values.replicas}} はオブジェクトがValues、変数名がreplicasです。また、 {{ .Release.Name }} はオブジェクトがReleas、変数名がNameです。

オブジェクトと変数名はオブジェクト指向のクラスと変数のような関係と思います。上記の場合、オブジェクトによって値の取得元が変わります。Releaseはリリースから、Valuesは values.yaml ファイルから値を取得します。ReleaseはビルトインオブジェクトでありHelmから各変数が提供されます。{{ .Release.Name }} はhelmコマンドでリリースを作成するときに指定する名前になります。ビルトインオブジェクトに関しては以下の公式ドキュメントで詳しく解説されていました。

https://helm.sh/docs/chart_template_guide/builtin_objects/

今回のvalues.yamlは以下のようにしています。これらの値はtemplate配下のYAMLファイルから、 {{ .Values.replicas }} または {{ .Values.image.tag }} といった具合で取得できます。

values.yaml
replicas: 3
image:
  tag: 2.35.0-1

マニフェストをレンダリングする

helm install --dry-run --debug <リリース名> <チャートディレクトリ> でレンダリング結果を表示できます。--debugを使うことで変数がどのように計算されたかを確認することができて便利です。このコマンドはKubernetesにアプリケーションをデプロイメントしないため、単に出力を確認したい場合に役立ちます。

❯ helm install --dry-run --debug wiremock-demo .
install.go:194: [debug] Original chart version: ""
install.go:211: [debug] CHART PATH: /home/bookstore/github/playground/helm-my-playground-wiremock

NAME: wiremock-demo
LAST DEPLOYED: Sun Jul 30 17:15:05 2023
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
image:
  tag: 2.35.0-1
replicas: 3

HOOKS:
MANIFEST:
---
# Source: helm-my-playground-wiremock/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wiremock-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wiremock-demo
  template:
    metadata:
      labels:
        app: wiremock-demo
    spec:
      containers:
        - name: wiremock
          image: wiremock/wiremock:2.35.0-1

ざっくりとしたイメージにするとこのようになります。

チャートをインストール・確認・削除する

helm install <リリース名> <チャートディレクトリ> でアプリケーションをKubernetesにデプロイできます。次のようにデプロイしてみます。

❯ helm install wiremock-demo .
NAME: wiremock-demo
LAST DEPLOYED: Sun Jul 30 20:12:34 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

helm ls でインストール済みのリリースを一覧表示できます。

❯ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                                   APP VERSION
wiremock-demo   default         1               2023-07-30 20:12:34.635959345 +0900 JST deployed        helm-my-playground-wiremock-0.1.0       1.16.0

以下のようにDeploymentが正しく作成されたことがわかります。

❯ kubectl get deploy wiremock-demo
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
wiremock-demo   3/3     3            3           11s

helm uninstall <リリース名> でリリースをアンインストール(破棄)できます。

❯ helm uninstall wiremock-demo
release "wiremock-demo" uninstalled

Discussion