序章

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

Helmパッケージはchartsと呼ばれ、ユーザーの最小限の労力で特定のアプリをデプロイおよび構成するリソース定義のテンプレートが含まれています。 テンプレートを使用すると、実際のグラフを変更せずに変数定義を渡すことで、グラフ、その設定、および動作を管理できます。 カスタマイズされたリソース定義、およびすでにデプロイされている定義への変更により、Helmは自動的に管理します。 カスタマイズ可能な展開されたチャートは、リリースと呼ばれます。

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

前提条件

  • ロールベースのアクセス制御(RBAC)が有効になっているKubernetesクラスター。 リリースの詳細については、ヘルムリリースページを確認してください。

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

    次のコマンドを使用して、接続をテストできます。

    1. kubectl cluster-info

    エラーが発生しない場合は、クラスターに接続しています。 kubectlを使用して複数のクラスターにアクセスする場合は、次を実行して、正しいクラスターコンテキストを選択したことを確認してください。

    1. kubectl config get-contexts

    出力には、使用可能な構成が一覧表示されます。

    Output
    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

正しいクラスターに接続したら、ステップ1に進んでHelmのインストールを開始します。

ステップ1—Helm3をインストールする

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

/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

最後に、それを実行してHelm3をインストールします。

  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

マシンにHelm3がインストールされています。 ここで、チャートリポジトリとその使用方法について学習します。

ステップ2—チャートリポジトリの設定

ヘルムチャートは、誰でもホストできるチャートリポジトリに保存されます。 デフォルトでは、Helm3にはリポジトリが事前構成されていません。 Helmの以前のバージョンには、中央のキュレートされたチャートリポジトリが含まれていました。 ただし、Helm 3の設計は、独自のリポジトリを管理するチャート開発者に意図的に進化し、より多くの自由とより迅速なリリースを可能にしました。 つまり、使用するチャートごとに、ホスティングリポジトリをHelmインストールに追加する必要があります。

適切なリポジトリを見つけるのに役立つように、Helmチャートとそのリポジトリをカタログ化するCNCFによって管理されるオープンソースWebサイトであるArtifactHub.ioを使用できます。 また、他のCNCFプロジェクトが使用する人気のある便利なチャートも追跡するため、以前のバージョンのHelmが使用していたstableリポジトリとは異なります。 Nginxの侵入や監視ツールなどの一般的なプロジェクトの場合、これは優れた情報源です。

ホームページからインストールしたいチャートを検索できます。 nginxを検索すると、それに関連するすべてのインデックス付きチャートが表示されます。

ArtifactHub - Nginx Search

Kubernetesチームが管理するコミュニティエディションをインストールします。 ingress-nginxを検索して、結果から見つけてください。 そのページにアクセスするには、それを選択します。

ArtifactHub - ingress-nginx Search

ArtifactHub - ingress-nginx Page

各チャートには、そのリポジトリをインストールに追加してチャートをインストールするためのコマンドと組み合わせて、その機能の詳細を説明する必要があります。 そうでない場合でも、ページの右側にある INSTALL ボタンを押すと、必要なコマンドを取得できます。

ArtifactHub - ingress-nginx Install Commands

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

  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のインストールに新しいリポジトリも追加しました。 次のステップでは、ヘルムチャートをインストールします。

ステップ3—ヘルムチャートのインストール

前のセクションでは、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

リリースはチャートのデプロイされたインスタンスであり、ここでは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—リリースのロールバックと削除

リリースをupgradeすると、そのリビジョン番号が増加します。 内部的には、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

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

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という新しいディレクトリが作成されます。

例-チャート/
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で定義されます。 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および--debughelm installに渡すことができます。

  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がそれらを見つけるのにどのように役立つかを学びました。 また、新しいカスタムチャートを作成し、リリースリビジョンと、必要に応じてロールバックする方法について学習しました。

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