Helmチャート超入門:Kubernetesのパッケージマネージャでアプリデプロイを爆速化する方法
こんにちは!クラウドインフラの世界へようこそ。君たちが今、Kubernetes (k8s) の世界に足を踏み入れたばかりだとしたら、たくさんのリソースをYAMLファイルで定義して、`kubectl apply` する作業に少し戸惑っているかもしれませんね。でも、心配いりません!今日は、そんな君たちのKubernetesライフを劇的に変える魔法のツール、「Helm」の世界へ案内します。
「Helm?何それ?」「アプリのデプロイって、そんなに爆速化できるの?」と思った君、大正解です!Helmは、Kubernetesのアプリケーションをパッケージ化し、デプロイ、管理するための強力なツール。これを使いこなせば、日々の開発や運用が驚くほど効率的になります。まるで、魔法の杖を手に入れたような感覚になるはずですよ。
この記事では、Helmの基本から、簡単なアプリをデプロイするまでを、優しく丁寧に解説していきます。「これだけ押さえれば大丈夫!」というエッセンスをギュッと凝縮したので、ぜひ最後までじっくり読んで、Helmの便利さを体感してください。
1. Helmとは?導入するメリットと仕組み
まず、Helmが一体何者なのか、そしてなぜ私たちがこれを使うべきなのか、その理由を理解しましょう。
Helmとは?
Helmは、Kubernetesの「パッケージマネージャ」です。Linuxでいうところの`apt`や`yum`、macOSでいうところの`brew`のようなものだと想像してみてください。Helmを使うと、Kubernetesアプリケーション(設定ファイル群)を「チャート」という単位で管理できます。
- チャート (Chart): Kubernetesアプリケーションをデプロイするために必要な、すべてのリソース定義(Deployment, Service, ConfigMap, etc.)と、それらを管理するためのメタデータ(バージョン情報、依存関係など)をまとめたものです。
- リリース (Release): HelmチャートをKubernetesクラスターにデプロイしたインスタンスのことです。例えば、WordPressのチャートをインストールしたら、それはWordPressの「リリース」となります。
Helmを導入するメリット
Helmを導入することで、以下のような素晴らしいメリットがあります。
- デプロイの簡素化: 複雑なYAMLファイルの集合体を、たった一つのコマンドでデプロイできるようになります。
- 再利用性と共有: 作成したチャートは再利用可能で、チーム内やコミュニティで共有することも容易です。
- バージョン管理: アプリケーションのデプロイ履歴を管理し、特定のバージョンにロールバックすることが簡単になります。
- 設定の柔軟性: チャートの動作をカスタマイズするための「値」を外部から指定できるため、環境ごとに異なる設定を容易に適用できます。
- 依存関係の管理: あるアプリケーションが別のアプリケーション(例: Webアプリがデータベース)に依存している場合、その依存関係もHelmで管理できます。
Helmの仕組み
Helmは、以下の2つのコンポーネントで構成されています。
1. Helmクライアント (CLI): 私たちが日常的に使うコマンドラインツールです。チャートの検索、インストール、アンインストール、アップデートなど、すべての操作を行います。
2. Tiller (Helm v2まで): Kubernetesクラスター上で動作し、Helmクライアントからの指示を受けて実際にリソースを作成・管理していました。
- 【重要】 Helm v3からは、Tillerは廃止されました! Helm v3は、クライアントサイドでリソースを生成し、`kubectl`と同じ権限でKubernetes APIと直接やり取りします。これにより、セキュリティが向上し、セットアップもシンプルになりました。この記事では、最新のHelm v3を前提として解説します。
つまり、Helm v3では、君のPC(またはCI/CD環境)にあるHelmクライアントが、Kubernetesクラスターと直接通信して、チャートをデプロイしてくれる、というイメージです。
2. Helmのインストールとリポジトリ追加
さて、Helmの便利さを知ったところで、早速インストールしてみましょう。
Helmのインストール
Helmのインストール方法はいくつかありますが、ここでは最も手軽な方法を紹介します。
macOS (Homebrewを使用)
brew install helm
Linux (スクリプトを使用)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
インストールが完了したら、バージョンを確認してみましょう。
helm version
`version.BuildInfo{Version:”v3.x.x”, …}` のように表示されれば成功です!
Helmリポジトリの追加
Helmでは、公開されているチャートを「リポジトリ」という場所から探してインストールします。よく使われる公式リポジトリや、特定のアプリケーションのリポジトリを追加しておくと便利です。
まずは、代表的なリポジトリである`stable`(現在はdeprecatedになっており、Helm Hubからの参照は推奨されていませんが、古いドキュメントなどで見かけることがあります。最新では`oci`レジストリなどが主流になっています)や、`bitnami`リポジトリなどを追加してみましょう。
Bitnamiリポジトリを追加 (多くの人気アプリケーションのチャートを提供しています)
helm repo add bitnami https://charts.bitnami.com/bitnami
リポジトリリストを確認
helm repo list
`helm repo list` を実行すると、追加したリポジトリとそのURLが表示されます。
NAME URL
bitnami https://charts.bitnami.com/bitnami
リポジトリを追加したら、最新のチャート情報を取得するために `helm repo update` を実行しましょう。
helm repo update
これで、追加したリポジトリのチャート情報をローカルに同期できました。
3. 既存のチャートを使ったアプリのインストール
いよいよ、Helmの真骨頂である「既存チャートを使ったアプリのインストール」を体験しましょう。今回は、多くの開発者にとっての「Hello, World!」であるWebサーバー、`nginx`をインストールしてみます。
1. チャートの検索
まずは、インストールしたいチャートがリポジトリにあるか探してみましょう。`bitnami`リポジトリに`nginx`があるはずです。
bitnamiリポジトリにあるnginxチャートを検索
helm search repo nginx –devel
`–devel` オプションをつけると、開発版(プレリリース版)のチャートも検索対象に含まれます。
実行すると、以下のような結果が表示されるはずです(バージョンは異なる場合があります)。
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 10.3.2 1.21.6 NGINX is a free, open-source, high-performance HTTP and reverse proxy server.
`NAME`列の `bitnami/nginx` が、私たちがインストールしたいチャート名です。`CHART VERSION`はチャート自体のバージョン、`APP VERSION`はチャートがデプロイするアプリケーション(この場合はnginx)のバージョンを示します。
2. チャートのインストール
目的のチャートが見つかったら、`helm install` コマンドでインストールします。
nginxをインストール。リリース名を ‘my-nginx’ とします。
helm install my-nginx bitnami/nginx
- `my-nginx`: これは、このリリースを識別するための名前です。好きな名前をつけてください。
- `bitnami/nginx`: `リポジトリ名/チャート名` の形式で指定します。
インストールが成功すると、以下のような情報が表示されます。
NAME: my-nginx
LAST DEPLOYED: Mon Oct 26 10:00:00 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods -l “app.kubernetes.io/name=nginx,app.kubernetes.io/instance=my-nginx” -o jsonpath=”{.items[0].metadata.name}”)
export CONTAINER_PORT=$(kubectl get pod $POD_NAME -o jsonpath=”{.spec.containers[0].ports[0].containerPort}”)
echo “Visit http://127.0.0.1:8080 to use your application”
kubectl port-forward $POD_NAME 8080:$CONTAINER_PORT
この`NOTES`セクションが非常に重要です!アプリへのアクセス方法や、今後役立つ情報が記載されています。
3. インストールされたリソースの確認
`helm install` コマンドは、指定されたチャートに含まれるKubernetesリソース(Deployment, Service, Podなど)を自動的に作成します。`kubectl`コマンドで確認してみましょう。
デプロイメントを確認
kubectl get deployment
サービスを確認
kubectl get service
ポッドを確認
kubectl get pods
`my-nginx`という名前に関連付けられたDeployment、Service、Podが作成されているのが確認できるはずです。
4. アプリケーションへのアクセス
`NOTES`セクションに示されているように、`kubectl port-forward` を使ってローカルからnginxにアクセスしてみましょう。
NOTESセクションのコマンドをコピーして実行
export POD_NAME=$(kubectl get pods -l “app.kubernetes.io/name=nginx,app.kubernetes.io/instance=my-nginx” -o jsonpath=”{.items[0].metadata.name}”)
export CONTAINER_PORT=$(kubectl get pod $POD_NAME -o jsonpath=”{.spec.containers[0].ports[0].containerPort}”)
echo “Visit http://127.0.0.1:8080 to use your application”
kubectl port-forward $POD_NAME 8080:$CONTAINER_PORT
ブラウザで `http://127.0.0.1:8080` にアクセスすると、nginxのウェルカムページが表示されるはずです! 🎉
5. リリースの管理
インストールしたリリースは、以下のコマンドで管理できます。
- リリース一覧の表示:
helm list
- リリースのアンインストール:
helm uninstall my-nginx
アンインストールすると、作成されたKubernetesリソースはすべて削除されます。
- リリースのアップグレード:
# 新しいバージョンのチャートや、設定を変更してアップグレード
helm upgrade my-nginx bitnami/nginx –version <新しいチャートバージョン>
- リリースの履歴確認とロールバック:
helm history my-nginx
helm rollback my-nginx <リビジョン番号>
これらを使いこなすことで、アプリケーションのライフサイクル管理が格段に楽になります。
4. 自作チャート(Chart.yaml, values.yaml)の基本
既存のチャートを使うのは簡単ですが、Helmの真の力を引き出すのは、自分たちでオリジナルのチャートを作成することです。ここでは、自作チャートの基本的な構造と、主要なファイルについて解説します。
チャートの構造
Helmチャートは、特定のディレクトリ構造を持っています。基本的なチャートは、以下のファイルとディレクトリで構成されます。
my-app-chart/
├── Chart.yaml # チャートのメタデータ
├── values.yaml # デフォルトの設定値
├── charts/ # 依存する他のチャート
└── templates/ # Kubernetesマニフェストファイル
├── deployment.yaml
├── service.yaml
└── …
- `Chart.yaml`: チャートの名前、バージョン、説明、作者、依存関係などを定義します。
- `values.yaml`: チャートのカスタマイズに使用される、デフォルトのキーと値のペアを定義します。`helm install` や `helm upgrade` 時に、このファイルを上書きして、デプロイするアプリケーションの挙動を変更します。
- `charts/`: このチャートが依存する他のチャート(サブチャート)を格納します。
- `templates/`: KubernetesリソースのYAMLマニフェストファイル(Deployment, Service, ConfigMapなど)を格納します。これらのファイルはGoテンプレート言語で記述されており、`values.yaml` から渡された値を使って動的に生成されます。
`Chart.yaml` の基本
`Chart.yaml` は、チャートの「顔」となるファイルです。
Chart.yaml
apiVersion: v2 # Helm APIバージョン (v2が推奨)
name: my-app-chart # チャートの名前
version: 0.1.0 # チャートのバージョン (セマンティックバージョニング推奨)
description: A Helm chart for my custom application # チャートの説明
type: application # チャートの種類 (application, libraryなど)
依存する他のチャート (もしあれば)
dependencies:
– name: redis
version: “10.x.x”
repository: “https://charts.bitnami.com/bitnami”
alias: redis-db # サブチャートに別名をつける
- `apiVersion`: HelmのAPIバージョンを指定します。`v2` を使うのが一般的です。
- `name`: チャートの一意な名前です。
- `version`: チャート自体のバージョンです。アプリケーションのバージョンとは異なります。
- `description`: チャートの簡単な説明です。
- `type`: チャートの種類を指定します。通常は `application` です。
- `dependencies`: このチャートが依存する他のチャートを指定できます。
`values.yaml` の基本
`values.yaml` は、チャートの挙動をカスタマイズするための「設定値」を定義するファイルです。
values.yaml
アプリケーションのレプリカ数
replicaCount: 2
アプリケーションイメージの設定
image:
repository: nginx # デフォルトのイメージリポジトリ
pullPolicy: IfNotPresent # イメージプルポリシー
tag: “1.21.6” # デフォルトのイメージタグ
サービスの設定
service:
type: ClusterIP # サービスタイプ
port: 80 # サービスポート
Ingressの設定 (もしIngressを使う場合)
ingress:
enabled: false
hostname: my-app.example.com
className: “”
このように、ネストされた構造で設定値を定義できます。この`values.yaml`に定義された値は、`templates/` ディレクトリ内のYAMLファイルから参照され、動的なリソース生成に使われます。
`templates/` ディレクトリの基本
`templates/` ディレクトリには、KubernetesリソースのYAMLファイルが格納されます。これらのファイルはGoテンプレート言語で記述されており、`values.yaml` の値や、Helmによって提供される組み込み変数(`{{ .Release.Name }}`, `{{ .Chart.AppVersion }}` など)を使って動的に生成されます。
例えば、`templates/deployment.yaml` の一部は以下のようになります。
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include “my-app-chart.fullname” . }} # チャート名とリリース名を組み合わせた名前
labels:
{{- include “my-app-chart.labels” . | nindent 4 }} # チャートのラベルをインクルード
spec:
replicas: {{ .Values.replicaCount }} # values.yamlからレプリカ数を取得
selector:
matchLabels:
{{- include “my-app-chart.selectorLabels” . | nindent 6 }}
template:
metadata:
labels:
{{- include “my-app-chart.selectorLabels” . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: “{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}” # values.yamlからイメージリポジトリとタグを取得
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: 80 # デフォルトのコンテナポート (Serviceで利用)
protocol: TCP
- `{{ .Values.replicaCount }}`: `values.yaml` で定義された `replicaCount` の値を取得します。
- `{{ .Values.image.repository }}`: `values.yaml` で定義された `image.repository` の値を取得します。
- `{{ .Values.image.tag | default .Chart.AppVersion }}`: `values.yaml` で `image.tag` が定義されていればその値を、定義されていなければ `Chart.yaml` の `appVersion` を使用します。
- `{{ include “my-app-chart.fullname” . }}`: これは「ヘルパーテンプレート」と呼ばれるもので、チャート名やリリース名から一意な名前を生成する、再利用可能なコードスニペットです。`_helpers.tpl` というファイルに定義されていることが多いです。
自作チャートの作成とインストール
自作チャートを作成する最も簡単な方法は、`helm create` コマンドを使うことです。
my-custom-app という名前で新しいチャートを作成
helm create my-custom-app
このコマンドを実行すると、上記で説明した基本的なディレクトリ構造とファイルが生成されます。あとは、`my-custom-app/values.yaml` を編集してアプリケーションの設定を定義し、`my-custom-app/templates/` ディレクトリ内のYAMLファイルを必要に応じて修正・追加していけばOKです。
作成したチャートは、以下のコマンドでインストールできます。
現在のディレクトリにあるチャートをインストール
helm install my-app ./my-custom-app
values.yamlを上書きしてインストール (例: レプリカ数を1にする)
helm install my-app ./my-custom-app -f my-custom-app/values.yaml –set replicaCount=1
- `-f <ファイル名>`: 指定したYAMLファイルの内容で `values.yaml` を上書きします。
- `–set <キー>=<値>`: コマンドラインから直接値を設定します。複数の設定をまとめて指定することも可能です。
まとめ:HelmでKubernetesデプロイを加速しよう!
お疲れ様でした!今日はHelmの基本的な使い方から、自作チャートの構造までを駆け足で見てきました。
Helmを使いこなすことで、
- 複雑なKubernetesリソースの管理が劇的に楽になる
- アプリケーションのデプロイ、アップデート、ロールバックが高速かつ確実になる
- チーム内やコミュニティでのアプリケーション共有が容易になる
といった、まさに「爆速化」を実感できるはずです。
今回紹介したのはHelmのほんの入り口ですが、ここからさらに掘り下げていくことで、Kubernetesの運用効率は飛躍的に向上します。ぜひ、今日学んだことを活かして、色々なアプリケーションをHelmでデプロイしてみてください。
「これさえマスターすれば、毎日の作業が劇的に楽になりますよ」と、先輩エンジニアとして自信を持って言えます!
Helmの世界へようこそ!これからも、どんどん学んで、より快適なクラウドインフラの世界を築いていきましょう!