はじめに
Helmは、開発者やオペレーターがKubernetesクラスター上でアプリケーションを簡単に構成およびデプロイできるようにするKubernetesのパッケージマネージャーです。
Helmパッケージはチャートと呼ばれ、特定のアプリケーションをデプロイおよび構成するリソース定義のテンプレートを含んでいます。テンプレート化により、ユーザーが実際のチャートを変更せずに、変数定義を渡すことで、チャート、その設定、および動作を管理できます。カスタマイズされたリソース定義や、既にデプロイされた定義の変更も、Helmが自動的に管理します。可能なカスタマイズが施されたデプロイされたチャートは、リリースと呼ばれます。
このチュートリアルでは、Helm 3のセットアップ方法と、チャートとリリースのインストール、アップグレード、ロールバック、管理方法について学びます。また、独自のチャートを作成してパッケージ化し、すぐにインストールできるチャートをホストするチャートリポジトリのセットアップも学びます。
前提条件
-
ロールベースのアクセス制御(RBAC)が有効なKubernetesクラスター。リリースに関する詳細情報は、Helmリリースページを参照してください。
-
ローカルマシンにインストールされた
kubectl
コマンドラインツールが、クラスターに接続するように構成されています。kubectl
のインストールに関する詳細は、公式ドキュメントを参照してください。以下のコマンドで接続をテストできます:
エラーが表示されない場合、クラスターに接続されています。
kubectl
で複数のクラスターにアクセスする場合は、次のコマンドを実行して正しいクラスターコンテキストを選択してください:出力には利用可能な構成がリストされます:
出力CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-adminここで、アスタリスク(
*
)はdo-fra1-helm3-example
クラスターに接続されていることを示しています。 クラスターを切り替えるには、次のコマンドを実行します:
正しいクラスタに接続されている場合は、Helmをインストールするためにステップ1に進んでください。
ステップ1 — Helm 3のインストール
このセクションでは、公式に提供されたシェルスクリプトを使用してHelm 3をインストールします。
まず、次のコマンドを実行してインストールスクリプトを保存する/tmp
に移動してください:
次のコマンドを使用してスクリプトをダウンロードします:
安全であることを確認するために、get_helm.sh
をテキストエディタで確認できます。
次のようにアクセス許可を設定して、実行可能にします:
最後に、Helm 3をインストールするために実行します:
次のような出力が表示されます:
OutputDownloading https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
マシンにHelm 3がインストールされました。これで、チャートリポジトリについて学び、それらの使用方法を学びます。
ステップ2 — チャートリポジトリの設定
Helmチャートは、誰でもホストできるチャートリポジトリに格納されます。デフォルトでは、Helm 3には事前に構成されたリポジトリが含まれていません。以前のHelmのバージョンには、中央の厳選されたチャートリポジトリが含まれていました。しかし、Helm 3の設計は意図的に進化し、チャート開発者が独自のリポジトリを管理することができるようになりました。これにより、より自由度が高く、リリースが迅速になります。つまり、使用する各チャートについて、ホストリポジトリをHelmインストールに追加する必要があります。
適切なリポジトリを見つけるために、ArtifactHub.ioを使用できます。これは、CNCFによって管理されているオープンソースのウェブサイトで、Helmチャートとそのリポジトリをカタログ化しています。他のCNCFプロジェクトが使用する人気のある便利なチャートも追跡しているため、以前のバージョンのHelmが使用していたstable
リポジトリとは異なります。Nginx ingressesや監視ツールなどの一般的なプロジェクトについては、優れた情報源です。
ホームページでインストールしたいチャートを検索できます。 nginx
を検索すると、それに関連するすべてのインデックスされたチャートが表示されます。
コミュニティ版をインストールし、Kubernetesチームによって管理されています。検索してくださいingress-nginx
結果でそれを見つけるため。ページにアクセスするには、それを選択します。
各チャートには、その動作を詳細に説明した説明が付いており、インストールにそのリポジトリを追加するためのコマンドが付いています。そうでない場合は、ページの右側にあるINSTALLボタンを押して、必要なコマンドを取得できます。
最初のコマンドの横にある青いボタンをクリックして、それをコピーします。それを行います:
リポジトリをHelmに追加するには、helm repo add
を実行します。それが受け入れるパラメータは、リポの名前とその場所です。
出力は次のとおりです:
Output"ingress-nginx" has been added to your repositories
新しいリポを追加すると、次を実行してHelmにその内容を通知する必要があります:
次の出力を受け取り、更新が成功したことを示します:
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ingress-nginx" chart repository
Update Complete. ⎈Happy Helming!⎈
このステップでは、ArtifactHubとその提供する機能について学びました。また、Helmインストールに新しいリポを追加しました。次のステップでは、Helmチャートをインストールします。
ステップ3 — Helmチャートのインストール
前のセクションでは、ingress-nginx
チャートのリポジトリを追加しました。これをクラスタにインストールします。
各チャートには、その動作を変更できる構成変数があります。これらの変数は、values.yaml
というファイルに格納されています。このファイルはチャートの一部です。チャートをマシンにダウンロードしていない場合は、次のコマンドを実行して表示する必要があります:
ingress-nginx
の利用可能な変数を表示するには、chart_name
を置換してください:
出力は、ingress-nginx
の values.yaml
の内容を示す長いものになります。
チャートをインストールするには、helm install
を使用できます:
A release is a deployed instance of the chart, and here you’re calling it ingress-nginx
.
このコマンドは、変数のデフォルト値でチャートをクラスタにインストールします。いくつかの変数を変更したい場合は、--set
を使用して新しい変数値を渡すことができます:
必要な変数ごとに --set
を繰り返すことができます。今はカスタマイズしないので、次のコマンドを実行してそのままインストールします:
出力は次のようになります:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 10:12:37 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
...
NAME
は指定したリリースの名前に対応していることに注意してください。Helmはリリースのステータスやデプロイされたネームスペースなどの一般的な情報もリストします。NOTES
セクションはチャートによって異なり、通常はクイックスタートガイダンスを含むか、チャートのリソースを使用する際の一般的な落とし穴を警告します。ここでは、ロードバランサーが作成されていることと、完了までに時間がかかる可能性があることが記載されています。
デプロイされたチャートを確認するには、helm list
を使用します:
現時点でデプロイされているチャートは ingress-nginx
のみです。
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 1 2021-02-24 10:12:37.281049711 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
クラスター内のサービスを確認するには、次のコマンドを実行します:
出力は次のようになります:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.245.211.81 46.101.68.67 80:30704/TCP,443:30700/TCP 7m19s
ingress-nginx-controller-admission ClusterIP 10.245.50.17 <none> 443/TCP 7m19s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 83m
クラスターにリリースをデプロイしたので、デプロイされた状態でその構成を変更します。
ステップ4 — リリースのアップグレード
リリースがデプロイされると、その構成を変更する必要がある場合、完全に解体して再デプロイする必要はありません。新しいバージョンのチャートでリリースをアップグレードしたり、新しい設定を行うために、helm upgrade
コマンドを使用できます。
ingress-nginx
チャートは、デプロイされたコントローラーポッドの数を制御するcontroller.replicaCount
変数を公開します。デフォルトでは、これは1に設定されています。利用可能なポッドをリストアップして確認できます:
1つしかないことがわかります:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
冗長性のためにより多くのポッドが必要な場合(例えば3つ)、リリースをupgrade
して変数を3
に設定できます:
また、--reuse-values
を渡して、Helmに変更をデプロイされたリリースの上に基づかせ、前の構成を保持します。
出力では、Helmはリリースがアップグレードされたことを示すためにリビジョンを上げます:
OutputNAME: ingress-nginx
LAST DEPLOYED: Wed Feb 24 12:07:54 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
...
利用可能なポッドをリストアップするには、次のコマンドを実行します:
1つではなく、3つのポッドがリストされていることがわかります:
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-4hk9g 1/1 Running 0 18s
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 22m
ingress-nginx-controller-7fc74cf778-wz595 1/1 Running 0 18s
次に、変更を巻き戻し、リリースを完全に削除します。
ステップ5 — ロールバックとリリースの削除
リリースをアップグレード
すると、そのリビジョン番号が増加します。内部的には、Helmはリリースのすべてのリビジョンを保存し、必要に応じて以前のリビジョンに戻ることができます。
ポッドの数を1つに戻すには、helm upgrade
を再実行して数を手動で設定することができます。ただし、多くの変数を持つ大きなチャートを使用する場合、手動で戻すことは実行不可能であり、自動化する必要があります。
リリースをロールバックするには、helm rollback
を使用します。
これを使用して、リビジョン1
にロールバックしてingress-nginx
に加えた変更を元に戻すことができます。
以下の出力が表示され、アクションが成功したことが示されます。
OutputRollback was a success! Happy Helming!
リリースを一覧表示して現在のリビジョンを確認できます。
リビジョンが1
ではなく3
になっていることがわかります。
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx default 3 2021-02-24 12:43:21.523664768 +0000 UTC deployed ingress-nginx-3.23.0 0.44.0
Helmは、ロールバックを含むすべての変更をリリースの新しいリビジョンと見なします。デプロイされたポッドの数を確認して、リビジョン3
が最初のリビジョンと同じであることを確認できます。
1つしかないことがわかります。
OutputNAME READY STATUS RESTARTS AGE
ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
リリースとそのすべてのリビジョンを削除するには、helm delete
を使用できます。
必要なくなったので、次のコマンドを実行してingress-nginx
を削除してください:
出力は次の通りです:
Outputrelease "ingress-nginx" uninstalled
リリースをリストして、そのリリースがないことを確認できます:
出力テーブルには行がありません:
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
リリースが削除されたので、今後の展開でその名前を再利用できます。
ステップ6 — (オプション)カスタムチャートの作成
このオプションのステップでは、カスタムチャートの作成方法、リソース定義の配置先、およびさらなる配布のためのパッケージ化方法を学びます。
新しいチャートexample-chart
を作成します。次のコマンドを実行してください:
これにより、次のファイルと構造を持つ新しいディレクトリexample-chart
が作成されます:
charts/
templates/
├─ tests/
│ ├─ test-connection.yaml
├─ deployment.yaml
├─ hpa.yaml
├─ ingress.yaml
├─ NOTES.txt
├─ service.yaml
├─ serviceaccount.yaml
├─ _helpers.tpl
Chart.yaml
values.yaml
ターゲットクラスターにインストールされるチャートのリソース定義は、templates
ディレクトリにあります。開始点としてHelmが作成したデフォルトのものは、Nginxイングレスコントローラーを展開します。これらのファイルの拡張子はYAMLですが、渡すことができる公開変数を介してカスタマイズ可能であるため、Goのテンプレート構文を使用しています。次のコマンドを実行してservice.yaml
の内容を表示することで確認できます:
そのファイルには、二重ブレースで囲まれた値を生成するためのテンプレートディレクティブがあることがわかります:
参照されている変数はユーザーに公開され、values.yaml
で定義されます。展開後にHelmが表示するNOTES
テキストはNOTES.txt
に保存され、またテンプレート化されています。チャートのメタデータ、例えば名前、バージョン、展開されるソフトウェアのバージョンは、Chart.yaml
で指定されます:
Helmが展開する内容を確認するには、helm install
に--dry-run
と--debug
を渡して、チャートディレクトリを指定します:
出力は長く、クラスターに適用される最終的なリソース定義が含まれます。チャートを作成中に、helm upgrade
を使用して新しいバージョンをKubernetesにプッシュできます。
完成したチャートを共有する準備ができたら、次のコマンドを実行してパッケージ化できます:
出力は次のようになります:
OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
パッケージ化されたチャートは、リポジトリに追加されたものと同じようにインストールできます:
このステップでは、カスタムチャートを作成して展開しました。また、パッケージ化も行い、その構造について学びました。
結論
これで、Helmを使用してKubernetesクラスターに展開されるソフトウェアのインストールとアップグレード方法を学びました。チャートリポジトリを追加し、それらがなぜ重要であり、ArtifactHubが見つけるのにどのように役立つかを学びました。また、新しいカスタムチャートを作成し、リリースのリビジョンについて学び、必要に応じてロールバックする方法も学びました。
カスタムチャートの作成に関する詳細は、公式ガイドをご覧ください。