コンテナイメージは圧縮されたレイヤーとして保存されます。コンテナを起動する際、ランタイムはコンテナが実行可能になる前にすべてのレイヤーをダウンロードして解凍します。ただし、ほとんどのビジネスシナリオでは、コンテナランタイムが実際に必要とするのはコンテナイメージ内のデータの一部にすぎません。大規模なイメージの場合、この不要なダウンロードが起動時間の大半を占めてしまいます。
Container Service for Kubernetes (ACK) は、Disaggregated Infrastructure 向けデータアクセラレーター (DADI) を使用したコンテナイメージの遅延読み込みをサポートしています。DADI では、事前にフルイメージをプルする代わりに、コンテナが実際に必要とするデータのみを読み込み、その場で解凍します。
Docker Hub の 1.34 GB の NodeBB イメージを使用した場合、遅延読み込みによりイメージプルフェーズが 36 秒から 4 秒に短縮され、アプリケーション全体の起動時間が 38 秒から 9 秒に短縮されます。
上記のイメージプル時間は参考値です。実際のパフォーマンスはイメージサイズやネットワーク条件によって異なります。
制限事項
| 制約項目 | 要件 |
|---|---|
| クラスタータイプ | ACK マネージドクラスターのみ。 |
| クラスターバージョン | 1.26 以降。詳細については、「クラスターの手動アップグレード」をご参照ください。 |
| ノードランタイム | containerd 1.6.34 以降。詳細については、「ノードプールの更新」をご参照ください。 |
| DADI モード | フルモードのみ。インデックス専用モードはサポートされていません。 |
重要な動作 — ノードプールでコンテナイメージアクセラレーションを有効または無効にしても、その後に追加されたノードにのみ影響します。 既存のノードに変更を適用するには、ノードをノードプールから削除して再度追加してください。詳細については、「ノードの削除」および「既存ノードの追加」をご参照ください。
前提条件
作業を開始する前に、以下の条件を満たしていることを確認してください。
-
Kubernetes 1.26 以降を実行し、ノードランタイムとして containerd 1.6.34 以降を使用している ACK マネージドクラスター
-
イメージリポジトリへのアクセス権(ACR Enterprise Edition(標準またはプレミアム)または自己管理型レジストリのいずれか)
-
クラスターへの
kubectlアクセス権
ステップ 1:アクセラレートイメージの取得
アクセラレートイメージは DADI フォーマットを使用します。既存のイメージは、ACR Enterprise Edition の組み込み変換機能(推奨)またはオープンソースの DADI ツールを使用して変換できます。
オプション 1:ACR Enterprise Edition の使用(推奨)
ACR Enterprise Edition(標準またはプレミアム)は、リポジトリレベルで自動的にイメージを変換します。イメージをプッシュすると、ACR は元のイメージを変更せずにアクセラレートコピーを作成します。アクセラレートイメージは同じ名前空間とリポジトリ名を使用し、タグに _accelerated が追加されます(例:latest → latest_accelerated)。
詳細および制限事項については、「コンテナイメージの遅延読み込み」をご参照ください。
-
Container Registry コンソールにログインし、リージョンを選択します。
-
左側のナビゲーションウィンドウで [インスタンス] をクリックします。[インスタンス] ページで、Enterprise Edition インスタンスの名前をクリックします。
-
左側のナビゲーションウィンドウで、[リポジトリ] > [リポジトリ一覧] を選択します。
-
リポジトリ名をクリックします。[詳細] ページの左上隅で [編集] をクリックします。
-
[設定の変更] ダイアログボックスで、[アクセラレートイメージ] を有効にし、[フルモード] を選択して、[確認] をクリックします。この変更後にプッシュされたイメージは、自動的に変換タスクをトリガーします。変換完了時に通知を受け取るには、式
_accelerated$を使用してイベント通知を設定してください。詳細については、「イベント通知」をご参照ください。
オプション 2:オープンソース DADI ツールの使用
DADI イメージコンバーター を使用して、手動でイメージを変換します。
-
overlaybd スナップショッターをインストールします。
# ご利用のインスタンスアーキテクチャ向けのパッケージをダウンロードします。 wget https://github.com/containerd/accelerated-container-image/releases/download/v1.2.3/overlaybd-snapshotter-1.2.3-20241016090917.0c2f057.x86_64.rpm rpm -ivh overlaybd-snapshotter-1.2.3-20241016090917.0c2f057.x86_64.rpm -
overlaybd ブロックデバイスレイヤーをインストールします。
# ご利用のインスタンスアーキテクチャ向けのパッケージをダウンロードします。 wget https://github.com/containerd/overlaybd/releases/download/v1.0.13/overlaybd-1.0.13-20240821.a117098.el8.x86_64.rpm rpm -ivh overlaybd-1.0.13-20240821.a117098.el8.x86_64.rpm -
イメージを変換します。以下の例では、ACR リポジトリ内のイメージを変換します。自己管理型レジストリを使用する場合は、イメージアドレスと認証情報を適宜更新してください。
プレースホルダー 説明 user:passwordレジストリの認証情報 xxxxx-registry.cn-hangzhou.cr.aliyuncs.com/default/redisソースイメージリポジトリのアドレス latestソースイメージタグ ( -i)latest_obd_new出力イメージタグ ( -o)/opt/overlaybd/snapshotter/convertor \ -u user:password \ -r xxxxx-registry.cn-hangzhou.cr.aliyuncs.com/default/redis \ -i latest \ -o latest_obd_new以下のプレースホルダーを置き換えてください。
ステップ 2:ノードプールでのコンテナイメージアクセラレーションの有効化
新規および既存のノードプールの両方で コンテナイメージアクセラレーション がサポートされています。手順は若干異なります。
新規ノードプールでの有効化
-
ACK コンソールにログインし、左側のナビゲーションウィンドウで [クラスター] をクリックします。
-
クラスター名をクリックします。左側のナビゲーションウィンドウで [ノード] > [ノードプール] を選択します。
-
ノードプールの作成時、[詳細オプション] を展開し、[コンテナイメージアクセラレーション] を有効にします。
既存ノードプールでの有効化
-
ACK コンソールにログインし、左側のナビゲーションウィンドウで [クラスター] をクリックします。
-
クラスター名をクリックします。左側のナビゲーションウィンドウで [ノード] > [ノードプール] を選択します。
-
ノードプールを見つけ、[操作] 列の [編集] をクリックします。[詳細オプション] セクションで、[コンテナイメージアクセラレーション] を有効にし、画面の指示に従ってノードプールの ConfigMap を更新します。更新中は [ステータス] 列に Updating が表示され、完了すると Active になります。
ステップ 3:アクセラレートイメージを使用したアプリケーションのデプロイ
イメージプル認証情報の設定
DADI が遅延読み込み時にイメージレジストリに対して認証できるように、aliyun-acr-acceleration-suite コンポーネントをインストールします。
-
ACK コンソールにログインし、左側のナビゲーションウィンドウで [クラスター] をクリックします。
-
クラスター名をクリックします。左側のナビゲーションウィンドウで [アドオン] をクリックします。
-
[アドオン] ページの [その他] タブで aliyun-acr-acceleration-suite を見つけ、[インストール] をクリックします。
インストール後、レジストリタイプに応じてプル認証情報を設定します。
ACR Enterprise Edition: パスワード不要プラグインをインストールして、対象ワークロードに自動的にアクセス認証情報を注入します。これにより、シークレットの手動管理が不要になります。詳細については、「シークレットなしで ACR イメージをプルする」をご参照ください。
自己管理型レジストリ: タイプが kubernetes.io/dockerconfigjson のシークレットを作成し、アクセラレーションスイートが使用できるようにラベルを付与します。
# シークレットを作成します。
kubectl create secret docker-registry <SecretName> \
--docker-server=<RegistryVpcDomain> \
--docker-username=<UserName> \
--docker-password=<Password>
# DADI 用にシークレットにラベルを付与します。
kubectl label secrets <SecretName> images.alibabacloud.com/accelerated="true"
プライベートイメージをプルする際にシークレットが不要な場合は、この手順をスキップできます。
アプリケーションの作成
ノードセレクターを使用して、イメージアクセラレーションが有効なノードにポッドをスケジュールします。ラベル alibabacloud.com/image-accelerate-enabled: "true" は、アクセラレーションが有効なノードに自動的に適用されます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
alibabacloud.com/image-accelerate-enabled: "true" # イメージアクセラレーションが有効なノードにのみスケジュールします。
containers:
- name: test
image: xxxxx-registry.cn-hangzhou.cr.aliyuncs.com/default/redis:latest_obd_new # ご利用のアクセラレートイメージアドレスに置き換えてください。
command: ["sleep", "3600"]
マニフェストを適用します。
kubectl apply -f deployment.yaml
次のステップ
-
データディスクのスナップショットを使用してワークロードとノードの初期化を高速化するには、データディスクのスナップショットを使用して大規模モデルアプリケーションの起動を高速化する」をご参照ください。