Helm を使って Kubernetes のアプリケーションをデプロイする

ここまで、KubernetesK8sクラスタのアプリケーションをデプロイする際には、アプリケーションの設定内容を記述したマニフェストファイルを作成し、 kubectl コマンドで適用していました。しかしながら、設定ファイルごとに kubectl コマンドを実行するため、一括での管理が難しくなり、コマンドの実行もれが起こる可能性もあります。 今回は、K8s クラスタのアプリケーション管理を簡単にしてくれる Helm というツールを紹介します。

Helm の概要

f:id:linkode-okazaki:20200623174147p:plain

  • Helm 公式サイト
  • Helm は K8s クラスタ用のパッケージ管理マネージャです。
    • パッケージ管理マネージャは、 aptyum のように、ソフトウェアの依存関係をパッケージ管理ツールが解決し、インストールやアップデート、アンインストールが簡単に行えるツールです。
    • このように、Helm では、K8s クラスタのすべてのリソースと依存関係をパッケージ化して管理します。
  • 具体的な機能は以下のとおりです。
    • Chart と呼ばれる設定ファイルに基づく各種リソースの自動作成
    • デプロイされたアプリケーションの削除・更新といった管理
    • リポジトリで公開されている Chart の検索やダウンロード、インストール
    • Chart のパッケージ化やリポジトリへのアップロード
  • Helm では直接イメージ自体は扱わず、Chart のみをリポジトリで管理します。
  • 「stable」や「incubator」という名称の公式リポジトリが提供されているほか、Helm Hubサードパーティによるリポジトリが多く提供されており、利用することが出来ます。

f:id:linkode-okazaki:20200623174152p:plain

Helm をローカル環境で使ってみる

  • まずは、ローカル環境で Helm を用いたデプロイを試してみます。
$ kubectl get node -o wide
NAME       STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE               KERNEL-VERSION   CONTAINER-RUNTIME
minikube   Ready    master   63d   v1.18.3   192.168.64.3   <none>        Buildroot 2019.02.10   4.19.107         docker://19.3.8
  • まずは、 こちらを参考に Helm をインストールします。
    • macOS では Homebrew からインストール可能です。
$ brew install helm
$ helm version
version.BuildInfo{Version:"v3.2.3", GitCommit:"8f832046e258e2cb800894579b1b3b50c2d83492", GitTreeState:"clean", GoVersion:"go1.13.12"}
  • 最新版をインストールすると、上記の通り、v3 系統が入ります。
    • v2 系統と v3 系統ではアーキテクチャが変わっているため、インターネット上の記事を読む場合は注意が必要です。
    • 本記事では、v3 系統を前提として話を進めます。
  • 公開されている Chart を使ってアプリケーションをデプロイするために、公式の stable リポジトリを追加します。
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
  • 試しに、WordPress をデプロイしてみます。下記のコマンドでリポジトリに登録されている Chart を検索できます。
$ helm search repo wordpress
NAME                CHART VERSION   APP VERSION DESCRIPTION
stable/wordpress    9.0.3            5.3.2        DEPRECATED Web publishing platform for building...
  • 上記の結果を基に、 stable/wordpress の Chart を「wordpress」という Release 名でデプロイします。
  • デプロイが完了すると、そのアプリケーションに関するメモなどを含む「NOTES」が表示されます。
$ helm install wordpress stable/wordpress
WARNING: This chart is deprecated
NAME: wordpress
LAST DEPLOYED: Tue Jun 23 15:42:39 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated

Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).

The Bitnami repository is already included in the Hubs and we will continue providing the same cad
(以下省略)
  • デプロイされた Release の一覧は helm list で確認できます。
$ helm list
NAME        NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
wordpress   default     1          2020-06-23 15:42:39.938909 +0900 JST  deployed    wordpress-9.0.3   5.3.2
  • ここで、クラスタ上に Pod 等が作成されていることを確認します。
    • WordPress のアプリケーション事態のみならず、必要な DB の Pod や Service もデプロイされていることがわかります。
