HelmとKubernetesの使用

1. 概要

  • https://helm.sh/ [Helm]はKubernetesアプリケーションのパッケージマネージャーです*。 このチュートリアルでは、Helmの基本と、それらがKubernetesリソースを操作するための強力なツールを形成する方法を理解します。

    過去数年にわたって、Kubernetesは飛躍的に成長し、それをサポートするエコシステムも成長しました。 最近、Helmはhttps://www.cncf.io/[Cloud Native Computing Foundation(CNCF)]によってインキュベーションプロジェクトとして発表され、Kubernetesユーザーの間で人気が高まっていることを示しています。

2. バックグラウンド

これらの用語は最近、特にクラウドテクノロジーを使用している人々の間ではかなり一般的ですが、気付いていない人のためにそれらをすぐに見ていきましょう。
  1. Container:* Container
    オペレーティングシステムレベルの仮想化*を指します。 隔離されたユーザー空間のオペレーティングシステム内で複数のコンテナーが実行されます。 コンテナ内で実行されているプログラムは、コンテナに割り当てられたリソースにのみアクセスできます。

  2. Docker:* Dockerは、
    コンテナを作成して実行します*。 コンテナーを管理するメインプログラムであるDocker Daemonが付属しています。 Docker Daemonは、Docker Command-Line Interface(CLI)で使用されるDocker Engine APIを介してその機能へのアクセスを提供します。 Dockerの詳細については、この記事を参照してください

  3. Kubernetes:* Kubernetesは一般的なコンテナです
    オーケストレーションプログラム*。 異なるコンテナで動作するように設計されていますが、Dockerが最もよく使用されます。 ホストのクラスター全体にわたる展開の自動化、スケーリング、操作など、幅広い機能を提供します。 link:/kubernetes [詳細については、この記事にKubernetesの優れた記事があります]。

3. ヘルムアーキテクチャ

Helmのアーキテクチャは非常に単純で、クライアントとクラスター内サーバーで構成されています。
  • Tiller Server:* Helmは、Kubernetesアプリケーションを管理します
    Kubernetesクラスター内にインストールされたTiller Server *と呼ばれるコンポーネント。 TillerはKubernetes APIサーバーと対話して、Kubernetesリソースのインストール、アップグレード、クエリ、および削除を行います。

  • Helm Client:* Helmは、ユーザーが作業するためのコマンドラインインターフェイスを提供します
    ヘルムチャート付き*。 Helm Clientは、Tillerサーバーと対話して、チャートのインストール、アップグレード、ロールバックなどのさまざまな操作を実行します。

4. ヘルムチャート

  • Helmは、チャートを介してKubernetesリソースパッケージを管理します*。

    チャートの作成については、後ほど詳しく説明しますが、現時点では、Kubernetesクラスターが与えられた場合、Kubernetesアプリケーションを作成するために必要な一連の情報に過ぎません。
  • チャートは、特定のディレクトリに編成されたファイルのコレクションです
    構造

  • チャートに関連する構成情報は、
    構成

  • 最後に、特定の構成を持つチャートの実行中のインスタンスは
    リリースと呼ばれる

5. セットアップ

最初のヘルムチャートを作成するには、事前にいくつかの設定が必要です。
まず、Helmの使用を開始するには、Kubernetesクラスターが必要です。 このチュートリアルでは、* https://kubernetes.io/docs/setup/minikube/ [Minikube]を使用します。これは、単一ノードのKubernetesクラスターをローカルで操作する優れた方法を提供します*。 Windowsでは、Hyper-Vをネイティブハイパーバイザーとして使用してMinikubeを実行できるようになりました。 link:/spring-boot-minikube[Minikubeの設定について詳しくは、この記事を参照してください]。
また、Kubernetesクラスター内で管理する基本的なアプリケーションが必要です。 このチュートリアルでは、Dockerコンテナとしてパッケージ化された簡単なSpring Bootアプリケーションを使用します。 link:/dockerizing-spring-boot-application#Dockerize [このようなアプリケーションをDockerコンテナとしてパッケージ化する方法の詳細については、この記事を参照してください]。

6. Helmのインストール

Helmをインストールするには、https://helm.sh/docs/using_helm/#installing-helm [Helmの公式インストールページ]にきちんと説明されているいくつかの方法があります。 * Windowsにhelmをインストールする最も簡単な方法は、Windowsプラットフォーム用のパッケージマネージャーであるhttps://chocolatey.org/[Chocolaty]*を使用することです。
Chocolatyを使用すると、Helmをインストールする簡単な1行のコマンドになります。
choco install kubernetes-helm
これにより、Helm Clientがローカルにインストールされます。
次に、Helm CLIを初期化する必要があります。これは、Kubernetes構成で識別されるように、Tiller ServerをKubernetesクラスターに効果的にインストールします。 Helmを初期化する前に、Kubernetesクラスターが実行中であり、_kubectl_からアクセスできることを確認してください*:
kubectl cluster-info
そして、Helm CLI自体を介してHelmを初期化できます。
helm init

7. 最初のチャートの作成

これで、テンプレートと値を含む最初のHelm Chartを開発する準備ができました。

