TL;DR
Helmは、Kubernetesアプリケーションにおけるパッケージマネジャーです。
この記事ではミニマムなHelm Chartを作成することにより、Helmの概要について説明します。
記事で使用するサンプルHelm Chartは以下のリポジトリにあります。
Github: https://github.com/cacapouh/helm-chart-minimum-example
Helmパッケージの初期化
Helmパッケージを初期化するには、以下のコマンドを使用します。
helm create ${ディレクトリ名}
コマンド実行結果:
$ helm create simple-app
Creating simple-app
$ tree simple-app
simple-app
├── Chart.yaml
├── charts
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
helm create
コマンドを実行すると、デフォルトのマニフェストファイルが生成されます。
この記事ではミニマムなHelm Chartを作る関係で、以下のようにファイルを削除します。
$ cd simple-app
$ rm -rf charts values.yaml templates/*
$ tree .
.
├── Chart.yaml
└── templates
Helm Chartのざっくり説明
Helm Chartは、Kubernetesアプリケーションのパッケージで、
主な要素はChart.yaml
ファイルとtemplate
ディレクトリです。
Chart.yaml
はバージョン情報やパッケージ名を含むファイルで、こちらで詳細な仕様が説明されています。
apiVersion: v2
name: simple-app
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.1.0"
template
ディレクトリは、適用するマニフェストファイルを格納する場所です。
この記事の例では扱いませんが、
template
配下のマニフェストファイルでは、Go Templateが利用可能です。
(上記で削除してしまいましたが)テンプレートに使う値は、values.yaml
で定義することが可能です。
※ Go Templateは、Go言語で利用されるテンプレートエンジンです。
デプロイ対象のアプリ
サンプルアプリとして、以下の簡素なPythonスクリプトをデプロイします。
if __name__ == '__main__':
print("Hello World")
マニフェストの作成
次に上記のPythonアプリ用Dockerfileと、
Deploymentのマニフェストファイルを作成します。
FROM python:3.9.18-slim
RUN mkdir /work
WORKDIR /work
COPY main.py /work
ENTRYPOINT python main.py
apiVersion: apps/v1
kind: Deployment
metadata:
name: simple-app-deployment
labels:
app: simple-app
spec:
replicas: 2
selector:
matchLabels:
app: simple-app
template:
metadata:
labels:
app: simple-app
spec:
containers:
- name: simple-app
image: "simple-app:latest"
imagePullPolicy: IfNotPresent
Helmパッケージのインストール
Dockerビルドして、helm install
コマンドを実行します。
$ docker build . -t simple-app
$ minikube image loadminikube image load simple-app:latest # minikube環境の場合
$ helm install ./simple-app --generate-name
動作チェック
以下はhelm install
後にPodのログを確認した結果です。
Pythonスクリプトに記載の通り、Hello World
と出力されています。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
simple-app-deployment-678bcdc8bf-7kjpn 0/1 Completed 2 (27s ago) 29s
simple-app-deployment-678bcdc8bf-fp8bp 0/1 Completed 2 (27s ago) 29s
$ kubectl logs simple-app-deployment-678bcdc8bf-7kjpn
Hello World
おわりに
template
ディレクトリ配下にマニフェストファイルを設置し、
helm install
することにより、マニフェストを適用することができました。
実務でありそうなケースとして、
アプリケーションを構成する複数のマニフェストファイルが存在する場合、
Go Template機能を利用して1つのファイルで本番環境設定とテスト環境設定を切り替えることができます