Trending keywords: security, cloud, container,

Kubernetes における Helm とは?概要とよく使うコマンドを解説

SHARE:

Helm はオープンソースのパッケージマネージャで、Kubernetes 用のソフトウェアのデプロイをシンプルかつ一貫性のある方法で自動化します。また、Kubernetes 用のアプリケーションを簡単にパッケージ化して、簡単なコマンドでデプロイできます。

サードパーティのユーティリティであるため、Kubernetes 自体に組み込まれていませんが、Kubernetes を操作する際に利用できる非常に便利なツールの 1 つです。

この記事では、Helm を使用する目的、Helm チャートの作成方法、よく使用される Helm のコマンドなど、Helm について知っていておいて欲しい内容を取り上げます。

関 連 記 事

Kubernetesとは?Kubernetesセキュリティ
の基礎
Kubernetesアーキテクチャの
設計方法
AWSのEKS
(Elastic Kubernetes Service)
Kubernetesの
クラスターとは?
 
Kubernetes のノードとは?
KubernetesのPodとは?KubernetesのHelmとは?クラウドセキュリティと
ランタイムインサイト

Helmとは?

Helmとは、Kubernetesを管理するオープンソースのパッケージマネージャーです。アプリケーションの定義・保存・管理に活用できるツールとして、複雑なKubernetesアプリケーションを簡単にインストールしたり、バージョン管理したりなどの操作ができます。

なお、「Helm」は英語で「舵」を意味します。その意味の通り、船の舵を取るようにKubernetesのアプリケーションを制御することが可能です。

Helm の仕組み

Helm では、「Helm チャート」と呼ばれる特殊なファイルを作成します。このファイルには Kubernetes にアプリケーションをデプロイするのに必要なデータが含まれています。次に Helm CLI ツールまたは Web ベースの UI を使用して、任意の Kubernetes クラスターに Helm チャートをインストールします。

Helm apt dnf のような Linux パッケージ管理ツールと似ています。またアプリケーションを手早く簡単に選択してインストールできるという意味では、アプリストアに相当するとも言えるでしょう。

Helm が使用される理由

Helm だけが Kubernetes にアプリケーションをインストールする手段ではありません。使用しない場合、Pod 仕様を手動で作成してインストールできます。この仕様では特に、デプロイする 1 つまたは複数のコンテナを定義します。次に、kubectl でその仕様を適用してアプリケーションをデプロイします。

ただし、手動でのアプローチではかなりの作業が求められます。アプリケーションの更新時には必ずこのプロセスを繰り返す必要があり、アプリケーションを停止する必要があれば、デプロイを手動でシャットダウンしなければなりません。

また、アプリケーションを手動でデプロイする場合、アプリケーションをサードパーティと簡単に共有することができません。Kubernetes クラスターにアプリケーションをインストールする場合は、アプリのコンテナイメージおよび YAML の仕様を個別に取得して適用する必要があるでしょう。

Helm では YAML を使用して Kubernetes アプリケーションのリソースを定義し、アプリケーションをクラスター内に自動的にデプロイすることで、こうしたすべての課題に対処します。フラグを指定すれば、アプリケーションの一部を選んでインストールすることもできます。また、改訂履歴がネームスペースで保持されるためロールバックも簡単です。

このように、Helm を活用すると Kubernetes 管理者の時間を節約するだけでなく、開発者が Kubernetes アプリケーションをさらに効率的にデプロイできるようになります。さらに、アプリケーションの更新とアップグレードも簡単に自動化できます。

Helm のチャートとテンプレート

前述のとおり、Helm チャートとは、Kubernetes のリソースを定義した 1 つまたは複数のテンプレートが格納されたディレクトリです。Helm チャートには、チャートの実行時にユーザーに表示するヘルプテキストファイルなどを追加することも可能です。テンプレートとは Kubernetes のマニフェストであり、アプリケーションのデプロイやその他のワークロードを定義します。たとえば、ごく基本的なテンプレートは以下のようになります:

apiVersion: v1
 kind: ConfigMap
 metadata:
   name: mychart-configmap
 data:
   myvalue: "Hello World"Code language: JavaScript (javascript)

チャートでは、特定の Helm チャートとともにインストールする依存関係を指定することもできます。

Helm のストレージ

Helm チャートは、ご使用のコンピュータに直接保存してローカルでホストできます。ただし、Helm チャートはリポジトリに保存して簡単にアクセスできるようにするのが一般的です。Helm リポジトリを使用することで、コンテナレジストリからコンテナイメージをダウンロードするのと同様のプロセスでチャートをダウンロードできます。

Helm チャートとオペレータの違い

Helm チャートとオペレータの動作は似ていますが、Kubernetes における機能は異なるため、混同しないことが重要です。

オペレータはアプリケーション固有のコントローラであり、Kubernetes API を使用して Kubernetes のリソース構成を作成、管理します。オペレータを使用してアプリケーションをインストールすることもできます(実際にその多くで Helm をバックグラウンドで稼働させています)。しかし、オペレータの主な用途は、Kubernetes クラスターの特殊で複雑な構成の管理や、クラスターコンポーネント自体を含めたアプリケーションのライフサイクル管理です。オペレータは、サーバー構成を変更して技術的な詳細を抽象化するのに使用される、高水準の自動化言語にある程度似ています。

