この記事は Microsoft Azure Tech Advent Calendar 2023 の 24 日目の記事になります🎅
こんにちは。Azure テクニカル サポートチームの桐井です。
Ignite 2023 で、ACR/AKS 関連の機能としてArtifact Streaming が発表されました。
本記事では、Artifact Streaming を使って ACR にあるコンテナー イメージを AKS クラスターにデプロイする様子を紹介します。
Artifact Streaming は 2023/12 現在、プレビュー機能として提供されております。
今後のアップデートにより、将来この記事で紹介した内容から変更される可能性があることを何卒ご了承ください!
Artifact Streaming とは
ご参考) Public preview: Artifact streaming support in Azure Kubernetes Service (AKS)
https://azure.microsoft.com/ja-jp/updates/public-review-artifact-streaming-support-in-azure-kubernetes-service-aks/
コンテナー イメージは、データの実体を表す複数のレイヤー
と、イメージに含まれるレイヤーの情報をまとめたマニフェスト
によって構成されています。
通常、コンテナー化されたアプリケーションを起動するには、コンテナー イメージの Pull (ダウンロードと展開) が必要になります。
イメージの Pull では次のような処理が行われます:
- コンテナー レジストリにアクセスし、マニフェストからレイヤーの情報を取得する
- レイヤーのダウンロードが必要か確認する (ローカル キャッシュが利用できるか確認する)
- 各レイヤーをダウンロードする
- ダウンロード済みのレイヤーを展開する
- コンテナーを起動する
このように、コンテナーの起動に至るまでには、イメージを構成するレイヤーのダウンロードと展開の処理が必要となります。
そのため、レイヤーのデータ サイズが大きい場合や、レイヤー数が多いコンテナー イメージの場合は、コンテナーが起動するまでに時間を要すことがあります。
特に、Pod のオートスケールをするシナリオでは、Pod の起動時間がオートスケールの速度に影響を与えます。
また、クラスター オートスケーラーによってノードが削減され、その後新規ノードが追加された場合には、ノード内のコンテナー イメージのキャッシュが利用できません (AKS ではノードプールの スケールダウン モードが Delete
の場合)。
新規ノードでは、コンテナー イメージのダウンロードと展開が再び必要となってしまうため、Pod の起動完了までに時間を要する要因となってしまいます。
これらの問題は、Artifact Streaming を利用することで、解決を図ることができます。
Artifact Streaming を利用すると、コンテナー イメージ全体のダウンロードと展開を待つことなく、コンテナーを開始できます。
Artifact Streaming を試してみよう
実際に AKS クラスターへコンテナー イメージをデプロイして、Artifact Streaming によってイメージの Pull 時間が変化するかを試してみましょう。
今回の検証では、コンテナー イメージとして docker.io/jupyter/all-spark-notebook:latest
を使用します。
AKS にデプロイをする前に、まずは手元の PC でイメージの Pull を試してみます。
次のように、多数のレイヤーによって構成されているコンテナー イメージであることがわかります。
1 | docker pull docker.io/jupyter/all-spark-notebook:latest |
Artifact Streaming を使用する準備
本記事の手順は、次のドキュメントに記載されている手順に沿っています。
ドキュメントをあわせてご参照ください。
Azure Kubernetes Service (AKS) の成果物ストリーミングを使用してイメージのプル時間を短縮する (プレビュー)
https://learn.microsoft.com/ja-jp/azure/aks/artifact-streaming
Artifact Streaming を利用するために、Azure Container Registry (ACR) のリポジトリを設定していきます。
はじめに、今回利用するコンテナーイメージを ACR にインポートします。
1 | az acr import -n {ACR_NAME} \ |
イメージのインポートが完了したら、Artifact Streaming を作成します。
作成にはしばらく時間がかかります。
1 | az acr artifact-streaming create -n {ACR_NAME} \ |
az acr artifact-streaming create
コマンドを実行すると、作成の進捗を確認するためのコマンド例が表示されます。az acr artifact-streaming operation show
コマンドで進捗が確認できます。
1 | az acr artifact-streaming operation show -n {ACR_NAME} \ |
Artifact Streaming の作成が完了したら、レジストリに存在する Artifact Streaming の一覧を確認してみましょう。az acr manifest list-referrers
コマンドに、レジストリ名とイメージ名を指定して実行します。"artifactType"
が "application/vnd.azure.artifact.streaming.v1"
となっていますね。
1 | az acr manifest list-referrers -r {ACR_NAME} \ |
続いて AKS 側の設定をします。
Artifact Streaming を利用するには、Artifact Streaming オプションを有効化した AKS ノードプールが必要になります。
az aks nodepool add
コマンドに --enable-artifact-streaming
オプションを付与して、新しいノードプールを追加します。
1 | az aks nodepool add \ |
ここでは acrtest
という名前でノードプールを追加しました。kubectl get nodes
コマンドでノードの一覧を表示すると、新しいノードが追加されていることが確認できます。
1 | kubectl get nodes |
これで ACR と AKS の準備は完了です!
AKS へのデプロイを試してみる
準備したコンテナー イメージを AKS クラスターにデプロイして、Artifact Streaming によってイメージの Pull 時間が短縮されているか確かめてみましょう。
検証では、Artifact Streaming が無効のノードプールと、有効のノードプールのそれぞれに、同じコンテナー イメージを使用する Deployment をデプロイします。
Artifact Streaming が無効の場合
nodeSelector
を使用して、Artifact Streaming が無効のノードプールに Pod をデプロイします。
1 | apiVersion: apps/v1 |
YAML マニフェストをクラスターにデプロイします。jupyter-79c4469c65-5cfpf
Pod が生成されました。
1 | kubectl get pods -o wide |
kubectl describe pod
コマンドの結果から、Events フィールドのメッセージを確認します。
Pulled
イベントでは、Successfully pulled image "{イメージ名}" in 1m25.27926119s
のようにメッセージが表示されています。
イメージの Pull に 1分25秒 ほど要したようです。
1 | kubectl describe pod jupyter-79c4469c65-5cfpf |
Artifact Streaming が有効の場合
続いて Artifact Streaming を利用した場合の動作を確認してみましょう。
nodeSelector
を使用して、Artifact Streaming が有効のノードプールに Pod をデプロイします。
Pod 名やコンテナー名を変更していますが、使用するコンテナー イメージは先ほどと同じ {ACR_NAME}.azurecr.io/jupyter/all-spark-notebook:latest
です。
1 | apiVersion: apps/v1 |
YAML マニフェストをクラスターにデプロイします。jupyter-artifact-streaming-5b58c9c797-pxs4l
Pod が生成されました。デプロイ先を指定したので、acrtest
ノードプールのノードにデプロイされていますね。
1 | kubectl get pods -o wide |
kubectl describe pod
コマンドの結果から、Events フィールドのメッセージを確認します。
Pulling
イベントでは、Streaming enabled for "{イメージ名}"
のようにメッセージが表示されており、Artifact Streaming が利用されていることが確認できます。
また、Pulled
イベントでは、Successfully pulled image "{イメージ名}" in 3.442267417s
のようにメッセージが表示されています。
およそ 3.44 秒ほどでイメージ Pull が完了しました!
1 | kubectl describe pod jupyter-artifact-streaming-5b58c9c797-pxs4l |
Artifact Streaming を使わない場合では 1分25秒 ほど要したため、大幅に短縮されていますね!
Artifact Streaming を削除するには?
az acr artifact-streaming delete
というコマンドは存在しないようです。
作成した Artifact Streaming を削除したい場合には、リポジトリに存在するイメージ自体を削除します。
イメージの削除にともない Artifact Streaming も一緒に削除されます。
1 | az acr repository delete -n {ACR_NAME} --repository jupyter/all-spark-notebook |
どのようなしくみなのか?
Artifact Streaming を使うと、なぜイメージ Pull の時間が短縮されるのでしょうか?
Artifact Streaming では、OverlayBD イメージ フォーマットというオープンソースのソリューションを利用しています。
ご参考) containerd/overlaybd
https://github.com/containerd/overlaybd
ご参考) containerd/accelerated-container-image
https://github.com/containerd/accelerated-container-image
OverlayBD は、アリババクラウドのコンテナーイメージ加速技術プロジェクト DADI で開発されました。
DADI: Alibaba Cloud’s Open-Source Accelerated Container Image Technology
https://www.alibabacloud.com/blog/dadi-alibaba-clouds-open-source-accelerated-container-image-technology_597956
OverlayBD は、コンテナー イメージのレイヤーを仮想ブロック デバイスとして提供し、オーバーレイ ファイルシステムとしてマウントします。
コンテナーは、オーバーレイ ファイルシステムを通してイメージのデータにアクセスをします。
コンテナーの起動前にイメージ全体をダウンロードや展開することなく、必要なデータのみをネットワーク経由でオンデマンドに読み込むことができます。
ネットワーク ドライブに保存されたファイルを、手元のマシンに一度ダウンロードしてから開くのではなく、SMB/CIFS でマウントして直接開く様子に似ていますね。
Pod がデプロイされたノードにログインし、df
コマンドを実行すると、出力結果の中に io.containerd.snapshotter.v1.overlaybd
の文字列が含まれていることが確認できます。
1 | root@aks-acrtest-29138108-vmss000000:/# df -h | grep overlaybd |
さいごに
本記事では、Artifact Streaming の概要と、実際に AKS クラスターへコンテナーをデプロイした様子を紹介しました。
サイズの大きいコンテナー イメージを使用する Pod で起動時間を短縮したい場合に、利用を検討してみると良さそうです。
今回紹介しました Artifact Streaming が、今後の技術選定や AKS をよりご活用いただくうえでのご参考になりましたら幸いです。
Artifact Streaming は2023年12月現在、パブリック プレビューとして提供されております。ご利用いただきました際にお気づきの点やご要望などがございました際は、お気兼ねなくフィードバックいただけましたら幸いでございます。
また、AKS のご利用において、お困りの点やご不明点がありました際は、いつでも Azure サポートまでお気兼ねなくご相談ください。
最後まで読んでいただきありがとうございました!
Microsoft Azure Tech Advent Calendar 2023 は明日が最終日となります。是非ご覧くださいー!
本年は多くのお客様にお世話になりました。ありがとうございました。
来年もみなさまにとって素晴らしい年でありますように、心よりお祈り申し上げます。
※本情報の内容(添付文書、リンク先などを含む)は、作成日時点でのものであり、予告なく変更される場合があります。