Helm チャートを作成してインストールする

完了

Helm チャートを使用すると、任意の Kubernetes クラスターにアプリケーションを簡単にデプロイできます。 Helm を使用して、アプリケーションのデプロイ情報を Helm チャートとしてテンプレートし、それを使用してアプリケーションをデプロイします。

たとえば、開発チームが会社のペット ストア Web サイトを AKS クラスターに既にデプロイしているとします。 チームは、Web サイトをデプロイするために次の 3 つのファイルを作成します。

  • クラスターにアプリケーションをインストールして実行する方法を説明する 配置マニフェスト
  • クラスターで Web サイトを公開する方法を説明するサービス マニフェスト
  • クラスターの外部からのトラフィックが Web アプリにどのようにルーティングされるかを説明する イングレス マニフェスト

チームは、ソフトウェア開発ライフサイクルの一環として、これらのファイルを 3 つの各環境にデプロイします。 3 つのファイルはそれぞれ、環境に固有の変数と値で更新されます。 各ファイルはハードコーディングされているため、これらのファイルのメンテナンスはエラーが発生しやすくなります。

Helm はグラフをどのように処理しますか?

Helm クライアントは、グラフのフォルダー内の使用可能なすべてのファイルを解析する Go 言語ベースのテンプレート エンジンを実装します。 テンプレート エンジンは、グラフの templates/ フォルダー内のテンプレートと、 Chart.yaml ファイルと values.yaml ファイルの値を組み合わせて Kubernetes マニフェスト ファイルを作成します。

図は、Helm テンプレート ファイルと値ファイルを解析して、マニフェスト ファイルを使用してアプリケーションを作成して Kubernetes クラスターにデプロイするプロセスを示しています。

マニフェスト ファイルが使用可能になると、クライアントは、生成されたマニフェスト ファイルで定義されているアプリケーションをインストール、アップグレード、および削除できます。

Chart.yaml ファイルを定義する方法

Chart.yamlは、Helm チャート定義で必要なファイルの 1 つであり、グラフに関する情報を提供します。 ファイルの内容は、3 つの必須フィールドとさまざまな省略可能なフィールドで構成されます。

次の 3 つの必須フィールドがあります。

  • apiVersion: 使用するグラフ API のバージョン。 Helm 3 を使用するグラフのバージョンを v2 に設定します。
  • name: グラフの名前。
  • version: セマンティック バージョン 2.0.0 を使用し、 MAJOR.MINOR.PATCH バージョン番号表記に従うグラフのバージョン番号。

次の例は、基本的な Chart.yaml ファイルの内容を示しています。

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0

サンプル ファイルで type フィールドを使用していることに注意してください。 グラフを作成して、アプリケーションまたはライブラリをインストールできます。 既定のグラフの種類は application であり、 library に設定して、ライブラリをインストールするグラフを指定できます。

グラフの展開プロセスを調整するために、多くの省略可能なフィールドを使用できます。 たとえば、 dependencies フィールドを使用して、データベースに依存する Web アプリなどのグラフの追加要件を指定できます。

すべての省略可能なフィールドの詳細については、このモジュールの範囲外です。 ただし、Helm ドキュメントへのリンクについては、モジュールの概要セクションを参照してください。

グラフ テンプレートを定義する方法

Helm チャート テンプレートは、さまざまな配置の種類のマニフェスト ファイルを記述するファイルです。 グラフ テンプレートは Go テンプレート言語で記述され、Kubernetes オブジェクト マニフェスト ファイルの作成を自動化するためのテンプレート関数を提供します。

テンプレート ファイルは、グラフの templates/ フォルダーに格納されます。 テンプレート エンジンは、これらのファイルを処理して最終的なオブジェクト マニフェストを作成します。

たとえば、開発チームが次の配置マニフェスト ファイルを使用して、ソリューションのペット ストア フロント コンポーネントをデプロイするとします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: store-front
  template:
    metadata:
      labels:
        app: store-front
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
        - containerPort: 8080
          name: store-front
        env: 
        - name: VUE_APP_ORDER_SERVICE_URL
          value: "http://order-service:3000/"
        - name: VUE_APP_PRODUCT_SERVICE_URL
          value: "http://product-service:3002/"
        resources:
          requests:
            cpu: 1m
            memory: 200Mi
          limits:
            cpu: 1000m
            memory: 512Mi
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 5
          initialDelaySeconds: 3
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: store-front

{{.Values.<property>}}構文を使用してコンテナー イメージの場所がどのようにハードコーディングされているかに注目してください。 この構文を使用すると、カスタム値ごとにプレースホルダーを作成できます。

Helm チャートを手動で作成するプロセスは面倒です。 Helm チャートを簡単に作成するには、 helm create コマンドを使用して新しい Helm チャートを作成します。 次に、自動生成されたファイルをアプリケーションの要件に合わせてカスタマイズします。

values.yaml ファイルを定義する方法

チャート値を使用して、Helm チャートの構成をカスタマイズします。 グラフの値は、グラフの展開時に定義済みまたはユーザーが指定できます。

定義済みの値は、Helm チャートのコンテキストで定義済みであり、ユーザーが変更できない、大文字と小文字を区別する値です。 たとえば、 Release.Name を使用してリリースの名前を参照したり、 Release.IsInstall を使用して現在の操作がインストールされているかどうかを確認できます。

定義済みの値を使用して、 Chart.yamlの内容からデータを抽出することもできます。 たとえば、グラフのバージョンを確認する場合は、 Chart.Version参照します。 既知のフィールドのみを参照できることに注意してください。 定義済みの値は、作成するテンプレートで使用する定数と考えることができます。

