はじめに

このガイドのセクションでは、チャートを作成し、最初のテンプレートを追加します。ここで作成したチャートは、ガイドの残りの部分で使用されます。

始めましょう。Helmチャートを簡単に見てみましょう。

チャート

チャートガイドで説明されているように、Helmチャートは次のように構成されています。

mychart/
  Chart.yaml
  values.yaml
  charts/
  templates/
  ...

templates/ディレクトリにはテンプレートファイルがあります。Helmがチャートを評価すると、templates/ディレクトリ内のすべてのファイルがテンプレートレンダリングエンジンに送信されます。次に、これらのテンプレートの結果を収集し、Kubernetesに送信します。

values.yamlファイルもテンプレートにとって重要です。このファイルには、チャートのデフォルト値が含まれています。これらの値は、helm installまたはhelm upgrade時にユーザーによって上書きされる場合があります。

Chart.yamlファイルには、チャートの説明が含まれています。テンプレート内からアクセスできます。

charts/ディレクトリには、他のチャート(サブチャートと呼びます)が含まれている場合があります。このガイドの後半では、テンプレートレンダリングにおけるそれらの動作について説明します。

スターターチャート

このガイドでは、mychartという単純なチャートを作成し、チャート内にいくつかのテンプレートを作成します。

$ helm create mychart
Creating mychart

mychart/templates/の簡単な概要

mychart/templates/ディレクトリを見ると、既にいくつかのファイルがあることに気付くでしょう。

  • NOTES.txt:チャートの「ヘルプテキスト」。helm installの実行時にユーザーに表示されます。
  • deployment.yaml:Kubernetes デプロイメントを作成するための基本的なマニフェスト
  • service.yaml:デプロイメントのサービスエンドポイントを作成するための基本的なマニフェスト
  • _helpers.tpl:チャート全体で再利用できるテンプレートヘルパーを配置する場所

そして、私たちが行うことは…すべて削除することです!そうすれば、最初からチュートリアルを進めることができます。実際には、後で独自のNOTES.txt_helpers.tplを作成します。

$ rm -rf mychart/templates/*

本番環境のチャートを作成する場合は、これらのチャートの基本バージョンがあると非常に役立ちます。そのため、日々のチャート作成では、削除したくないでしょう。

最初のテンプレート

最初に作成するテンプレートはConfigMapです。Kubernetesでは、ConfigMapは構成データを保存するためのオブジェクトです。ポッドなどの他のものは、ConfigMapのデータにアクセスできます。

ConfigMapは基本的なリソースであるため、優れた出発点となります。

mychart/templates/configmap.yamlというファイルを作成することから始めましょう。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

ヒント:テンプレート名は厳格な命名パターンに従いません。ただし、YAMLファイルには.yaml、ヘルパーには.tplの拡張子を使用することをお勧めします。

上記のYAMLファイルは、最小限の必要なフィールドを持つ、基本的なConfigMapです。このファイルがmychart/templates/ディレクトリにあるという事実により、テンプレートエンジンに送信されます。

このようなプレーンなYAMLファイルをmychart/templates/ディレクトリに配置しても問題ありません。Helmがこのテンプレートを読み取ると、そのままKubernetesに送信されます。

この単純なテンプレートを使用すると、インストール可能なチャートができました。そして、このようにインストールできます。

$ helm install full-coral ./mychart
NAME: full-coral
LAST DEPLOYED: Tue Nov  1 17:36:01 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None

Helmを使用して、リリースを取得し、ロードされた実際のテンプレートを確認できます。

$ helm get manifest full-coral

---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mychart-configmap
data:
  myvalue: "Hello World"

helm get manifestコマンドは、リリース名(full-coral)を受け取り、サーバーにアップロードされたすべてのKubernetesリソースを出力します。各ファイルは、YAMLドキュメントの開始を示す---で始まり、その後、このYAMLドキュメントを生成したテンプレートファイルを知らせる自動生成されたコメント行が続きます。

そこから、YAMLデータがconfigmap.yamlファイルに入力したものとまったく同じであることがわかります。

これで、リリースをアンインストールできます:helm uninstall full-coral

単純なテンプレート呼び出しの追加

リソースにname:をハードコーディングすることは、通常、悪い習慣と見なされます。名前はリリースに固有である必要があります。そのため、リリース名を使用して名前フィールドを生成したい場合があります。

ヒント:DNSシステムの制限により、name:フィールドは63文字に制限されています。そのため、リリース名は53文字に制限されています。Kubernetes 1.3以前は24文字(したがって14文字の名前)に制限されていました。

configmap.yamlをそれに応じて変更しましょう。

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"

大きな変更は、name:フィールドの値で、現在は{{ .Release.Name }}-configmapになっています。

テンプレートディレクティブは、{{}}ブロックで囲まれています。

テンプレートディレクティブ{{ .Release.Name }}は、リリース名をテンプレートに挿入します。テンプレートに渡される値は、名前空間オブジェクトと考えることができます。ドット(.)は、各名前空間要素を区切ります。

Releaseの前にあるドットは、このスコープの最上位の名前空間から始まることを示しています(スコープについては後で説明します)。そのため、.Release.Nameを「最上位の名前空間から始め、Releaseオブジェクトを見つけ、その中からNameというオブジェクトを探します」と解釈できます。

ReleaseオブジェクトはHelmの組み込みオブジェクトの1つであり、後で詳しく説明します。しかし今のところ、これはライブラリが私たちのリリースに割り当てるリリース名を表示すると言うだけで十分です。

これで、リソースをインストールすると、このテンプレートディレクティブの使用結果がすぐに表示されます。

$ helm install clunky-serval ./mychart
NAME: clunky-serval
LAST DEPLOYED: Tue Nov  1 17:45:37 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None

helm get manifest clunky-servalを実行して、生成されたYAML全体を確認できます。

Kubernetes内のConfigMapの名前が、以前のmychart-configmapではなくclunky-serval-configmapであることに注意してください。

現時点では、テンプレートを最も基本的な形で見てきました。つまり、{{}}に埋め込まれたテンプレートディレクティブを持つYAMLファイルです。次の部分では、テンプレートを詳しく見ていきます。しかし、先に進む前に、テンプレートの作成を高速化できる簡単なトリックが1つあります。テンプレートのレンダリングをテストしたいが、実際には何もインストールしたくない場合は、helm install --debug --dry-run goodly-guppy ./mychartを使用できます。これにより、テンプレートがレンダリングされます。しかし、チャートをインストールする代わりに、レンダリングされたテンプレートが返され、出力を確認できます。

$ helm install --debug --dry-run goodly-guppy ./mychart
install.go:149: [debug] Original chart version: ""
install.go:166: [debug] CHART PATH: /Users/ninja/mychart

NAME: goodly-guppy
LAST DEPLOYED: Thu Dec 26 17:24:13 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}

COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: nginx
imagePullSecrets: []
ingress:
  annotations: {}
  enabled: false
  hosts:
  - host: chart-example.local
    paths: []
  tls: []
nameOverride: ""
nodeSelector: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
  port: 80
  type: ClusterIP
serviceAccount:
  create: true
  name: null
tolerations: []

HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: goodly-guppy-configmap
data:
  myvalue: "Hello World"

--dry-runを使用すると、コードを簡単にテストできますが、Kubernetes自体が生成するテンプレートを受け入れるとは限りません。--dry-runが機能するからといって、チャートがインストールされると仮定しないでください。

チャートテンプレートガイドでは、ここで定義した基本的なチャートを使用して、Helmテンプレート言語を詳しく調べます。そして、組み込みオブジェクトから始めましょう。