一方、Helm の主な目的は個々のアプリケーションのインストールと管理であり、Kubernetes 環境そのものではありません。したがって Helm チャートは構成のスクリプトというより、Debian または RPM パッケージに近いと言えるでしょう。

Helm の一般的なコマンド

おそらく最もよく使用する Helm のコマンドは、Helm チャートのインストールや管理に使うシンプルなコマンドです。一般的なコマンドの例を以下に示します。

Helm リポジトリを追加する

リポジトリにある Helm チャートを最も簡単に使用するには、次のようなコマンドを使ってリポジトリをローカルの環境に追加します:

helm repo add example-repo https://charts.example.comCode language: JavaScript (javascript)

利用できるチャートを一覧表示する

クラスターにインストールできる Helm チャートを確認するには、まず、以下のコマンドでチャートのリストを更新します:

helm repo update

次に、以下のコマンドを使用して、利用できるチャートを一覧表示します:

helm search repo

Helm チャートをインストールする

helm install application-name chart

Helm チャートをアンインストールする

インストールしたチャートをアンインストールするには以下のコマンドを使用します。

helm uninstall release-name

Helm リリースを一覧表示する

Helm リリース」とは、インストールしてクラスターで実行している Helm チャートの既存のインスタンスです。そのため、チャート名ではなく、リリース名を指定します。この情報は Kubernetes のネームスペースに保存されるため、クラスターへの接続に使用する可能性があるディレクトリやサーバーからは独立しています。リリース名は、リストにある次のコマンドで確認可能です。。

クラスターで実行している Helm リリースを一覧表示します:

helm listCode language: PHP (php)

Helm チャートをアップグレードする

Helm チャートを新しいバージョンへアップグレードします:

helm upgrade release-name chart-name

Helm を活用したデプロイの例

Helm チャートの使い方と Helm の自動化の活用方法をさらに詳しく把握するため、Helm を使用したアプリケーションのインストールと設定について実際の例を見てみましょう。具体的には、Helm を使用してオープンソースのセキュリティツールである Falco をインストールします。

Falco のインストールは非常にシンプルです。次のようにして、Falco のリポジトリからチャートを取得してインストールするだけです:

helm install --name cncf-falco stable/falco

これで Falco が起動します。構成をカスタマイズしたい場合は、インストール時に構成を自動的に微調整するのが最善の方法です。以下のようにコマンドを実行します:

helm install --name cncf-falco
 --set falco.jsonOutput=true
 --set falco.jsonIncludeOutputProperty=true
 --set falco.programOutput.enabled=true
 --set falco.programOutput.program=""jq '{text: .output}' | curl -d @- -X POST [https://hooks.slack.com/services/see_your_slack_team/apps_settings_for/a_webhook_url](https://hooks.slack.com/services/see_your_slack_team/apps_settings_for/a_webhook_url)""
 stable/falcoCode language: PHP (php)

このコマンドにより、Falco によって異常な行動が検出されると、毎回 Slack にメッセージが送信されるようになります。

このプロセスをさらにシンプルにするには、以下のようにして YAML ファイル内に構成データを保存します。

falco:
   jsonOutput: true
   jsonIncludeOutputProperty: true 

  programOutput:
     enabled: true
     program: "jq '{text: .output}' | curl -d @- -X POST [https://hooks.slack.com/services/see_your_slack_team/apps_settings_for/a_webhook_url](https://hooks.slack.com/services/see_your_slack_team/apps_settings_for/a_webhook_url)"Code language: JavaScript (javascript)

次に、インストール時に当該ファイル(次の例で「values.yaml」という名前のファイル)を指定します。

helm install --name cncf-falco -f values.yaml stable/falco

つまり、Helm の利点はインストールと設定のプロセスを簡素化、自動化することにあります。適切に活用できなければ、インストールや設定を行う際に多数のコマンドとファイルを駆使する必要が生じるでしょう。

Helm のセキュリティに関するベストプラクティス

Kubernetes の複雑なインストール作業の自動化は Helm の優れた点ですが、Helm をむやみに使用すると重大なセキュリティリスクを生み出す可能性があります。以下の対策を実施してリスクを最小限に抑えてください:

  • 信頼できる Helm チャートのみを使用する: 信用できないコンテナイメージをダウンロードすべきではないのと同様、Helm チャートは信頼のおける組織やリポジトリからのみデプロイしてください。
  • 使用している Helm チャートを把握する: クラスター内で実行されている Helm リリースを常に追跡します。管理者が複数いる大規模なクラスターでは、インストールした Helm チャートの管理がおろそかになることがよくあります。こうした状況では、実行しているソフトウェアや対処すべき脆弱性を把握できず、セキュリティリスクが生まれやすくなります。
  • 使用していないリリースをアンインストールする: 使っていない Helm リリースは、アンインストールしてください。不要なリリースがあると、リソースの無駄になるだけでなく、攻撃対象領域が増える原因にもなります。
  • Helm Helm チャートをアップグレードする: Helm 自体(Helm ユーティリティ)だけでなく、クラスターにデプロイしている Helm リリースも必ずアップグレードします。

まとめ

Helm を使えばパッケージのインストールと管理が簡単になり、Kubernetes 管理者の負担を大幅に軽減できます。ソフトウェアのインストールだけでなくアップグレードやカスタマイズまで、Helm の自動化機能をフル活用している組織であれば、効果を強く実感できるでしょう。