前回はHelmの使い方について軽くまとめました。
今回はHelmチャートの作り方について、まとめていきたいと思います。
雛形を作成
1から手作りするとなかなか面倒なのでコマンドから雛形を作ります。Helmコマンドには雛形を作るためのhelm create
コマンドが用意されているので、これを利用しましょう。
helm create hello-world
これで以下のような雛形が作られます。
hello-world ├── .helmignore ├── Chart.yaml ├── charts ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── service.yaml │ ├── serviceaccount.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 3 directories, 11 files
- .helmignore
helm チャートに含めたくないファイルを指定するために使用されます。helm package
でパッケージングする時に、このファイルに記載されているファイルは無視されます。
- Chart.yaml
このチャートについての情報が記載されています。チャートやアプリケーションのバージョンが上がった時はこのファイルを編集します。
charts
templates
Kubernetesマニフェストのテンプレートを格納します。
NOTES.txt
や_helpers.tpl
はKubernetesテンプレートではありませんが、インストール後に役立つ情報を表示したり、テンプレート全体で使える変数を記述するファイルです。
- templates/tests
テストファイルを格納します。ここに格納されたファイルはインストールやアップグレード後に自動実行されます。
- values.yaml
アプリケーションのデフォルトの設定です。コマンドラインオプションの--values /path/to/values.yaml
や、--set serverPort=80
で上書きすることができます。
サンプルコンテナを用意しました。こちらのコンテナをデプロイできるようにしていきます。
hello-worldディレクトリ以下にcdします。
cd hello-world
不要なファイルを削除してしましょう。
rm -r {charts,templates/{hpa.yaml,ingress.yaml,tests}}
続いて、values.yamlのimage.repository
を修正します。
image: repository: ghcr.io/virtualtech-devops/helm-hello
image.tag
は空文字のままで大丈夫です。ここはtemplates/deployment.yamlの中で、値が未指定だった場合、Chart.yamlから取得するようになっています。
次にChart.yamlを編集していきます。ここで変更するのはappVersion
です。
appVersion: "v1.1.0"
Helmはデプロイの仕様自体に変更がない場合、新しいアプリはデプロイされません。過去の記事でもこの部分に触れていますので、そちらもご確認ください。
templates/deployment.yamlのspec.template.metadata.annotations
にランダムな文字列が付加されるよう設定しましょう。
kind: Deployment spec: template: metadata: {{- with .Values.podAnnotations }} annotations: {{- toYaml . | nindent 8 }} {{- end }}
こうなっている部分を以下のように修正してください。
kind: Deployment spec: template: metadata: annotations: rollme: {{ randAlphaNum 5 | quote }} {{- with .Values.podAnnotations }} {{- toYaml . | nindent 8 }} {{- end }}
それでは実際にランダムな文字列が付加されているか確認してみましょう。何度か実行してみてください。rollme: ""
の値が変化してるのが確認できると思います。
hello-worldディレクトリ以下にcdしているので、カレントディレクトリを表す.
を指定しています。
helm template .
最後にデプロイしてみます。Kubernetes環境が必要になりますので、Docker DesktopやRancher Desktop、minikubeでKubernetes環境を起動しておいてください。
helm upgrade -i hello-world hello-world
NOTESの内容に従ってアクセスできるか確認してみてください。
NOTES: 1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=hello-world,app.kubernetes.io/instance=hello-world" -o jsonpath="{.items[0].metadata.name}") export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT
まとめ
このように、雛形から自分に必要な部分を変更することで簡単にチャートを自作することが可能です。公式ドキュメントは日本語化され、命名規則やベストプラクティスが説明されてたりするので、ドキュメントを読みながら色々やってみてください。
Helmチャートの雛形にないKubernetesリソースを作る場合も、マニフェストがかければある簡単に自作可能です。参考までに以下のリンクを貼っておきます。