Helmを使ってアプリケーションをデプロイしてみた
Helmを触ってある程度使い方が理解できたので、やったことをまとめておこうと思います。
今回作成したファイルはGitHubにアップロードしてあります。
Helmの公式ドキュメントは以下です。日本語もありましたが、英語の方が内容が充実していました。
HelmはKubernetesのパッケージマネージャーです。 apt
や dnf
を使えば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
コマンドで作成されないディレクトリやファイルについても説明があるので詳しく知りたい人は一読しておくと良いと思います。
ここでは基本的なものを簡単に説明しておきます。
- Chart.yaml ... このディレクトリがチャートであることを示すファイルです。チャートに関する基本的な事柄(名前やバージョンなど)を記載します。
- templatesディレクトリ ... values.yamlと組み合わせ、デプロイするKubernetesマニフェストファイルのテンプレートを配置します。複数ファイル配置できます。
- 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コマンドでリリースを作成するときに指定する名前になります。ビルトインオブジェクトに関しては以下の公式ドキュメントで詳しく解説されていました。
今回のvalues.yamlは以下のようにしています。これらの値はtemplate配下のYAMLファイルから、 {{ .Values.replicas }}
または {{ .Values.image.tag }}
といった具合で取得できます。
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