既存のマニフェストから最初の Helm チャートを作成する
Deployment、Service、ConfigMap をテンプレート化したチャートに変換し、インストールしてアップグレードします。
Helm のテンプレートを学ぶ最も早い方法は、すでに理解しているマニフェストを、フィールドを 1 つずつテンプレート化していくことです。このガイドでは、プレーンな Deployment、Service、ConfigMap から出発し、チャートの足場を作って、変化すべきフィールドを values で置き換えます。
チャートの足場を作り、サンプルを片付ける
helm create webapp
cd webapp
rm -rf templates/tests templates/hpa.yaml templates/ingress.yaml \
templates/serviceaccount.yaml templates/_helpers.tpl
生成された templates/deployment.yaml と templates/service.yaml は動作するサンプルですが、学習のためには、自分で最初から書くほうが分かりやすいです。その内容を削除して(ファイルは残します)、values.yaml を空にします。
: > values.yaml
独自のマニフェストを追加する
まず、Helm なしで書くのとまったく同じように、プレーンな Kubernetes YAML を書きます。
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-webapp
labels:
app: my-webapp
spec:
replicas: 3
selector:
matchLabels:
app: my-webapp
template:
metadata:
labels:
app: my-webapp
spec:
containers:
- name: my-webapp
image: myorg/webapp:1.0
envFrom:
- configMapRef:
name: my-webapp-config
ports:
- containerPort: 8080
# templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-webapp
spec:
selector:
app: my-webapp
ports:
- port: 80
targetPort: 8080
# templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-webapp-config
data:
CUSTOM_HEADER: "this app was deployed with Helm"
同じ文字列 my-webapp が、名前、ラベル、セレクター、ConfigMap の参照にわたって繰り返されていることに注目してください。この繰り返しこそが、手作業で保守するマルチ環境のマニフェストがミスを起こしやすい原因です。アプリケーションの名前を一度変更しようとすると、確認すべき箇所が 4 つあります。
繰り返される値をテンプレートの値に置き換える
1 つの値を導入し、名前が現れるすべての場所でそれを参照します。
# values.yaml
appName: my-webapp
# templates/deployment.yaml (抜粋)
metadata:
name: {{ .Values.appName }}
labels:
app: {{ .Values.appName }}
spec:
selector:
matchLabels:
app: {{ .Values.appName }}
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
containers:
- name: {{ .Values.appName }}
envFrom:
- configMapRef:
name: {{ .Values.appName }}-config
service.yaml と configmap.yaml でも、my-webapp が現れる場所すべてで同じことを行います。.Values は values.yaml から設定されるため、そこでの 1 回の変更で、すべてのリソースが一貫して名前変更されます。
イメージと ConfigMap のデータをテンプレート化する
タグをリポジトリとは独立して変更できるように、イメージを別々の値に分割します。
# values.yaml (追加)
image:
repository: myorg/webapp
tag: "1.0"
- name: {{ .Values.appName }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
そして ConfigMap の内容です。
# values.yaml (追加)
config:
customHeader: "this app was deployed with Helm"
# templates/configmap.yaml
data:
CUSTOM_HEADER: {{ .Values.config.customHeader | quote }}
| quote フィルターは値を二重引用符で囲みます。これは、環境固有の値がスペースや特殊文字を含み始めたときに重要になります。values の名前付けの良い指針は、マニフェスト自体の構造をなぞることです(config.customHeader は ConfigMap の data.CUSTOM_HEADER に対応します)。そうすれば、テンプレートを読む人が、値がどこから来るのかを推測できます。
インストール前にプレビューする
2 つのコマンドが、クラスターに触れずにチャートをレンダリングします。
helm template ./webapp
helm install my-webapp ./webapp --dry-run --debug
helm template はローカルでレンダリングし、クラスターをまったく必要としません。install の --dry-run --debug は、さらに何も永続化せずにクラスターの API に対して検証します。テンプレートを変更するたびに、どちらかを実行してください。{{ .Values.appname }} のようなタイプミス(大文字小文字の誤り)は、エラーにならず、黙って空としてレンダリングされるため、これが最も早く見つける方法です。
インストールして確認する
helm install my-webapp ./webapp
kubectl get all -l app=my-webapp
ここでの my-webapp はリリース名で、./webapp はチャートのディレクトリです。手書きのチャートのインストールは、公開されているチャートのインストールと何も変わりません。
値を変更してアップグレードする
values.yaml を編集して(image.tag を上げる、config.customHeader を変更するなど、試したいこと)、変更を適用します。
helm upgrade my-webapp ./webapp
helm list
helm list は、リビジョン 2 を表示するようになります。upgrade のたびに、現在の values でチャート全体が再適用されるため、これは日々新しいバージョンをデプロイする方法でもあります。
NOTES.txt を追加する
# templates/NOTES.txt
Your release "{{ .Release.Name }}" has been deployed.
To access {{ .Values.appName }}, run:
kubectl port-forward svc/{{ .Values.appName }} 8080:80
.Release.Name は、.Chart や .Release.Namespace と並んで、Helm が常に提供する組み込みの値です。自分で設定するものではありません。もう一度 helm upgrade my-webapp ./webapp を実行すると、このテキストがターミナルに表示され、port-forward コマンドが、見ている人のためにすでに入力された状態になっています。