Helm 3パッケージマネージャを使用してKubernetesクラスターにソフトウェアをインストールする方法

はじめに

Helmは、開発者やオペレーターがKubernetesクラスター上でアプリケーションを簡単に構成およびデプロイできるようにするKubernetesのパッケージマネージャーです。

Helmパッケージはチャートと呼ばれ、特定のアプリケーションをデプロイおよび構成するリソース定義のテンプレートを含んでいます。テンプレート化により、ユーザーが実際のチャートを変更せずに、変数定義を渡すことで、チャート、その設定、および動作を管理できます。カスタマイズされたリソース定義や、既にデプロイされた定義の変更も、Helmが自動的に管理します。可能なカスタマイズが施されたデプロイされたチャートは、リリースと呼ばれます。

このチュートリアルでは、Helm 3のセットアップ方法と、チャートとリリースのインストール、アップグレード、ロールバック、管理方法について学びます。また、独自のチャートを作成してパッケージ化し、すぐにインストールできるチャートをホストするチャートリポジトリのセットアップも学びます。

前提条件

  • ロールベースのアクセス制御(RBAC)が有効なKubernetesクラスター。リリースに関する詳細情報は、Helmリリースページを参照してください。

  • ローカルマシンにインストールされたkubectlコマンドラインツールが、クラスターに接続するように構成されています。 kubectlのインストールに関する詳細は、公式ドキュメントを参照してください。

    以下のコマンドで接続をテストできます:

    1. kubectl cluster-info

    エラーが表示されない場合、クラスターに接続されています。 kubectlで複数のクラスターにアクセスする場合は、次のコマンドを実行して正しいクラスターコンテキストを選択してください:

    1. kubectl config get-contexts

    出力には利用可能な構成がリストされます:

    出力
    CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-fra1-helm3-example do-fra1-helm3-example do-fra1-helm3-example-admin

    ここで、アスタリスク(*)はdo-fra1-helm3-exampleクラスターに接続されていることを示しています。 クラスターを切り替えるには、次のコマンドを実行します:

    1. kubectl config use-context context-name

正しいクラスタに接続されている場合は、Helmをインストールするためにステップ1に進んでください。

ステップ1 — Helm 3のインストール

このセクションでは、公式に提供されたシェルスクリプトを使用してHelm 3をインストールします

まず、次のコマンドを実行してインストールスクリプトを保存する/tmpに移動してください:

  1. cd /tmp

次のコマンドを使用してスクリプトをダウンロードします:

  1. curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

安全であることを確認するために、get_helm.shをテキストエディタで確認できます。

次のようにアクセス許可を設定して、実行可能にします:

  1. chmod u+x get_helm.sh

最後に、Helm 3をインストールするために実行します:

  1. ./get_helm.sh

次のような出力が表示されます:

Output
Downloading 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ボタンを押して、必要なコマンドを取得できます。

最初のコマンドの横にある青いボタンをクリックして、それをコピーします。それを行います:

  1. 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にその内容を通知する必要があります:

  1. helm repo update

次の出力を受け取り、更新が成功したことを示します:

Output
Hang 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 というファイルに格納されています。このファイルはチャートの一部です。チャートをマシンにダウンロードしていない場合は、次のコマンドを実行して表示する必要があります:

  1. helm show values chart_name

ingress-nginx の利用可能な変数を表示するには、chart_name を置換してください:

  1. helm show values ingress-nginx/ingress-nginx

出力は、ingress-nginxvalues.yaml の内容を示す長いものになります。

チャートをインストールするには、helm install を使用できます:

  1. helm install release_name repository/chart_name

A release is a deployed instance of the chart, and here you’re calling it ingress-nginx.

このコマンドは、変数のデフォルト値でチャートをクラスタにインストールします。いくつかの変数を変更したい場合は、--set を使用して新しい変数値を渡すことができます:

  1. helm install ingress-nginx/ingress-nginx --set variable_name=variable_value

必要な変数ごとに --set を繰り返すことができます。今はカスタマイズしないので、次のコマンドを実行してそのままインストールします:

  1. helm install ingress-nginx ingress-nginx/ingress-nginx

出力は次のようになります:

Output
NAME: 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 を使用します:

  1. helm list

現時点でデプロイされているチャートは ingress-nginx のみです。

Output
NAME 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

クラスター内のサービスを確認するには、次のコマンドを実行します:

  1. kubectl get services

