[初学者向け]Helmを学ぼう!~Templateを深く深く知ろう1~

こんにちは。KOUKIです。

とある企業でWebエンジニアをやっています。

前回は、Helmで自分のChartを初めて作成しました

今回は、HelmのTemplateについて深く学びましょう。

検証環境

  • helm v3
  • mac
  • minikube

Kubernetesに関しては、こちらも参考にしてください。

ワークスペースの作成

以下のコマンドで、ワークスペースを作成します。

テンプレート基礎

このplayground/templatesの中にNOTES.txtがあるのですが、以下の通り書き換えてみましょう。

公式サイトによるとChartは、Chart.yamlを指すようです。※他にも沢山あるのでチェックした方がいいです

Chart: The contents of the Chart.yaml file. Any data in Chart.yaml will be accessible here. For example {{ .Chart.Name }}-{{ .Chart.Version }} will print out the mychart-0.1.0.

https://helm.sh/docs/chart_template_guide/builtin_objects/#helm

ちなみに、Chart.yamlの中身は以下です。

この値を参照できる様ですね。

「–dry-run」オプションを付けてデバックしてみましょう。

NOTES.txtに書かれた文字列が出力されていることがわかります。

Releaseオブジェクト

公式サイトによるとReleaseオブジェクトというものが組み込まれているようなので、確認してみましょう。

  • Release: This object describes the release itself. It has several objects inside of it:
    • Release.Name: The release name
    • Release.Namespace: The namespace to be released into (if the manifest doesn’t override)
    • Release.IsUpgrade: This is set to true if the current operation is an upgrade or rollback.
    • Release.IsInstall: This is set to true if the current operation is an install.
    • Release.Revision: The revision number for this release. On install, this is 1, and it is incremented with each upgrade and rollback.
    • Release.Service: The service that is rendering the present template. On Helm, this is always Helm.

NOTES.txtに以下の文言を追加します。

Template関数

HelmはGo言語で実装されています。つまり、TemplateもまたGoに準拠するということです。

Golang Template

Sprig Functiion Documentationに、Template関数がまとめられています。

toYamlとnindent

自動生成されたファイルの一つに「deployment.yaml」ファイルがあります。

このファイルの以下の箇所に注目しましょう。

toYamlはオブジェクトをYaml形式で展開してくれます。

nindentは、インデントを示しています。上記の例の場合は、12のインデントですね。

「.Values」とある通り「values.yaml」ファイルを参照しているので、values.yamlのresourcesに以下の設定を行います。

NOTES.txtも以下のように書き換えます。

デバッキングしてみましょう。

resourcesが2つ出力されていると思いますが、片方はYAML形式、もう片方はTEXT形式で出力されています。

この違いが、toYamlのnindentです。

NOTES.txtを以下に書き換えます。

結構いい感じになりましたが、resourcesとlimitsの間が空いてるのが気になります。

nindentをindentに変更しましょう。

いい感じですね! nindentのnは、改行(newline)のnっぽいですね。

ちなみにdeployment.yamlの方では、「-」がついていたと思います。これは、インデントをちょうど良い感じに調整してくれる機能があるようなので試してみましょう。

少し変になりましたね。。 nindentに戻して(ついでにインデント数を2にする)、もう一度実行してみましょう。

綺麗な感じになりましたね。

補足ですが、以前勉強した「–set」オプションで値の上書きも可能です。

ConfigMapsとSecrets

Kubernetesでもよく使うConfigmapとSecretsの扱い方を見ていきましょう。

まずは、ConfigMapsから。

default.jsonは別ファイルに保存したいですね。

Helmでは他のファイルをimportするときFilesオブジェクトを使います。

こういうの結構便利ですよね。環境変数を別ファイルに保存したいとかよくありますから。

次は、Secretsです。

deployment.yamlにvolumeMountsしましょう。

Chart.yamlも変更します。

values.yamlのimageも変更します。

下記のコマンドを実行しましょう。

問題なさそうですね。

では、実際にデプロイしてみましょう。

InvalidImageNameになってしまいました!

すみません。values.yamlのimageにバージョンの指定はいらなかったです。以下に直して下さい。

deployementをみるとChartのバージョンから取得するようになってますね。

修正したらupgradeです。

悲しいことに下記の通りInvalid Requestになってしまいました(原因は不明です)が、起動はできたのでひとまずよしとしましょう。

Configフォルダの作成

Configフォルダを作成し、そこにdefault.jsonファイルを移動させましょう。

そして、さらにJSONファイルを作成します。

Configフォルダをconfigmap.yamlから読み込みます。

Globにすると複数ファイルを指定できるようです。config配下の全て(*)を指定しました。

デバッキングしましょう。

エラーが出ました。実は今の実装のままだとFileオブジェクトが返却されるため、コマンドが実行できないのです。

configmap.yamlの設定を以下の通りに書き換えます。

上記の様にAsConfigを追加しました。ちなみに、AsSecretsもあります。

もう一度、コマンドを実行します。

今度は、OKですね。

secret.yamlも書き換えてみましょう。

AsSecretsを使ってます。ニュアンス的に、セキュアにしてくれる感がビンビンですよね。

OKですね。ちゃんとエンコードされてます。

次回

次回も引き続き、Helmのテンプレートについて学んでいきましょう!

Helmまとめ

コメントを残す