とことんDevOps | 日本仮想化技術が提供するDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けするとことんDevOpsでは、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果など、DevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、アジャイル開発、コンテナ開発など
各種SNSのフォローもよろしくお願いいたします。

Helmチャートを作る

前回は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で上書きすることができます。

サンプルコンテナを用意しました。こちらのコンテナをデプロイできるようにしていきます。

github.com

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はデプロイの仕様自体に変更がない場合、新しいアプリはデプロイされません。過去の記事でもこの部分に触れていますので、そちらもご確認ください。

devops-blog.virtualtech.jp

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.sh

Helmチャートの雛形にないKubernetesリソースを作る場合も、マニフェストがかければある簡単に自作可能です。参考までに以下のリンクを貼っておきます。

devops-blog.virtualtech.jp