HelmはKubernetesのパッケージマネージャーで、再利用可能なChartを通じてアプリケーションデプロイを簡素化します。テンプレート化、バージョニング、リリース管理を処理します。
なぜHelmなのか?
flowchart LR
subgraph Without["Helmなし"]
A1["deployment.yaml"]
A2["service.yaml"]
A3["configmap.yaml"]
A4["secret.yaml"]
A5["ingress.yaml"]
end
subgraph With["Helmあり"]
B["単一のChart"]
end
Without -->|"kubectl apply -f ..."| C["手動管理"]
With -->|"helm install"| D["自動管理"]
style Without fill:#ef4444,color:#fff
style With fill:#22c55e,color:#fff
Helmの概念
| 概念 |
説明 |
| Chart |
Kubernetesリソースのパッケージ |
| Release |
Chartのインストール済みインスタンス |
| Repository |
Chartのコレクション |
| Values |
Chartカスタマイズ用の設定 |
| Template |
プレースホルダー付きKubernetesマニフェスト |
Helmのインストール
brew install helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
helm version
リポジトリの操作
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm repo list
helm search repo nginx
helm search hub prometheus
Chartのインストール
基本的なインストール
helm install my-nginx bitnami/nginx
helm install my-nginx bitnami/nginx -n web --create-namespace
helm install my-nginx bitnami/nginx --set service.type=ClusterIP
helm install my-nginx bitnami/nginx -f values.yaml
Valuesファイル
replicaCount: 3
image:
repository: nginx
tag: "1.25"
service:
type: LoadBalancer
port: 80
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
ingress:
enabled: true
hostname: myapp.example.com
リリース管理
helm list
helm list -n my-namespace
helm list --all-namespaces
helm status my-nginx
helm get values my-nginx
helm get values my-nginx --all
helm get manifest my-nginx
helm upgrade my-nginx bitnami/nginx --set replicaCount=5
helm upgrade my-nginx bitnami/nginx -f new-values.yaml
helm rollback my-nginx 1
helm history my-nginx
helm uninstall my-nginx
Chartの作成
Chart構造
mychart/
├── Chart.yaml # Chartメタデータ
├── values.yaml # デフォルト値
├── charts/ # 依存関係
├── templates/ # Kubernetesマニフェスト
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # テンプレートヘルパー
│ └── NOTES.txt # インストール後のメモ
└── .helmignore # 無視するファイル
Chart.yaml
apiVersion: v2
name: myapp
description: マイアプリケーション用Helm Chart
type: application
version: 0.1.0
appVersion: "1.0.0"
dependencies:
- name: postgresql
version: "12.x.x"
repository: https://charts.bitnami.com/bitnami
condition: postgresql.enabled
values.yaml
replicaCount: 1
image:
repository: myapp
pullPolicy: IfNotPresent
tag: ""
nameOverride: ""
fullnameOverride: ""
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: ""
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
resources: {}
postgresql:
enabled: true
auth:
database: myapp
テンプレート例
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "myapp.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: 80
{{- if .Values.resources }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- end }}
ヘルパーテンプレート
{{/*
Chart名とバージョンを作成
*/}}
{{- define "myapp.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
共通ラベル
*/}}
{{- define "myapp.labels" -}}
helm.sh/chart: {{ include "myapp.chart" . }}
{{ include "myapp.selectorLabels" . }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
セレクターラベル
*/}}
{{- define "myapp.selectorLabels" -}}
app.kubernetes.io/name: {{ include "myapp.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
テンプレート関数
一般的な関数
{{ .Values.name | upper }}
{{ .Values.name | lower }}
{{ .Values.name | title }}
{{ .Values.name | quote }}
{{ .Values.name | default "defaultValue" }}
{{ .Values.name | trim }}
{{- if .Values.ingress.enabled }}
{{- end }}
{{- range .Values.hosts }}
- host: {{ . }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
インデント
resources:
{{- toYaml .Values.resources | nindent 2 }}
resources: {{ toYaml .Values.resources | indent 2 }}
Chartのテスト
helm create myapp
helm lint ./myapp
helm template my-release ./myapp
helm template my-release ./myapp -f custom-values.yaml
helm install my-release ./myapp --dry-run --debug
helm package ./myapp
helm install my-release ./myapp
Chart依存関係
helm dependency update ./myapp
helm dependency list ./myapp
helm dependency build ./myapp
リリースワークフロー
flowchart TB
A["helm install"] --> B["テンプレートをレンダリング"]
B --> C["リソースを検証"]
C --> D["リリースを作成"]
D --> E["クラスタに適用"]
F["helm upgrade"] --> G["テンプレートをレンダリング"]
G --> H["3方向マージ"]
H --> I["リリースを更新"]
I --> J["変更を適用"]
K["helm rollback"] --> L["以前の状態を取得"]
L --> M["以前の状態を適用"]
style A fill:#22c55e,color:#fff
style F fill:#3b82f6,color:#fff
style K fill:#f59e0b,color:#fff
ベストプラクティス
| プラクティス |
推奨事項 |
| Chartをバージョン管理 |
セマンティックバージョニングを使用 |
| valuesファイルを使用 |
設定をテンプレートから分離 |
| valuesを文書化 |
各値を説明するコメントを追加 |
| デプロイ前にテスト |
--dry-runとhelm lintを使用 |
| Chartバージョンを固定 |
依存関係でバージョンを指定 |
| namespaceを使用 |
リリースをnamespaceで分離 |
Helmコマンドリファレンス
helm repo add <name> <url>
helm repo update
helm repo list
helm repo remove <name>
helm search repo <keyword>
helm show values <chart>
helm show chart <chart>
helm pull <chart>
helm install <release> <chart>
helm upgrade <release> <chart>
helm rollback <release> <revision>
helm uninstall <release>
helm list
helm status <release>
helm history <release>
helm create <name>
helm lint <path>
helm template <release> <path>
helm package <path>
重要なポイント
- Helmはデプロイを簡素化 - 複数のマニフェストを1つのChartにパッケージ
- Valuesでカスタマイズ - テンプレートを変更せずにデフォルトをオーバーライド
- Releaseは状態を追跡 - デプロイのバージョン管理とロールバックが容易
- テンプレートはGo構文 - 複雑なロジックにsprig関数を学ぶ
- Chartは再利用可能 - インフラストラクチャを共有・バージョン管理
参考文献