Helmチャート超入門:Kubernetesのパッケージマネージャでアプリデプロイを爆速化するプロの実践知見
こんにちは。テックリードの私だ。
Kubernetes(以下、K8s)の生のマニフェスト(YAML)を素手で書き、`kubectl apply`を連打する日々を送っていないだろうか?
環境(dev, staging, prod)ごとに名前空間やレプリカ数、環境変数が微妙に異なり、パッチ当てのYAML地獄にハマる……。そんなSREの悪夢を断ち切るために存在する究極の武器が Helm だ。
本記事では、単なる「公式ドキュメントのなぞり」は一切しない。現場で明日からデプロイ速度を3倍にし、チーム開発の不毛なコンフリクトを根絶するための「プロの実践知見」を叩き込む。
—
1. Helmとは? 導入するメリットと仕組み
Helmは、K8sのための真のパッケージマネージャ(APTやHomebrewのK8s版)だ。
複数のマニフェスト(Deployment, Service, Ingressなど)を「チャート(Chart)」という一つの単位にパッケージングし、変数(Values)を流し込むことで、環境差異を美しく吸収する。
なぜ生YAMLではなくHelmを使うべきなのか?
1. 完全な冪等性(Idempotency)とロールバック: `helm upgrade` はトランザクション的であり、失敗時は一瞬で前のバージョンにロールバックできる(`helm rollback`)。
2. リリース管理の抽象化: どのバージョンがどのパラメーターでデプロイされているかがK8sクラスター内にシークレットとして保持され、`helm list` で一目瞭然になる。
3. DRY原則の徹底: 共通のアプリケーション構造をテンプレート化し、環境ごとの差異(`values-prod.yaml`等)だけを差し替える。
—
2. Helmのインストールとリポジトリ追加
まずは道具を研ぎ澄まそう。モダンな開発環境において、インストール手順で躓いている暇はない。
最速のインストール(macOS / Linux)
Homebrewを使う場合(macOS / Linux)
brew install helm
ワンライナーで最新版を爆速インストールする場合
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
開発スピードを極限まで高める「神プラグイン」
標準のHelmだけでは、実務のスピード感には追いつけない。以下のプラグインは絶対に入れろ。
1. helm-diff: applyする前に「何が変わるのか」をgit diff形式で可視化する(人身事故を防ぐ防壁)
helm plugin install https://github.com/databus23/helm-diff
2. helm-s3: AWS S3をプライベートHelmチャートリポジトリとして扱えるようにする
helm plugin install https://github.com/hypnoglow/helm-s3
> 🔥 テックリードの裏技:キーボードショートカット(Alias設定)
> 毎度 `helm upgrade –install` と打つのは指の無駄だ。`~/.zshrc` または `~/.bashrc` に以下を追加し、打鍵数を最小化せよ。
>
> alias h=’helm’
> alias hi=’helm install’
> alias hu=’helm upgrade –install’
> alias hd=’helm diff upgrade’
> alias hdel=’helm uninstall’
>
> これにより、`hu my-app ./my-chart -f values-prod.yaml` のように爆速で操作できるようになる。特に `hd`(helm diff)は、CI/CDパイプラインでもローカルでも、デプロイ前の必須チェックとして叩き込むこと。
—
3. 既存のチャートを使ったアプリのインストール
世の中のほとんどのオープンソース(Redis, PostgreSQL, Prometheus等)は、公式の Artifact Hub で公開されている。これらを自社インファに組み込む際のベストプラクティスを示そう。
公式リポジトリの追加
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
本番想定:カスタムvaluesを指定してPostgreSQLをインストール
helm upgrade –install prod-db bitnami/postgresql \
–namespace database \
–create-namespace \
–set architecture=replication \
–set primary.persistence.size=50Gi
ここで重要なのは、`–set` を乱用しないことだ。コマンドライン引数でのパラメータ上書きは、履歴が追いにくく、Infrastructure as Codeの理念に反する。実務では必ず設定ファイルを切り出せ。
—
4. 自作チャート(Chart.yaml, values.yaml)の基本
ここからが本番だ。自社製マイクロサービスをデプロイするための「プロダクションレディな自作チャート」の構成を解説する。
黄金のディレクトリ構造
my-service/
├── Chart.yaml # チャートのメタデータ
├── values.yaml # デフォルトの設定値(環境非依存)
├── values-dev.yaml # 開発環境オーバーライド
├── values-prod.yaml # 本番環境オーバーライド
└── templates/ # マニフェストテンプレート群
├── _helpers.tpl # 共通関数(命名規則など)
├── deployment.yaml # アプリケーションの本体
└── service.yaml # 内部ルーティング
① Chart.yaml(メタデータ)
apiVersion: v2
name: my-service
description: A Helm chart for Kubernetes microservices
type: application
version: 0.1.0 # チャート自体のバージョン
appVersion: “1.2.0” # コンテナイメージのタグ(アプリのバージョン)
② values.yaml(デフォルト設定のベストプラクティス)
実務では、最初から「オートスケーリング」「リソース制限(Requests/Limits)」「ヘルスチェック(Probes)」を組み込んだテンプレートを共通基盤としてチームに配るべきだ。
values.yaml
replicaCount: 2
image:
repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-service
pullPolicy: IfNotPresent
tag: “” # Chart.yamlの appVersion が使われる
service:
type: ClusterIP
port: 80
targetPort: 8080
resources:
# ゼロからスケールする際のリソース枯渇を防ぐため、必ずデフォルトで制限を入れる
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
livenessProbe:
httpGet:
path: /healthz
port: http
readinessProbe:
httpGet:
path: /readyz
port: http
③ templates/deployment.yaml(実用テンプレート)
Helmの真骨頂であるテンプレート構文を埋め込んだDeploymentだ。`_helpers.tpl` で定義したラベル命名規則(`my-service.fullname` 等)を呼び出すことで、リソース間の結びつきを堅牢にする。
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include “my-service.fullname” . }}
labels:
{{- include “my-service.labels” . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include “my-service.selectorLabels” . | nindent 6 }}
template:
metadata:
labels:
{{- include “my-service.selectorLabels” . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: “{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}”
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.targetPort }}
protocol: TCP
livenessProbe:
httpGet:
path: {{ .Values.livenessProbe.httpGet.path }}
port: {{ .Values.livenessProbe.httpGet.port }}
readinessProbe:
httpGet:
path: {{ .Values.readinessProbe.httpGet.path }}
port: {{ .Values.readinessProbe.httpGet.port }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
—
チーム開発で役立つ設定の共有化ルール
最後に、組織としてHelmをスケールさせるための鉄則を授ける。
1. 「生マニフェストの直書き」をGitで禁止せよ: アプリケーションのリポジトリには生YAMLではなく、このHelmチャート、もしくは共通チャートを呼び出すラッパーを持たせる。
2. 環境別valuesの管理: `values-dev.yaml`, `values-prod.yaml` はアプリケーションリポジトリで管理し、機密情報(DBパスワードやAPIトークン)は決してこれらに書かず、External Secrets OperatorやArgoCDの機能を使って安全にインジェクションせよ。
3. デプロイの自動化: ローカルからの `helm upgrade` は緊急時以外禁止とし、GitOps(ArgoCDやFlux)と連携させよ。ArgoCDは内部でHelmをネイティブサポートしているため、本記事で作成したチャートをそのままGitにプッシュするだけで、宣言的なCDパイプラインが完成する。
Helmをマスターすることは、Kubernetesインフラの主導権を完全に握ることを意味する。
さあ、今すぐターミナルを開き、君のプロジェクトにHelmを導入してデプロイを爆速化してくれ。