APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Azure Container Registry(ACR)でHelmチャートを共有する

今回のテーマは 「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.sh

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チャートの作成方法が主眼ではないので、あまり内容に深入りせずいくつかを用途に合わせてちょっとだけ修正しました。 内容は 以下のものです。

github.com

作成したチャートがちゃんと動くものか念の為確認します。

サンプルとして適用するコンフィグレーションがこちらです。(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で記述されています。

docs.microsoft.com

【注意事項】 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チャートと組み合わせていきます)

それではまた次回。