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

完了

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

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

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

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

Helm でのチャートの処理方法

Helm クライアントによって、チャートのフォルダー内の使用可能なすべてのファイルを解析する Go 言語ベースのテンプレート エンジンが実装されます。 そのテンプレート エンジンによって、チャートの templates/ フォルダー内のテンプレートと、Chart.yaml および values.yaml ファイルからの値が組み合わされ、Kubernetes マニフェスト ファイルが作成されます。

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

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

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 アプリなど、チャートに追加の要件を指定できます。

Note

省略可能なすべてのフィールドの詳細については、このモジュールの範囲外です。 しかし、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 repo add コマンドを使用して、リポジトリからチャートをインストールするように Helm クライアントで Helm リポジトリを構成します。

たとえば、次のコマンドを実行して、Azure Marketplace Helm リポジトリをローカル 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 には、チャートからテンプレート エンジンによって作成されるマニフェスト ファイルを生成するためのオプションが用意されています。 この機能を使うと、2 つの追加パラメーター --dry-rundebug を組み合わせて、リリース前にチャートをテストできます。 --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 が含まれています。