テンプレート ファイルに値名を含める構文では、値名を二重中かっこで囲みます (たとえば、 {{.Release.Name}})。 値名の前にピリオドが使用されていることに注意してください。 この方法でピリオドを使用すると、ピリオドはルックアップ演算子として機能し、変数の現在のスコープを示します。

たとえば、次の YAML スニペットには、値ファイルで定義されたディクショナリが含まれています。

object:
  key: value

テンプレート内の値にアクセスするには、次の構文を使用できます。

{{ .Values.object.key }}

指定された値を使用すると、グラフ テンプレート内の任意の値を処理できます。 values.yaml ファイルはこれらの値を定義します。

この例では、開発チームは次の構成可能な値を使用できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  ...
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
  ...
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ...

values.yaml ファイルの例を次に示します。

...
replicaCount: 1
...
storeFront:
  image:
    repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
    tag: "latest"
  serviceType: LoadBalancer
...

テンプレート エンジンが値を適用すると、最終的な結果は次の例のようになります。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: 1
  ...
      containers:
      - name: store-front
        image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
        ports:
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: LoadBalancer
  ...

Helm リポジトリを使用する方法

Helm リポジトリは、Helm チャートに情報を格納する専用の HTTP サーバーです。 helm クライアントを使用して Helm リポジトリを構成し、 helm repo add コマンドを使用してリポジトリからグラフをインストールします。

たとえば、次のコマンドを実行して、ローカル Helm クライアントに Azure Marketplace Helm リポジトリを追加できます。

helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo

リポジトリで使用可能なグラフに関する情報は、クライアント ホストにキャッシュされます。 helm repo update コマンドを使用してリポジトリの最新情報を取得するには、キャッシュを定期的に更新する必要があります。

helm search repo コマンドを使用すると、ローカルに追加されたすべての Helm リポジトリでグラフを検索できます。 helm search repo コマンドを単独で実行して、追加された各リポジトリの既知のすべての Helm チャートの一覧を返すことができます。 結果には、次の出力例に示すように、グラフによってデプロイされたグラフの名前、バージョン、アプリのバージョンが一覧表示されます。

NAME                               CHART VERSION   APP VERSION   DESCRIPTION
azure-marketplace/airflow          11.0.8          2.1.4         Apache Airflow is a platform to programmaticall...
azure-marketplace/apache           8.8.3           2.4.50        Chart for Apache HTTP Server
azure-marketplace/aspnet-core      1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common   0.0.7           0.0.7         Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra        8.0.5           4.0.1         Apache Cassandra is a free and open-source dist...

helm search repo コマンドに検索語句を追加することで、特定のグラフを検索できます。 たとえば、ASP.NET ベースのグラフを検索する場合は、次のコマンドを使用できます。

helm search repo aspnet

この例では、次の出力例に示すように、ローカル クライアントには 2 つのリポジトリが登録され、それぞれから結果が返されます。

NAME                            CHART VERSION   APP VERSION   DESCRIPTION                                       
azure-marketplace/aspnet-core   1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
bitnami/aspnet-core             1.3.18          3.1.19        ASP.NET Core is an open-source framework create...

Helm チャートをテストする方法

Helm には、テンプレート エンジンがグラフから作成するマニフェスト ファイルを生成するためのオプションが用意されています。 この機能を使用すると、 --dry-rundebugの 2 つの追加パラメーターを組み合わせることで、リリース前にグラフをテストできます。 --dry-run パラメーターを使用すると、インストールがシミュレートされ、--debug パラメーターによって詳細出力が有効になります。

helm install --debug --dry-run my-release ./chart-name

このコマンドは、使用された値と生成されたすべてのファイルに関する情報を一覧表示します。 生成されたすべての出力を表示するには、スクロールが必要になる場合があります。

Helm チャートをインストールする方法

helm install コマンドを使用してグラフをインストールします。 Helm チャートは、次のいずれかの場所からインストールできます。

  • チャートフォルダー
  • パッケージ化された .tgz tar アーカイブ グラフ
  • Helm リポジトリ

ただし、必要なパラメーターはグラフの場所によって異なります。 いずれの場合も、 install コマンドには、インストールするグラフの名前と、インストールによって作成されるリリースの名前が必要です。

アンパックされたファイルのグラフ フォルダーまたはパックされた .tgz tar アーカイブを使用して、ローカル グラフをインストールできます。 グラフをインストールするには、 helm コマンドは、グラフの場所のローカル ファイル システムを参照します。 アンパックされたグラフのリリースを展開するインストール コマンドの例を次に示します。

helm install my-release ./chart-name

前の例では、 my-release パラメーターはリリースの名前で、 ./chart-name パラメーターはアンパックされたグラフ パッケージの名前です。

パックされたグラフは、パックされたグラフのファイル名を参照してインストールされます。 次の例は、tar アーカイブとしてパックされた同じアプリケーションの構文を示しています。

helm install my-release ./chart-name.tgz

Helm リポジトリからグラフをインストールする場合は、グラフの名前としてグラフ参照を使用します。 グラフ参照には、次の例に示すように、リポジトリ名とグラフの名前の 2 つのパラメーターが含まれています。

helm install my-release repository-name/chart-name

この例では、 repository-name/chart-name パラメーターには、リポジトリの参照、 repository-name、およびグラフの名前 ( chart-name) が含まれています。