Helmでチャートを設計するためのクイックガイド

Frank Eiffert



HelmによるUnsplashは、Kubernetesでアプリケーションを適用、更新、および管理するための強力なツールです。Helmコミュニティは、多くのオープンソースチャートを作成しています。1つのコマンドで、Redis、Nginx、またはPrometheusOperatorをデプロイできます。また、Ingressなど、必要なものがすべて付属しています。Mail.ru Cloud Solutions



チームは、基本的なチャートを作成する簡単な方法を説明し、便利なコマンドを示し、ベストプラクティスを共有する記事を翻訳しました。それらのほとんどはHelmのドキュメントでカバーされているため、彼はGoテンプレート言語の側面については詳しく説明していません。このチュートリアルでは、ワークフローを改善するためのより抽象的な側面とアイデアを提供します。



基本的なチャート構造の作成



チャート構造の例を作成する簡単なコマンドから始めます。



$ helm create basic
Creating basic
$ tree basic
basic/
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt
│   ├── serviceaccount.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml


展開可能なチャートを作成するために必要なのはこれだけです。このチャートを使用すると、必要なすべてのコンポーネントを使用してアプリケーションを展開できます。values.yamlを見ると、このアプリケーションがNginxをデプロイすることがわかります。



チャートの展開は、作成するのと同じくらい簡単です。



$ helm install basic


テンプレートチームはあなたの親友です



インストールの直前とチャートの変更後、テンプレートですべてが正しく処理されているかどうかを確認する必要があります。



クラスターに正確にデプロイされるものを確認するには、次のコマンドを使用します。



$ helm template basic


このコマンドは、すべてのテンプレートによって生成されたすべてのYAMLを出力します。1つのテンプレートの結果のみを表示する場合は、次を使用します。



$ helm template basic -x templates/service.yaml


結果は次のようになります。



---
# Source: basic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-basic
  labels:
    app.kubernetes.io/name: basic
    helm.sh/chart: basic-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: basic
    app.kubernetes.io/instance: release-name


カスタム値を使用してテンプレートをテストするには、次を使用します:



$ helm template basic -x templates/service.yaml -f \ mypath/tocustomvalues.yaml


生成されたテンプレートは、次のコマンドを使用してクラスターでテストできます。



$ helm install basic --dry-run --debug


LINT!



リポジトリに送信する前に、コードを明確にチェックするためのもう1つのステップを追加できます-linting(統計分析):



$ helm lint basic/
==> Linting basic/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures


ヘルムは機能で動作します



チャートテンプレートのディレクトリを調べると、_helpers.tplが表示されます。ここで関数を追加できます。それらはチャート全体で使用できます。関数の例は次のようになります。



{{/*
Expand the name of the chart.
*/}}
{{- define "basic.name" -}} 
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} 
{{- end -}}


テンプレートでの関数の使用は、関数を使用して示されますinclude



app.kubernetes.io/name: {{ include "basic.name" . }}


メタラベル



Kubernetesの重要な部分は、ラベルの正しい使用です。Helmを使用して複数のマニフェストを展開する場合、これは非常に重要です。タグを簡単に追加してHelmが管理するリソースを見つけるには、独自の関数を使用できます。



