今回のテーマは 「Helm」
Helmとは
みなさん、AKS(Kubernetesに)にアプリケーションをデプロイする際の定義ファイル(Yamlファイル)はどのように作成していますか? 1つ2つのアプリケーションであれば、それぞれのアプリケーション用のYamlを書くのが手軽です。
開発用/ステージング用/本番用とちょっとだけ設定項目を変える場合ならば Kustomize を利用するのもよいかもしれません。
しかし、複数のアプリケーションを何度もデプロイしていると、 「いつも同じ内容書いているなー」とか、「Api Versionの更新や内容を1箇所でまとめたいなー」とか、 「組織内で統一的に管理していきたいなー」と考えることが増えてくると思います。こうしたときに利用できるのがHelmです。
Ingress Controllerや Istio/Daprなど、各種OSSをご利用になられた方は 何度かhelmによるインストールを体験したことがあると思います(このブログ記事の中でも何度か利用しています)。 Helmはアプリケーションをデプロイするためのいくつかの定義ファイル(Yaml)をテンプレートとしてまとめ、アプリケーションのデプロイを 容易に実行できるようにするKubernetes用パッケージマネージャーです。
多くの場合はOSSをインストールする際にご利用になっていると思いますが、もちろん自作もできます。
Helmを共有する際の課題
Helmを利用することで自作アプリケーション等のインストールも容易になってきますが、多くのアプリケーション/プロジェクトに展開する際に課題に なるのが、「どのように共有するか」です。 Helmのチャートを直接Git/GitHubで共有するか、package化したtgzファイルを配布するか、やり方はいくつかありますが、プロジェクトや部署をまたいで共有するとなると 今ひとつな感じもします。
そんな中で開発されてきたのが OCI(Open Container Initiative) Image を使った共有です。OCI Imageは従来の言葉で簡単にいってしまえば (オープン化された)Docker Imageの仕様ですが、実はコンテナランタイムの実行だけではなくツールのコンフィグレーションやスクリプトなどを 共有することができるようになります。 HelmもチャートのOCI対応が行われ、バージョン3.8.0でGAとなりました(2022年7月時点の最新は3.9)
Azure Container Registry(ACR)ももちろんOCI成果物リポジトリとして対応しています。
前置きが長くなりましたが、今回はHelm chartをACRにプッシュしそれを利用してhelm CLIでアプリケーションをデプロイしてみようと思います。
Helmチャートを自作する
共有するためのHelmチャートを作らなければ始まりません。まずは簡単に作成していきます。
Helmのインストール
なにはともあれ、 helm cliをインストールしましょう。 Helm公式ページで各種プラットフォーム向けのインストール方法が紹介されているのでそれに従えば簡単にインストールできます。
Helmチャートの作成
最初に helm create <名称>
と実行します。
今回、Spring-Bootを使ったアプリケーション向けのチャートを作ろうと考えたので、フォルダ名称をspring-bootとしています。
すると以下のようなファイルを自動的に作成してくれます。
# helm create NAME [flags] helm create spring-boot # 作成結果 tree . ├── README.md └── spring-boot ├── Chart.yaml ├── charts ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── service.yaml │ ├── serviceaccount.yaml │ └── tests │ └── test-connection.yaml └── values.yaml
個々の内容は公式ドキュメントに譲ります。こちらの内容を更新して、自作のチャートを作成していきます。
Helmチャートの作成方法が主眼ではないので、あまり内容に深入りせずいくつかを用途に合わせてちょっとだけ修正しました。 内容は 以下のものです。
作成したチャートがちゃんと動くものか念の為確認します。
サンプルとして適用するコンフィグレーションがこちらです。(sample.yaml)
image: repository: turtle2005/aggregator tag: 1.0.0 service: type: LoadBalancer
デプロイしてみましょう。
# spring-boot/ と指定している部分がローカルのチャートを参照している helm upgrade aggregator --install spring-boot/ \ --namespace apps --create-namespace \ --values sample.yaml
デプロイできていそうなので先に進みます。
ACRにチャートをプッシュする
ACRにチャートをプッシュするために helm registry loginを実行しなければなりませんが、そのためにはちょっと準備が必要です。 詳細はMicrosoft Docsで記述されています。
【注意事項】 az CLIで
az acr helm
というコマンドをサポートしていますがこちらはhelm v2のもので、現在はdeprecateされておりまもなく削除の予定です。 こちらの記事で行っているように、helm (v3)のCLIをご利用ください。
今回、ユーザーログイン情報を使ってPushやPullを実施したいと思います。 az acr login --expose-token
を使ってAccessTokenを取得します。
そのAccessTokenをパスワードとして、helm registry loginを実行します。
PASSWORD=$(az acr login --name $ACR_NAME --expose-token --output tsv --query accessToken) echo -n $PASSWORD | helm registry login $ACR_NAME.azurecr.io \ --username 00000000-0000-0000-0000-000000000000 --password-stdin
これでhelmでACRにプッシュできるようになりましたので実際にプッシュしていきたいと思います。
helm package spring-boot
helm packageコマンドでローカルフォルダspring-bootにあるチャートをtgzファイルにまとめます。出力されるファイル名は spring-boot/Chart.ymlに指定された内容に従います。
filename format : [name]-[version].tgz
Chart.yamlの内容は以下のようになっていますのでファイル名は spring-boot-app-0.1.0.tgz
となります。
apiVersion: v2 name: spring-boot-app description: A Helm chart for Spring boot application type: application version: 0.1.0 appVersion: "1.0.0"
出来上がったファイルを ACR にプッシュします。対象に oci://[host]
と指定するのがポイントです。
helm push spring-boot-app-0.1.0.tgz oci://$ACR_NAME.azurecr.io/helm # 内容確認 az acr repository show -n $ACR_NAME --repository helm/spring-boot-app { "changeableAttributes": { "deleteEnabled": true, "listEnabled": true, "readEnabled": true, "teleportEnabled": false, "writeEnabled": true }, "createdTime": "2022-07-25T04:53:49.8597697Z", "imageName": "helm/spring-boot-app", "lastUpdateTime": "2022-07-25T04:58:20.1337505Z", "manifestCount": 2, "registry": "your-acr-name.azurecr.io", "tagCount": 1 }
az acr
コマンドでプッシュができていることが確認できました。
ACRからチャートをプルする
再度helmで動作確認したいと思います。
helm upgrade aggregator --install oci://$ACR_NAME.azurecr.io/helm/spring-boot-app \ --version 0.1.0 \ --namespace apps --create-namespace \ --values sample.yaml
ローカル環境と違うところは oci://$ACR_NAME.azurecr.io/helm/spring-boot-app
の指定とversion指定です。
こちらも問題なくデプロイできるようです。これでACRでHelmチャートの共有ができるようになりました。
まとめ
アプリケーションをMicroservice化すると、どうしてもデプロイ対象が増えてきます。また複数のチームにまたがって同じものを何度も 記述するような状況が生まれてきます。そうしたときに如何にして簡略化するか、管理を統一するかが肝になってきます。 今回ご紹介したACRによるHelmチャートの共有もそうしたシーンでご利用いただけるものとなっています。
できてしまえば「あれ、これだけ?」なものですが、なかなかトライする機会もないかと思います。今回、「こんなことできるんだねー」ということを 感じていただければ幸いです。
今回使用したソースコード・定義ファイルは以下のGitHubリポジトリで公開しています。
また、今回の内容は「AKSでGitOps(Flux v2)を使う」に関連する内容でもありますので、ぜひご記憶いただければと思います。 (次の機会にこのHelmチャートと組み合わせていきます)
それではまた次回。