Kubernetes では、アプリケーション管理が最も難しく、かつ需要の高い領域です。 Helm プロジェクトは統一されたソフトウェアパッケージングメソッドです。バージョン管理をサポートし、Kubernetes アプリケーションの配布とデプロイの複雑性が大幅に簡素化されます。

Alibaba Cloud Container Service では、アプリケーションカタログ管理機能を Helm ツールと連携し、機能を拡張しています。また、公式リポジトリをサポートし、迅速にアプリケーションをデプロイできます。 Container Service コンソールまたはコマンドラインから、アプリケーションをデプロイできます。

このドキュメントでは、Helm の基本的な概念と使い方を紹介し、Helm を使用して、WordPress と Spark のサンプルアプリケーションを Alibaba Cloud Kubernetes クラスターにデプロイする方法を説明します。

Helm の基本概念

Helm は Deis によって作られたオープンソースのツールで、Kubernetes アプリケーションのデプロイと管理を簡素化することができます。

Helm は Kubernetes 用に作成したアプリケーションの検出、共有、利用を容易にする Kubernetes パッケージ管理ツールとみなすことができます。 Helm にはいくつかの基本概念があります。

  • チャート: アプリケーションの実行に必要なイメージ、依存関係、リソース定義を含む Helm パッケージです。 また、Homebrew の formula、APT の dpkg、または Yum の rpm ファイルと同様、Kubernetes クラスターのサービス定義を含む場合もあります。
  • リリース: Kubernetes クラスターで実行するチャートです。 チャートは、同じクラスターに何度でもインストールすることができます。 新しいリリースは、チャートがインストールされるたびに作成されます。 たとえば、2 つのデータベースをサーバー上で実行するために、MySQL チャートを 2 度インストールすることができます。 それぞれのインストールで、独自のリリース名を持ったリリースが作成されます。
  • リポジトリ: チャートの公開と保存のためのリポジトリです。

Helm のコンポーネント

Helm はクライアント/サーバーアーキテクチャを採用しており、以下のコンポーネントから構成されます。

  • Helm CLI は Helm クライアントで、ローカルまたは Kubernetes クラスターのマスターノードで実行できます。
  • Tiller はサーバーコンポーネントで、Kubernetes クラスター上で実行されます。 Tiller は Kubernetes アプリケーションのライフサイクルを管理します。
  • リポジトリはチャートリポジトリです。 Helm クライアントは HTTP プロトコルを使用して、リポジトリ内のチャートインデックスファイルとパッケージにアクセスします。

Helm によるアプリケーションのデプロイ

前提条件

  • Helm を使用してアプリケーションをデプロイする前に、Alibaba Cloud Container Service で Kubernetes クラスターを作成します。 詳細は、「Kubernetes クラスターの作成」をご参照ください。

    Kubernetes クラスターが作成されると、Tiller は自動的にクラスターにデプロイされます。 Helm CLI はすべてのマスターノードに自動的にインストールされ、Alibaba Cloud チャートリポジトリを指し示すよう設定されています。

  • クラスターの Kubernetes バージョンを確認します。

    Kubernetes バージョンが 1.8.4 以降のクラスターのみサポートされます。 Kubernetes バージョンが 1.8.1 のクラスターは、[クラスターリスト] ページで [クラスターのアップグレード] を行ってください。

Container Service コンソールでのアプリケーションのデプロイ

  1. Container Service コンソール にログインします。
  2. Kubernetes の左側のナビゲーションウィンドウで、[ストア] > [アプリのカタログ] をクリックします。
  3. [アプリのカタログ] ページで、チャート (この例では、WordPress) をクリックして、チャートの詳細ページに移動します。
  4. 右側でデプロイメントの基本情報を入力します。
    • クラスター: アプリケーションがデプロイされるクラスターを選択します。
    • 名前空間: 名前空間を選択します。デフォルトでは、"default" が選択されています。
    • リリース名: アプリケーションのリリース名を入力します。 この例では、"test" と入力します。
  5. [値] タブをクリックして、設定を変更します。
    この例では、クラウドディスクの動的データボリュームを、永続ストレージボリューム要求 (PVC) にバインドします。 詳しくは、以下をご参照ください。
    あらかじめ、クラウドディスクの永続ストレージボリューム (PV) を作成する必要があります。 PV の容量は、PVC によって定義された値より小さくすることはできません。
  6. 設定が完了したら、[デプロイ] をクリックします。 デプロイの成功後、アプリケーションのリリースページにリダイレクトされます。
  7. 左側のナビゲーションウィンドウで、 [ディスカバリとロードバランシング] > [サービス] をクリックします。 対象となるクラスターと名前空間を選択して、対応するサービスを検索します。 HTTP/HTTPS 外部エンドポイントアドレスを取得できます。
  8. 上記のアクセスアドレスをクリックして、WordPress ブログ公開ページに移動します。

コマンドラインによるアプリケーションのデプロイ

コマンドラインを使用してアプリケーションをデプロイする場合、Kubernetes クラスターのマスターノードに SSH ログインできます (Helm CLI は自動的にインストールされ、リポジトリを設定します)。 詳細は、「SSH を使用した Kubernetes クラスターへのアクセス」をご参照ください。 kubectl と Helm CLI をローカルにインストールし、設定することもできます。

この例では、kubectl と Helm CLI をローカルにインストールして設定し、WordPress アプリケーションと Spark アプリケーションをデプロイします。

