kubernetesを使っているとアプリケーションを立ち上げるためにはPodやServiceやsvcなどをyaml形式で記載する必要があり、とても煩わしく感じます。
そのような煩わしさを解消するために、アプリケーションに必要なyamlファイル一式を取得してくれるパッケージマネージャー「Helm」というものがあるらしいです。
ということで、今回はHelmについて公式ページのイントロダクション using helmをやってみたのでご紹介いたします。
※kubernetes, Helmのインストールは本記事では解説していませんのでご注意ください。
Helmとは
Helmとはkubernetesのパッケージマネージャーで、RedHat系Linuxの「yum install パッケージ名」のようにコマンドでアプリケーションをインストールすることができます。
基本用語
用語 | 説明 |
リポジトリ | チャートが保管されている場所 (Helm チャートの公式リポジトリ stable やその他企業が公開しているリポジトリなどたくさんある。) |
チャート | helmのパッケージのことでアプリケーションのデプロイに必要なyamlファイルが纏った設計図。 |
リリース | helm installによってデプロイされたパッケージ。 |
プログラミングでいうと「クラス」=「チャート」、「インスタンス」=「リリース」というイメージらしいです。私はこの説明が最もしっくりきました。
前提条件
- kubernetesがインストールされていること。
- Helmがインストールされていること。
kubernetesとhelmのバージョンは以下の通りです。
※本検証環境は自宅サーバ上にkubernetesをインストールして実施しています。クラウド環境ではないです。
# kubectl version Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:56:40Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:48:36Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"} # helm version version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
リポジトリからチャートの検索方法
HelmではチャートをKubernetesにインストールし、インストールごとに新しいリリースを作成します。 また、新しいチャートを見つけるには、Helmチャートのリポジトリを検索します。
検索方法には以下の2つのタイプがあります。
公開されている複数のリポジトリから検索(hub)
hubを用いた検索では数十以上の異なるリポジトリからHelmのチャートを見つけることができます。
# helm search hub wordpress URL CHART VERSION APP VERSION DESCRIPTION \https://hub.helm.sh/charts/presslabs/wordpress-... 0.9.1 0.9.1 Presslabs WordPress Operator Helm Chart \https://hub.helm.sh/charts/presslabs/wordpress-... v0.9.1 v0.9.1 A Helm chart for deploying a WordPress site on ... \https://hub.helm.sh/charts/bitnami/wordpress 9.3.11 5.4.2 Web publishing platform for building blogs and ...
上記は、Helm hub上に存在するすべてのworpressのチャートを検索しています。フィルターが設定されていない場合は使用可能なすべてのチャートを表示します。
ローカルのリポジトリから検索(repo)
helm search repoは(helm repo addを使用して)ローカルのHelmに追加したリポジトリを検索します。 この検索はローカルデータ上で行われ、パブリックネットワークへの接続は必要ありません。
helm search repoを使用すると、すでに追加したリポジトリ内でチャートの名前を見つけることができます。
# helm search repo wordpress NAME CHART VERSION APP VERSION DESCRIPTION stable/wordpress 9.0.3 5.3.2 DEPRECATED Web publishing platform for building...
インストールするパッケージが見つかったら、helm installを使用してインストールできます。次は実際にパッケージをインストールしていきます。
パッケージのインストール
インストールコマンド
新しいパッケージをインストールするには、helm installコマンドを使用します。しかし、 その前にインストールされているパッケージがないことをhelm listコマンドで確認しておきましょう。
# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
helm installコマンドでは2つの引数を取ります。ユーザが設定するリリース名とインストールするチャートの名前です。例えば、stableリポジトリのmariadbをインストールするコマンドは以下のようになります。
# helm install happy-panda stable/mariadb WARNING: This chart is deprecated NAME: happy-panda LAST DEPLOYED: Sun Jun 14 15:10:34 2020 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: This Helm chart is deprecated ... To connect to your database: 1. Run a pod that you can use as a client: kubectl run happy-panda-mariadb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mariadb:10. 2. To connect to master service (read/write): mysql -h happy-panda-mariadb.default.svc.cluster.local -uroot -p my_database 3. To connect to slave service (read-only): mysql -h happy-panda-mariadb-slave.default.svc.cluster.local -uroot -p my_database To upgrade this helm chart: 1. Obtain the password as described on the 'Administrator credentials' section and set the 'rootUser.password' pa ROOT_PASSWORD=$(kubectl get secret --namespace default happy-panda-mariadb -o jsonpath="{.data.mariadb-root-p helm upgrade happy-panda stable/mariadb --set rootUser.password=$ROOT_PASSWORD
これで、mariadbのチャートがインストールされました。 チャートをインストールすると、新しいリリースオブジェクトが作成されることに注意してください。 上記のリリースはhappy-pandaという名前です。 (Helm側で名前を勝手に決めて生成してほしい場合は、リリース名を省略して–generate-nameを使用します。)
多くのチャートでは600Mを超えるサイズのDockerイメージが必要であり、kubernetesクラスタへのインストールに長い時間かかる場合があります。
それでは実際にmariadbのチャートがインストールされたことを確認してみましょう。
# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION happy-panda default 1 2020-06-14 15:10:34.9103335 +0900 JST deployed mariadb-7.3.14 10.3.22
リリース名がhappy-pandaのリストがあれば、インストールされています。
パッケージのアップグレードとロールバック
チャートの新しいバージョンがリリースされたとき、またはリリースの構成を変更したいときは、helm upgradeコマンドを使用します。
アップグレードでは、既存のリリースを取得し、提供された情報に従ってアップグレードします。 まずは現在のリリースの設定情報を取得してみましょう。
# helm get values happy-panda USER-SUPPLIED VALUES:
DBのユーザー名とパスワードを記載したhappy-panda.yamlを作成します。
# vi happy-panda.yaml db: user: test password: Passw0rd
上記の場合、happy-pandaリリースは同じチャートでアップグレードされます。以下のコマンドでアップグレードします。
# helm upgrade -f happy-panda.yaml happy-panda stable/mariadb
helm get valuesを使用して、新しい設定が有効になったかどうかを確認します。
# helm get values happy-panda USER-SUPPLIED VALUES: db: password: Passw0rd user: test
helm getコマンドは、クラスター内のリリースを確認するのに役立つツールです。 上記はhappy-panda.yamlからの新しい値がkubernetesクラスターにデプロイされたことを示しています。
試しにmariadbにログインしてみます。まずは、クラスタのIPアドレスを確認します。
# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE happy-panda-mariadb ClusterIP 10.0.118.1903306/TCP 90s happy-panda-mariadb-slave ClusterIP 10.0.130.75 3306/TCP 90s
mysqlコマンドで以下のようにログインすることができれば、デプロイ成功です。
※パスワードはインストール時に指定した「Pass0rd」となります。
$ mysql -u test -h 10.0.118.190 -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 32 Server version: 10.3.22-MariaDB-log Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
また、リリース時に予定どおりに機能しない場合は、helm rollback [リリース名] [リビジョン]を使用して前のリリースに簡単にロールバックできます。
# helm rollback happy-panda 1 Rollback was a success! Happy Helming! # helm get values happy-panda USER-SUPPLIED VALUES: db: password: Passw0rd user: test master: persistence: annotations: volume.kubernetes\.io/storage-class: nfs storageClass: nfs slave: persistence: annotations: volume.kubernetes\.io/storage-class: nfs storageClass: nfs
上記は、happy-pandaを最初のリリースバージョンにロールバックします。 リリースのバージョンは増分リビジョンです。 インストール、アップグレード、またはロールバックが発生する度に、リビジョン番号は1ずつ増加します。最初のリビジョン番号は常に1です。helm history [リリース名]を使用して、特定のリリースのリビジョン番号を確認できます。
パッケージのアンインストール
kubernetesクラスターからリリースをアンインストールするときは、helm uninstallコマンドを使用します。
# helm uninstall happy-panda release "happy-panda" uninstalled
これにより、リリースがクラスターから削除されます。 helm listコマンドを使用すると、happy-pandaリリースがアンインストールされたことがわかります。
# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
Helmの以前のバージョンでは、リリースが削除されるとその削除の記録が残りました。 Helm バージョン3では、削除によりリリースの履歴も削除されます。 削除後もリリースの履歴を保持する場合は、helm uninstall –keep-historyを使用します。 helm list –uninstalledを使用すると、–keep-historyフラグを使用したアンインストール済みのリリースのみが表示されます。
helm list –allは失敗または削除された履歴を含む(ただし–keep-historyが指定されている場合)、Helmが保持しているすべてのリリース履歴を表示します。
# helm list --all NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
リリースはデフォルトで削除されるようになったため、アンインストールされたリソースをロールバックすることはできなくなりました。
リポジトリの追加・一覧表示
Helm バージョン3には、デフォルトのチャートリポジトリが存在しなくなりました。 helm repoコマンドは、リポジトリを追加、一覧表示、および削除するコマンドを提供します。
helm repo listを使用して、設定されているリポジトリを確認できます。
# helm repo list NAME URL stable https://kubernetes-charts.storage.googleapis.com/
また、helm repo addを使用して新しいリポジトリを追加できます。
helm repo add dev https://example.com/dev-charts
まとめ
kubernetesのパッケージマネージャー「Helm」を公式ページのイントロダクションに沿って実施してみました。kubernetesで煩わしかったpod, service, svcなどのyamlファイルからはかなり解放されるのではないかと思いました。
次回はチャートのデフォルトオプション設定の見方やカスタマイズの仕方を記事にしたいと思います。
コメント