$ kubectl get po,deploy,cm,svc
NAME                             READY   STATUS    RESTARTS   AGE
pod/wordpress-5667d74df4-z4qtf   2/2     Running   1          16m
pod/wordpress-mariadb-0          2/2     Running   0          16m

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress   1/1     1            1           16m

NAME                                        DATA   AGE
configmap/wordpress-mariadb                 1      16m
configmap/wordpress-mariadb-tests           1      16m

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/details             ClusterIP      10.99.129.73     <none>        9080/TCP                     12d
service/kubernetes          ClusterIP      10.96.0.1        <none>        443/TCP                      67d
service/wordpress           LoadBalancer   10.106.135.229   <pending>     80:32035/TCP,443:31393/TCP   16m
service/wordpress-mariadb   ClusterIP      10.98.137.134    <none>        3306/TCP                     16m
  • サンプルページが表示できることを確認します。Minikube を利用している場合は、以下のコマンドで接続先 IP アドレスを確認できます。ポート番号は先ほどの kubectl get の LoadBalancer Service に記載されているものを利用します。
$ minikube ip
192.168.64.3
  • 上記の結果から、 http://192.168.64.3:32035 にブラウザからアクセスすると WordPress のサンプルページが表示されます。

f:id:linkode-okazaki:20200623174157p:plain

  • デプロイされたアプリケーションを削除する場合は、 helm uninstall コマンドを利用します。
$ helm uninstall wordpress
release "wordpress" uninstalled

Amazon EKS で Helm を利用する

  • 次に、EKS 上のクラスタに Helm を用いてアプリケーションをデプロイします。
  • あらかじめ EKS クラスタを作成しておきます。
$ eksctl create cluster \
  --name helm-sample \
  --region us-east-2 \
  --nodes 2 \
  --nodes-min 2 \
  --nodes-max 2 \
  --node-type t2.micro
  • EKS での Helm の利用については、EKS の公式ドキュメントに書かれている通り、ローカル環境に Helm コマンドがインストールされていれば、利用できます。
  • 先程と同様に、 helm install を用いて WordPress をデプロイします。
$ helm install wordpress stable/wordpress
WARNING: This chart is deprecated
NAME: wordpress
LAST DEPLOYED: Tue Jun 23 17:14:12 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
This Helm chart is deprecated
(以下省略)

$ helm list
NAME        NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
wordpress   default     1          2020-06-23 17:14:12.547709 +0900 JST  deployed    wordpress-9.0.3   5.3.2
  • Pod や Service を確認します。
$ kubectl get po,deploy,cm,svc
NAME                             READY   STATUS    RESTARTS   AGE
pod/wordpress-7b7b8d7cf6-nbrnn   0/1     Running   0          103s
pod/wordpress-mariadb-0          1/1     Running   0          102s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/wordpress   0/1     1            0           104s

NAME                                DATA   AGE
configmap/wordpress-mariadb         1      104s
configmap/wordpress-mariadb-tests   1      104s

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP                                                              PORT(S)                      AGE
service/kubernetes          ClusterIP      10.100.0.1       <none>                                                                   443/TCP                      11m
service/wordpress           LoadBalancer   10.100.16.161    XXXXX.us-east-2.elb.amazonaws.com   80:30306/TCP,443:30964/TCP   104s
service/wordpress-mariadb   ClusterIP      10.100.246.110   <none>                                                                   3306/TCP                     104s
  • Amazon EKS でデプロイした場合、 LoadBalancer が作成されたことにより、自動的に ELB が作成され、 EXTERNAL-IP が発行されます。ここに書かれているアドレスにブラウザからアクセスすると、先ほどと同様に WordPress のサンプル画面が立ち上がります。

f:id:linkode-okazaki:20200623174201p:plain

まとめ

  • Kubernetes クラスタ用のパッケージ管理マネージャである Helm を使ってみました。
    • マニフェストファイルの作成・管理の煩わしさを低減させ、運用負担を減らしてくれます。
  • 既存の Chart を改良・修正したり、新たな Chart を作成するなどして思い通りのアプリケーションのデプロイが出来るようになります。
    • Chart の作り方等はまた別の機会に取り組んでみようと思います。

参考資料