7.1. チャートを作成する

*以前にインストールしたHelm CLIは、チャートの作成に非常に便利です*:
helm create hello-world
ここで提供される*チャートの名前は、チャートが作成されて保存されるディレクトリの名前になることに注意してください。
作成されたディレクトリ構造を簡単に見てみましょう。
hello-world /
  Chart.yaml
  values.yaml
  templates /
  charts /
  .helmignore
私たちのために作成されたこれらのファイルとフォルダーの関連性を理解しましょう:
  • Chart.yaml:これは、の説明を含むメインファイルです
    私たちのチャート

  • values.yaml:これは、デフォルト値を含むファイルです
    私たちのチャート

  • templates:これはKubernetesリソースがあるディレクトリです
    テンプレートとして定義

  • charts:これはサブチャートを含むことができるオプションのディレクトリです

  • .helmignore:これは、次の場合に無視するパターンを定義できる場所です。
    パッケージ化(.gitignoreと概念が似ています)

7.2. テンプレートを作成する

テンプレートディレクトリ内を見ると、一般的なKubernetesリソース用のテンプレートが既にいくつか作成されていることに気付くでしょう。
hello-world /
  templates /
    deployment.yaml
    service.yaml
    ingress.yaml
    ......
アプリケーションにはこれらのリソースや他のリソースが必要になる場合があります。これらのリソースはテンプレートとして作成する必要があります。
このチュートリアルでは、展開とその展開を公開するサービスを作成します。 ここでの重点は、Kubernetesを詳細に理解することではないことに注意してください。 したがって、これらのリソースは可能な限りシンプルに保ちます。
_templates_ディレクトリ内の_deployment.yaml_ファイルを次のように編集しましょう。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "hello-world.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "hello-world.name" . }}
    helm.sh/chart: {{ include "hello-world.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "hello-world.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "hello-world.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
同様に、ファイル_service.yaml_を次のように編集します。
apiVersion: v1
kind: Service
metadata:
  name: {{ include "hello-world.fullname" . }}
  labels:
    app.kubernetes.io/name: {{ include "hello-world.name" . }}
    helm.sh/chart: {{ include "hello-world.chart" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: {{ include "hello-world.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}
現在、Kubernetesの知識により、これらのテンプレートファイルはいくつかの奇妙な点を除いて非常によく似ています。 *二重括弧\ {\ {}}内のテキストの自由な使用に注意してください。 これは、テンプレートディレクティブと呼ばれるものです。*
  • HelmはGoテンプレート言語を使用して、Helmテンプレート言語と呼ばれるものに拡張します。*評価中、テンプレートディレクトリ内のすべてのファイルがテンプレートレンダリングエンジンに送信されます。 これは、テンプレートディレクティブが実際の値をテンプレートに挿入する場所です。

7.3. 価値の提供

前のサブセクションでは、テンプレートでテンプレートディレクティブを使用する方法を説明しました。 次に、値をテンプレートレンダリングエンジンに渡す方法を理解しましょう。 *通常、Helmのビルトインオブジェクトを介して値を渡します。*
リリース、値、チャート、ファイルなど、Helmで使用可能なオブジェクトは多数あります。
チャートの_values.yaml_ファイルを使用して、ビルトインオブジェクト値を介してテンプレートレンダリングエンジンに値を渡すことができます。 _values.yaml_を次のように変更します。
replicaCount: 1
image:
  repository: "hello-world"
  tag: "1.0"
  pullPolicy: IfNotPresent
service:
  type: NodePort
  port: 80
ただし、名前空間を区切るドットを使用して、テンプレート内でこれらの値にアクセスする方法に注意してください。 イメージリポジトリとタグを「hello-world」と「1.0」として使用しました。これは、Spring Bootアプリケーション用に作成したdockerイメージタグと一致する必要があります。

8. Helmコマンドについて

これですべてが完了したので、チャートで遊ぶ準備ができました。 これを楽しくするためにHelm CLIで使用できるさまざまなコマンドを見てみましょう。

8.1. ヘルムリント

まず、これはチャートへのパスを取り、一連のテストを実行してチャートが整形式であることを確認する単純なコマンドです。
helm lint ./hello-world
==> Linting ./hello-world
1 chart(s) linted, no failures

8.2ヘルムテンプレート

また、迅速なフィードバックのために、Tillerサーバーなしでテンプレートをローカルにレンダリングする次のコマンドがあります。
helm template ./hello-world
---
# Source: hello-world/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: release-name-hello-world
  labels:
    app.kubernetes.io/name: hello-world
    helm.sh/chart: hello-world-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/managed-by: Tiller
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: hello-world
    app.kubernetes.io/instance: release-name

---
# Source: hello-world/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: release-name-hello-world
  labels:
    app.kubernetes.io/name: hello-world
    helm.sh/chart: hello-world-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/managed-by: Tiller
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: hello-world
      app.kubernetes.io/instance: release-name
  template:
    metadata:
      labels:
        app.kubernetes.io/name: hello-world
        app.kubernetes.io/instance: release-name
    spec:
      containers:
        - name: hello-world
          image: "hello-world:1.0"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP

8.3. ヘルムインストール

チャートが正常であることを確認したら、最後に次のコマンドを実行してKubernetesクラスターにチャートをインストールできます。
helm install --name hello-world ./hello-world
NAME:   hello-world
LAST DEPLOYED: Mon Feb 25 15:29:59 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME         TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.110.63.169  <none>       80:30439/TCP  1s

==> v1/Deployment
NAME         DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
hello-world  1        0        0           0          1s

==> v1/Pod(related)
NAME                          READY  STATUS   RESTARTS  AGE
hello-world-7758b9cdf8-cs798  0/1    Pending  0         0s
最後に、フラグ-nameを使用してこのチャートのリリースに名前を付けたことに注意してください。 コマンドは、プロセスで作成されたKubernetesリソースの概要で応答します。

8.4. ヘルムゲット

次に、どのチャートがどのリリースとしてインストールされているかを確認します。 このコマンドにより、名前付きリリースを照会できます。
helm ls --all
NAME            REVISION        UPDATED                         STATUS          CHART               APP VERSION NAMESPACE
hello-world     1               Mon Feb 25 15:29:59 2019        DEPLOYED        hello-world-0.1.0   1.0         default

8.5. ヘルムアップグレード

チャートを変更し、更新されたバージョンをインストールする必要がある場合はどうなりますか? このコマンドは、リリースを指定されたバージョンまたは現在のバージョンのチャートまたは構成にアップグレードするのに役立ちます。
helm upgrade hello-world ./hello-world
Release "hello-world" has been upgraded. Happy Helming!
LAST DEPLOYED: Mon Feb 25 15:36:04 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME         TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.110.63.169  <none>       80:30439/TCP  6m5s

==> v1/Deployment
NAME         DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
hello-world  1        1        1           1          6m5s

==> v1/Pod(related)
NAME                          READY  STATUS   RESTARTS  AGE
hello-world-7758b9cdf8-cs798  1/1    Running  0         6m4s

8.6. ヘルムロールバック

リリースが失敗し、取り戻す必要があることは常に起こり得ます。 これは、リリースを以前のバージョンにロールバックするコマンドです。
helm rollback hello-world 1
Rollback was a success! Happy Helming!

8.7. ヘルム削除

可能性は低いですが、リリースを完全に削除することもできます。 このコマンドを使用して、Kubernetesからリリースを削除できます。
helm delete --purge hello-world
release "hello-world" deleted
これらは、Helmでチャートとリリースを操作するために使用できるコマンドの一部にすぎません。

9. チャートの配布

テンプレートは、HelmがKubernetesリソースの管理の世界にもたらす強力なツールですが、Helmを使用することの利点はそれだけではありません。 前のセクションで見たように、HelmはKubernetesアプリケーションのパッケージマネージャーとして機能し、リリースのインストール、クエリ、アップグレード、削除を非常にシームレスにします。
これに加えて、* Helmには、Kubernetesアプリケーションをチャートとしてパッケージ化、公開、取得するためのCLIの一部としてコマンドが付属しています*。

9.1. ヘルムパッケージ

まず、作成したチャートをパッケージ化して、配布できるようにする必要があります。 これは、チャートのバージョン管理されたアーカイブファイルを作成するコマンドです。
helm package ./hello-world
Successfully packaged chart and saved it to: \hello-world\hello-world-0.1.0.tgz
手動で配布できるアーカイブ、またはパブリックまたはプライベートのチャートリポジトリを介して配布できるアーカイブが生成されることに注意してください。

9.2. ヘルムレポ

最後に、共同リポジトリを共有するためのメカニズムが必要です。 Repoには、チャートリポジトリの追加、削除、一覧表示、またはインデックス作成に使用できるコマンドの束がバンドルされています。 それらの使用方法を見てみましょう。
  • gitリポジトリを作成し、それをチャートリポジトリとして機能させることができます。*唯一の要件は、_index.yaml_ファイルが必要であることです。

    チャートリポジトリの_index.yaml_を作成できます。
helm repo index my-repo/ --url https://<username>.github.io/my-repo
これにより、_index.yaml_ファイルが生成されます。このファイルは、チャートアーカイブとともにリポジトリにプッシュする必要があります。
チャートリポジトリを正常に作成した後、続いて、このリポジトリをリモートで追加できます。
helm repo add my-repo https://my-pages.github.io/my-repo
これで、レポからチャートを直接インストールできるはずです。
helm install my-repo/hello-world --name=hello-world
チャートリポジトリを操作するためのhttps://github.com/helm/helm/tree/master/docs/helm [利用可能なユーティリティコマンドはかなりあります]があります。

10. 結論

要約すると、このチュートリアルでは、KubernetesアプリケーションのパッケージマネージャーであるHelmのコアコンポーネントについて説明しました。 Helmをインストールするオプションを理解しました。 さらに、サンプルチャートと値を含むテンプレートを作成しました。
次に、Helm CLIの一部として使用可能な複数のコマンドを実行して、KubernetesアプリケーションをHelmパッケージとして管理しました。
最後に、リポジトリを通じてHelmパッケージを配布するためのオプションについて説明しました。