kubectl と Helm CLI のインストールと設定

  1. kubectl をローカルコンピューターにインストールし、設定します。

    詳細は、「kubectl を利用した Kubernetes クラスターへの接続」をご参照ください。

    対象となる Kubernetes クラスターの情報を表示するには、kubectl cluster-info コマンドを入力します。

  2. Helm をローカルコンピューターにインストールします。

    インストール方法については、『Install Helm』をご参照ください。

  3. Helm リポジトリを設定します。 ここでは、Alibaba Cloud Container Service のチャートリポジトリを使用します。
    helm init --client-only --stable-repo-url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts/
    helm repo add incubator https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
    helm repo update

Helm の基本操作

  • クラスターにインストールされたチャートのリストを表示するには、以下のコマンドを入力します。

    helm list

    または、短縮形を使用できます。

    helm ls

  • リポジトリの設定を表示するには、以下のコマンドを入力します。

    helm repo list

  • リポジトリ内の Helm チャートを表示または検索するには、以下のいずれかのコマンドを入力します。
    helm search 
    helm search repository name #For example, stable or incubator.
    helm search chart name #For example, wordpress or spark.
  • チャートリストを更新して、最新バージョンを取得するには、以下のコマンドを入力します。

    helm repo update

Helm の使い方について詳しくは、『Helm ドキュメント』をご参照ください。

Helm による WordPress のデプロイ

Helm を使用して、WordPress のブログの Web サイトをデプロイします。

以下のコマンドを入力します。

helm install --name wordpress-test stable/wordpress
Alibaba Cloud Kubernetes サービスは、ブロックストレージの動的ストレージボリューム (クラウドディスク) をサポートしています。 あらかじめ、クラウドディスクのストレージボリュームを作成する必要があります。

結果は以下のようになります。

NAME: wordpress-test
LAST DEPLOYED: Mon Nov 20 19:01:55 2017
NAMESPACE: default
STATUS: DEPLOYED
...

以下のコマンドを使用して、WordPress のリリースとサービスを表示します。

helm list
kubectl get svc

以下のコマンドを使用して、WordPress 関連のポットを表示ます。ステータスが [Running] に変わるまで待ってください。

kubectl get pod

以下のコマンドを使用して、WordPress のアクセスアドレスを取得します。

echo http://$(kubectl get svc wordpress-test-wordpress -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

上記の URL にブラウザからアクセスします。一般的な WordPress Web サイトが表示されます。

チャートの指示に従い、以下のコマンドを使用して WordPress Web サイトの管理者アカウントとパスワードを取得できます。

echo Username: user
echo Password: $(kubectl get secret --namespace default wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}" | base64 --decode)

WordPress アプリケーションを完全に削除するには、以下のコマンドを入力します。

helm delete --purge wordpress-test

Helm による Spark のデプロイ

Helm を使用して、ビッグデータ処理用 Spark をデプロイします。

以下のコマンドを入力します。

helm install --name myspark stable/spark

結果は次のとおりです。

NAME: myspark
LAST DEPLOYED: Mon Nov 20 19:24:22 2017
NAMESPACE: default
STATUS: DEPLOYED
...

以下のコマンドを使用して、Spark のリリースとサービスを表示します。

helm list
kubectl get svc

以下のコマンドを使用して、Spark 関連のポッドを表示し、ステータスが [Running] に変わるまで待ってください。 Spark 関連のイメージは大きいため、イメージの取り出しには時間がかかります。

kubectl get pod

以下のコマンドを使用して、Spark Web UI のアクセスアドレスを取得します。

echo http://$(kubectl get svc myspark-webui -o jsonpath='{.status.loadBalancer.ingress[0].ip}'):8080

上記の URL にブラウザからアクセスします。Spark Web UI が表示され、現在 3 つのワーカーインスタンスが存在することが示されます。

次に、以下のコマンドで、Helm を使用して Spark アプリケーションをアップグレードし、ワーカーインスタンスの数を 3 から 4 に変更します。 パラメーター名は大文字と小文字が区別されます。

helm upgrade myspark --set "Worker.Replicas=4" stable/spark

結果は以下のようになります:

Release "myspark" has been upgraded. Happy Helming!
LAST DEPLOYED: Mon Nov 20 19:27:29 2017
NAMESPACE: default
STATUS: DEPLOYED
...

以下のコマンドを使用して、新しく追加された Spark のポッドを表示し、ステータスが [Running] になるまで待ってください。

kubectl get pod

ブラウザで Spark Web UI を更新します。 ワーカーインスタンスの数が 4 になっています。

Spark アプリケーションを完全に削除するには、以下のコマンドを入力します。

helm delete --purge myspark

サードパーティのチャートリポジトリの使用

事前設定された Alibaba Cloud チャートリポジトリのほかに、サードパーティのチャートリポジトリも使用できます (ネットワークにアクセスできることを確認してください)。 以下のコマンド形式で、サードパーティのチャートリポジトリを追加します。

helm repo add repository name repository URL
helm repo update

Helm 関連のコマンドについては、『Helm ドキュメント』をご参照ください。

参考資料

Helm はコミュニティーを急成長させています。 Bitnami など、ますます多くのソフトウェアプロバイダーが高品質のチャートを提供し始めています。 既存のチャートは、https://kubeapps.com/ で検索できます。