出力は次のようになります:

Output
NAME 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. kubectl get pods

1つしかないことがわかります:

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 12m

冗長性のためにより多くのポッドが必要な場合(例えば3つ)、リリースをupgradeして変数を3に設定できます:

  1. helm upgrade ingress-nginx ingress-nginx/ingress-nginx --set controller.replicaCount=3 --reuse-values

また、--reuse-valuesを渡して、Helmに変更をデプロイされたリリースの上に基づかせ、前の構成を保持します。

出力では、Helmはリリースがアップグレードされたことを示すためにリビジョンを上げます:

Output
NAME: ingress-nginx LAST DEPLOYED: Wed Feb 24 12:07:54 2021 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None NOTES: ...

利用可能なポッドをリストアップするには、次のコマンドを実行します:

  1. kubectl get pods

1つではなく、3つのポッドがリストされていることがわかります:

Output
NAME 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. helm rollback release_name release_revision

これを使用して、リビジョン1にロールバックしてingress-nginxに加えた変更を元に戻すことができます。

  1. helm rollback ingress-nginx 1

以下の出力が表示され、アクションが成功したことが示されます。

Output
Rollback was a success! Happy Helming!

リリースを一覧表示して現在のリビジョンを確認できます。

  1. helm list

リビジョンが1ではなく3になっていることがわかります。

Output
NAME 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. kubectl get pods

1つしかないことがわかります。

Output
NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7fc74cf778-kjtst 1/1 Running 0 41m

リリースとそのすべてのリビジョンを削除するには、helm deleteを使用できます。

  1. helm delete release_name

必要なくなったので、次のコマンドを実行してingress-nginxを削除してください:

  1. helm delete ingress-nginx

出力は次の通りです:

Output
release "ingress-nginx" uninstalled

リリースをリストして、そのリリースがないことを確認できます:

  1. helm list

出力テーブルには行がありません:

Output
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

リリースが削除されたので、今後の展開でその名前を再利用できます。

ステップ6 — (オプション)カスタムチャートの作成

このオプションのステップでは、カスタムチャートの作成方法、リソース定義の配置先、およびさらなる配布のためのパッケージ化方法を学びます。

新しいチャートexample-chartを作成します。次のコマンドを実行してください:

  1. helm create example-chart

これにより、次のファイルと構造を持つ新しいディレクトリ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の内容を表示することで確認できます:

  1. cat example-chart/templates/service.yaml

そのファイルには、二重ブレースで囲まれた値を生成するためのテンプレートディレクティブがあることがわかります:

Output
apiVersion
: 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で定義されます。展開後にHelmが表示するNOTESテキストはNOTES.txtに保存され、またテンプレート化されています。チャートのメタデータ、例えば名前、バージョン、展開されるソフトウェアのバージョンは、Chart.yamlで指定されます:

example-chart/Chart.yaml
apiVersion: v2
name: mychart
description: A Helm chart for Kubernetes

...
type: application

...
version: 0.1.0

...
appVersion: "1.16.0"

Helmが展開する内容を確認するには、helm install--dry-run--debugを渡して、チャートディレクトリを指定します:

  1. helm install example-chart --dry-run --debug ./example-chart

出力は長く、クラスターに適用される最終的なリソース定義が含まれます。チャートを作成中に、helm upgradeを使用して新しいバージョンをKubernetesにプッシュできます。

完成したチャートを共有する準備ができたら、次のコマンドを実行してパッケージ化できます:

  1. helm package ./example-chart

出力は次のようになります:

Output
Successfully packaged chart and saved it to: .../example-chart-0.1.0.tgz

パッケージ化されたチャートは、リポジトリに追加されたものと同じようにインストールできます:

  1. helm install example-chart example-chart-0.1.0.tgz

このステップでは、カスタムチャートを作成して展開しました。また、パッケージ化も行い、その構造について学びました。

結論

これで、Helmを使用してKubernetesクラスターに展開されるソフトウェアのインストールとアップグレード方法を学びました。チャートリポジトリを追加し、それらがなぜ重要であり、ArtifactHubが見つけるのにどのように役立つかを学びました。また、新しいカスタムチャートを作成し、リリースのリビジョンについて学び、必要に応じてロールバックする方法も学びました。

カスタムチャートの作成に関する詳細は、公式ガイドをご覧ください。

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-software-on-kubernetes-clusters-with-the-helm-3-package-manager