Helm3パッケージマネージャーを使用してKubernetesクラスターにソフトウェアをインストールする方法
序章
Helm は、Kubernetesのパッケージマネージャーであり、開発者とオペレーターがKubernetesクラスターでアプリケーションをより簡単に構成およびデプロイできるようにします。
Helmパッケージはchartsと呼ばれ、ユーザーの最小限の労力で特定のアプリをデプロイおよび構成するリソース定義のテンプレートが含まれています。 テンプレートを使用すると、実際のグラフを変更せずに変数定義を渡すことで、グラフ、その設定、および動作を管理できます。 カスタマイズされたリソース定義、およびすでにデプロイされている定義への変更により、Helmは自動的に管理します。 カスタマイズ可能な展開されたチャートは、リリースと呼ばれます。
このチュートリアルでは、Helm 3をセットアップし、チャートとリリースをインストール、アップグレード、ロールバック、および管理する方法を学習します。 また、独自のグラフを作成してパッケージ化する方法や、すぐにインストールできるグラフをホストするグラフリポジトリを設定する方法についても学びます。
前提条件
ロールベースのアクセス制御(RBAC)が有効になっているKubernetesクラスター。 リリースの詳細については、ヘルムリリースページを確認してください。
ローカルマシンにインストールされ、クラスターに接続するように構成された
kubectl
コマンドラインツール。kubectl
のインストールについて詳しくは、公式ドキュメントをご覧ください。次のコマンドを使用して、接続をテストできます。
kubectl cluster-info
エラーが発生しない場合は、クラスターに接続しています。
kubectl
を使用して複数のクラスターにアクセスする場合は、次を実行して、正しいクラスターコンテキストを選択したことを確認してください。kubectl config get-contexts
出力には、使用可能な構成が一覧表示されます。
OutputCURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin
ここで、アスタリスク(
*
)は、do-fra1-helm3-example
クラスターに接続していることを示します。 クラスタを切り替えるには、次を実行します。kubectl config use-context context-name
正しいクラスターに接続したら、ステップ1に進んでHelmのインストールを開始します。
ステップ1—Helm3をインストールする
このセクションでは、公式に提供されているシェルスクリプトを使用して Helm3をインストールします。
/tmp
に移動して開始します。ここで、次のコマンドを実行してインストールスクリプトを保存します。
cd /tmp
次のコマンドでスクリプトをダウンロードします。
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
テキストエディタでget_helm.sh
を調べて、安全であることを確認できます。
アクセス許可を次のように設定して、実行可能にします。
chmod u+x get_helm.sh
最後に、それを実行してHelm3をインストールします。
./get_helm.sh
次のような出力が表示されます。
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
マシンにHelm3がインストールされています。 次に、チャートリポジトリとその使用方法について学習します。
ステップ2—チャートリポジトリの設定
ヘルムチャートは、誰でもホストできるチャートリポジトリに保存されます。 デフォルトでは、Helm3にはリポジトリが事前構成されていません。 Helmの以前のバージョンには、中央のキュレートされたチャートリポジトリが含まれていました。 ただし、Helm 3の設計は、独自のリポジトリを管理するチャート開発者に意図的に進化し、より多くの自由とより迅速なリリースを可能にしました。 つまり、使用するチャートごとに、ホスティングリポジトリをHelmインストールに追加する必要があります。
適切なリポジトリを見つけるために、Helmチャートとそのリポジトリをカタログ化するCNCFによって管理されるオープンソースWebサイトであるArtifactHub.ioを使用できます。 また、他のCNCFプロジェクトが使用する人気のある便利なチャートも追跡するため、以前のバージョンのHelmが使用していたstable
リポジトリとは異なります。 Nginxの侵入や監視ツールなどの一般的なプロジェクトの場合、これは優れた情報源です。
ホームページからインストールしたいチャートを検索できます。 nginx
を検索すると、それに関連するすべてのインデックス付きチャートが表示されます。
Kubernetesチームが管理するコミュニティエディションをインストールします。 ingress-nginx
を検索して、結果から見つけてください。 そのページにアクセスするには、それを選択します。
各チャートには、そのリポジトリをインストールに追加してチャートをインストールするためのコマンドと組み合わせて、その機能の詳細を説明する必要があります。 そうでない場合でも、ページの右側にある INSTALL ボタンを押すと、必要なコマンドを取得できます。
コマンドの横にある青いボタンをクリックして、コマンドをコピーできます。 最初のコマンドに対してこれを行い、それを実行します。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
Helmにリポジトリを追加するには、helm repo add
を実行します。 受け入れるパラメータは、リポジトリの名前とその場所です。
出力は次のようになります。
Output"ingress-nginx" has been added to your repositories
新しいリポジトリを追加するときは、次のコマンドを実行して、リポジトリに何が含まれているかをHelmに通知する必要があります。
helm repo update
更新が成功したことを示す次の出力が表示されます。
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のインストールに新しいリポジトリも追加しました。 次のステップでは、ヘルムチャートをインストールします。
ステップ3—ヘルムチャートのインストール
前のセクションでは、ingress-nginx
チャートのリポジトリを追加しました。 これで、クラスターにインストールします。
各チャートには、動作を変更するために設定できる構成変数があります。 これらの変数は、チャートの一部であるvalues.yaml
というファイルに保存されます。 チャートをマシンにダウンロードしていない限り、チャートを表示するには次のコマンドを実行する必要があります。
helm show values chart_name
ingress-nginx
で使用可能な変数を表示するには、chart_name
を置き換えます。
helm show values ingress-nginx/ingress-nginx
ingress-nginx
のvalues.yaml
の内容を示す出力が長くなります。
チャートをインストールするには、helm install
を使用できます。
helm install release_name repository/chart_name
リリースはチャートのデプロイされたインスタンスであり、ここではingress-nginx
と呼んでいます。
このコマンドは、変数のデフォルト値を使用してチャートをクラスターにインストールします。 それらのいくつかを変更したい場合は、--set
を使用して新しい変数値を渡すことができます。
helm install ingress-nginx/ingress-nginx --set variable_name=variable_value
必要な数の変数に対して--set
を繰り返すことができます。 今はカスタマイズしないので、次のコマンドを実行してそのままインストールします。
helm install ingress-nginx ingress-nginx/ingress-nginx
出力は次のようになります。
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
を使用します。
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
次のコマンドを実行すると、クラスター内にあるサービスを見つけることができます。
kubectl get services
出力は次のようになります。
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に設定されています。これは、使用可能なポッドを一覧表示することで確認できます。
kubectl get pods
次の1つしかないことがわかります。
OutputNAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m
冗長性のためにさらに展開する場合(たとえば、3つ)、リリースをupgrade
し、次を実行して変数を3
に設定できます。
helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values
また、--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: ...
次のコマンドを実行して、使用可能なポッドを一覧表示できます。
kubectl get pods
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—リリースのロールバックと削除
リリースをupgrade
すると、そのリビジョン番号が増加します。 内部的には、Helmはリリースのすべてのリビジョンを保存し、必要に応じて以前のリビジョンに戻すことができます。
ポッドの数を1つに戻すには、helm upgrade
を再度実行し、小さな変更であるため、手動で数を設定します。 ただし、多くの変数を含む大きなグラフを操作する場合、手動で元に戻すことは不可能であり、自動化する必要があります。
リリースをロールバックするには、helm rollback
を使用します。
helm rollback release_name release_revision
これを使用して、リビジョン1
にロールバックすることにより、ingress-nginx
に加えた変更を元に戻すことができます。
helm rollback ingress-nginx 1
アクションが成功したことを示す次の出力が表示されます。
OutputRollback was a success! Happy Helming!
リリースを一覧表示することで、現在のリビジョンを確認できます。
helm list
リビジョンが3
になり、1
ではないことがわかります。
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
が最初のリビジョンと等しいことを確認できます。
kubectl get pods
次の1つしかないことがわかります。
OutputNAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m
リリースとそのすべてのリビジョンを削除するには、helm delete
を使用できます。
helm delete release_name
もう必要ないので、次のコマンドを実行してingress-nginx
を削除します。
helm delete ingress-nginx
出力は次のようになります。
Outputrelease "ingress-nginx" uninstalled
リリースをリストして、リリースがないことを確認できます。
helm list
出力テーブルには行がありません。
OutputNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
リリースが削除されたので、将来の展開でその名前を再利用できます。
ステップ6—(オプション)カスタムチャートの作成
このオプションの手順では、カスタムチャートを作成する方法、リソース定義を配置する場所、およびさらに配布するためにパッケージ化する方法を学習します。
example-chart
という新しいグラフを作成します。 次のコマンドを実行して作成します。
helm create 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
の内容を表示することで確認できます。
cat example-chart/templates/service.yaml
二重中括弧で囲まれた値を生成するためのテンプレートディレクティブがあることがわかります。
OutputapiVersion: v1 kind: Service metadata: name: {{ include "mychart.fullname" . }} labels: {{- include "mychart.labels" . | nindent 4 }} spec: type: {{ .Values.service.type }} ports: - port: {{ .Values.service.port }} targetPort: http protocol: TCP name: http selector: {{- include "mychart.selectorLabels" . | nindent 4 }}
参照される変数はユーザーに公開され、values.yaml
で定義されます。 NOTES
テキストHelmは、展開後にNOTES.txt
に保存され、テンプレート化された後に表示されます。 展開されているソフトウェアの名前、バージョン、バージョンなどのチャートメタデータは、Chart.yaml
で指定されます。
例-chart/Chart.yaml
apiVersion: v2 name: mychart description: A Helm chart for Kubernetes ... type: application ... version: 0.1.0 ... appVersion: "1.16.0"
Helmが展開するものを確認するには、チャートディレクトリを指す--dry-run
および--debug
をhelm install
に渡すことができます。
helm install example-chart --dry-run --debug ./example-chart
出力は長くなり、クラスターに適用されるすべての最終的なリソース定義が含まれます。 チャートで作業しているときに、helm upgrade
を使用して新しいバージョンをKubernetesにプッシュできます。
完成したチャートを共有するときは、次のコマンドを実行して配布用にパッケージ化できます。
helm package ./example-chart
出力は次のようになります。
OutputSuccessfully packaged chart and saved it to: .../example-chart-0.1.0.tgz
パッケージ化されたチャートは、追加されたリポジトリのチャートと同じようにインストールできます。
helm install example-chart example-chart-0.1.0.tgz
このステップでは、カスタムチャートを作成し、それを展開しました。 また、パッケージ化して、その構造について学習しました。
結論
これで、Helmを使用してKubernetesクラスターにデプロイされたソフトウェアをインストールおよびアップグレードする方法をマスターしました。 グラフリポジトリを追加し、それらが重要である理由と、ArtifactHubがそれらを見つけるのにどのように役立つかを学びました。 また、新しいカスタムチャートを作成し、リリースリビジョンと、必要に応じてロールバックする方法について学習しました。
カスタムチャートの作成の詳細については、公式ガイドをご覧ください。