{{/*
Common labels
*/}}
{{- define "basic.labels" -}} 
app.kubernetes.io/name: {{ include "basic.name" . }}
helm.sh/chart: {{ include "basic.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}


そして今、チャートにいくつかのタグを追加するのは簡単です:



apiVersion: v1
kind: Service
metadata:
  name: {{ include "basic.fullname" . }}
  labels:
{{ include "basic.labels" . | indent 4 }}
...


このチャートを使用して作成されたサービスを検索する場合は、次のコマンドを使用します。



$ kubectl get svc -l helm.sh/chart=basic-0.1.0


コメントはあなたを救うでしょう



コメントには2つのタイプがあります。



  • #処理後に結果のYMLに残る単純なコメントです。
  • {{-/ * ... * /-}}は、テンプレートエンジンによって破棄されるコメントです。




# app files volume
        {{- /*
          App files are configmaps created by cloud-app-play-files chart.
          App files contains files specific for app and environment.
          App name should be same as in deployment of cloud-app-play-files chart.
        */ -}} 
        {{- if .Values.include.appDir }}
        - name: {{ $appName }}-files
          configMap:
            name: {{ $appName }}-files


テンプレートの出力は次のようになります。



       # app files volume
       - name: app-notification-files
         configMap:
           name: app-notification-files


ご覧のとおり、生成されたマニフェストには単純なタイプのコメントのみが含まれています。どのタイプを使用するかはあなた次第です。ただし、テンプレートコメントは、YAMLでより複雑なパイプラインまたは依存関係を定義する場合に役立ちます。



#で始まるコメントも解析されることを覚えておくことも重要です。コメントにGoテンプレートを入れると、評価されます。したがって、コメントもテンプレートにすることができます。



必ず文書を保管してください



特にチャートを公開したい場合は、チャートの文書化が不可欠です。ドキュメントを作成および保守する最も簡単な方法は、helm-docsという名前のGolangパッケージを使用することですこれを使用すると、values.yamlおよびchart.yamlから値、バージョン、および説明のテーブルを含むREADME.mdを生成したり、他のカスタムファイルを使用したりできます。





例はhttps://github.com/norwoodj/helm-docsから抜粋したもの



です。ご覧のとおり、コメントに-を付けて名前を追加すると、テーブルの1行になります。さらに、この表には、チャートの説明、名前、バージョンなどの追加情報が含まれています。Helm-docsは、リンティングとともに事前コミットに統合できます。これを行うのは簡単です:



$ helm-docs
INFO[2020-07-23T15:30:38+02:00] Found Chart directories [.]                 
INFO[2020-07-23T15:30:38+02:00] Generating README Documentation for chart .


サブチャートの魔法



チャートがアーキテクチャを作成するモンスターになったら、チャートコンポーネントの一部を小さなコンポーネントに分割するのが最善です。これらはサブチャートまたは子チャートと呼ばれます。



サブチャートは、メインチャートと同時に展開されます。サブチャートの値は、メインチャートと同じvalues.yamlファイルで指定できます。GitHubから接続することもできますが、この記事ではローカルでサブチャートを作成します。



メインチャートが依存する新しいサブチャートの使用を開始するには、メインチャートフォルダー内にchartsディレクトリを作成します。次に、基本的なチャートを作成します。



$ mkdir charts
$ cd charts
$ helm create subbasic


サブチャートを接続するには、メインチャートの定義を変更します。



apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: basic
version: 0.1.0
dependencies:
  - name: subbasic       


これで、コマンドが起動されるたびにhelm install、メインチャートだけでなく、サブチャートも展開されます。サービスにデプロイするときにサブチャート参照名をオーバーライドするには、メインチャートのvalues.yamlに次のコマンドを追加します。



subbasic:
 service:
   type: NodePort
 nameOverride: "jojo"


ここでコマンドtemplate実行し、サブチャートサービスの変更された出力を確認します。サービスタイプは名前とともに変更されます。



---
# Source: basic/charts/subbasic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-jojo
  labels:
    app.kubernetes.io/name: jojo
    helm.sh/chart: subbasic-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: jojo
    app.kubernetes.io/instance: release-name


重要な注意:サブチャートは、親チャートからの値を受け入れることはできません。



忘れられがちな瞬間



さらにいくつかのポイント:



  1. リソース名-最大63文字。
  2. リソース名は、数字、小文字、「-」または「。」のみにすることができます。
  3. チャートサイズ-1MB以下これは、添付ファイルを使用している場合に特に重要です。
  4. チャートには解析機能があります.tpl
  5. コマンドがチャートの展開を削除した後に残るリソースを指定できますhelm delete


さて、それだけです!



これで、最初のチャートを作成できます。ファイルの添付は言及する価値があります-チャートはファイルを追加してその構造をディレクトリに保存するのには適していません。しかし、推奨ページには、何をグラフ化するか、何をチャート化しないかについての情報はありません。



ヘルムはかなり若いツールですが、多くの可能性を秘めています。リンティング、ドキュメントの生成、さらにはクラスター上のドライランテンプレートもCIの一部になる可能性があることを忘れないでください。HelmWorkflowはGitHubですでに利用可能です



幸運を!



他に読むべきこと:



  1. ヘルムデバイスとその落とし穴
  2. ヘルムでの秘密の自動生成
  3. TelegramのKubernetes周辺のチャンネル



All Articles