kubernetes-helm
HelmとKubernetesの使用
1. 概要
-
https://helm.sh/ [Helm]はKubernetesアプリケーションのパッケージマネージャーです*。 このチュートリアルでは、Helmの基本と、それらがKubernetesリソースを操作するための強力なツールを形成する方法を理解します。
過去数年にわたって、Kubernetesは飛躍的に成長し、それをサポートするエコシステムも成長しました。 最近、Helmはhttps://www.cncf.io/[Cloud Native Computing Foundation(CNCF)]によってインキュベーションプロジェクトとして発表され、Kubernetesユーザーの間で人気が高まっていることを示しています。
2. バックグラウンド
これらの用語は最近、特にクラウドテクノロジーを使用している人々の間ではかなり一般的ですが、気付いていない人のためにそれらをすぐに見ていきましょう。
-
Container:* Container
オペレーティングシステムレベルの仮想化*を指します。 隔離されたユーザー空間のオペレーティングシステム内で複数のコンテナーが実行されます。 コンテナ内で実行されているプログラムは、コンテナに割り当てられたリソースにのみアクセスできます。 -
Docker:* Dockerは、
コンテナを作成して実行します*。 コンテナーを管理するメインプログラムであるDocker Daemonが付属しています。 Docker Daemonは、Docker Command-Line Interface(CLI)で使用されるDocker Engine APIを介してその機能へのアクセスを提供します。 Dockerの詳細については、この記事を参照してください。 -
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パッケージを配布するためのオプションについて説明しました。