Alicloud Image Builder でカスタム OS イメージを構築し、Container Service for Kubernetes (ACK) ノードプールのノードプロビジョニングを高速化します。
前提条件
-
ACK マネージドクラスターが作成されていること。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
カスタムイメージを使用したスケーリング
ACK のノードプールは、Alibaba Cloud Linux や CentOS などの組み込み OS イメージによる自動スケーリングをサポートしており、ほとんどのユースケースをカバーします。事前インストール済みソフトウェアや高性能な構成が必要なシナリオでは、Alicloud Image Builder を使用してカスタム OS イメージを構築します。
イメージのビルドタスクを Job または CronJob としてクラスターに送信します。
ACK Job を使用したカスタムイメージの構築
次の例では、build-config という名前の ConfigMap と image-builder という名前の Job を使用します。
手順1:ビルドパラメーターの設定
build-config という名前の ConfigMap を作成して、イメージビルドパラメーターを設定します。
-
build-config.yaml という名前のファイルを作成し、次の YAML コンテンツを記述します。
以下の表に、YAML パラメーターを示します。
表 1. Alicloud Image Builder 設定ファイルのパラメーター
パラメーター
例
説明
variables{"<variable1>":"<value>"}variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}
Alicloud Image Builder の
variablesです。説明設定ファイルに
access_keyやsecret_keyなどの機密情報をハードコーディングすると、セキュリティリスクが生じます。実行時に値を受け取る変数として定義してください。builders{"type":"<value>"}builders{"type":"alicloud-ecs"}
イメージビルダー (
builders) です。type が alicloud-ecs の場合、一時的な ECS インスタンスが作成されてイメージがビルドされ、その後解放されます。provisioners{"type":"<value>"}provisioners{"type":"shell"}
一時的なインスタンスでの操作を定義するイメージプロビジョナー (
provisioners) です。type が shell の場合、シェルスクリプトがインスタンス上で自動的に実行されます。たとえば、yum install redis.x86_64 -yを実行すると、Redis がインストールされます。「プロビジョナーの設定」をご参照ください。
表 2. イメージビルドパラメーター
パラメーター
例
説明
必須
access_keyyourAccessKeyID
AccessKey ID です。詳細については、「アクセスキーペアの取得」をご参照ください。
はい
secret_keyyourAccessKeySecret
AccessKey Secret です。
はい
regioncn-beijing
カスタムイメージのリージョンです。
はい
image_nameack-custom_image
カスタムイメージの名前です。既存のイメージの中で一意である必要があります。
はい
source_imagealiyun_2_1903_x64_20G_alibase_20200904.vhd
OS が一致する Alibaba Cloud パブリックイメージ ID です。詳細については、「ACK でサポートされている OS イメージ」をご参照ください。
はい
instance_typeecs.c6.xlarge
一時的なビルドインスタンスの ECS インスタンスタイプです。GPU イメージの場合は、GPU 高速化タイプを指定してください。
はい
RUNTIMEcontainerd
コンテナランタイムです。有効な値:
dockerおよびcontainerd。はい
RUNTIME_VERSION1.6.28
-
コンテナランタイムが docker の場合、デフォルトの
RUNTIME_VERSIONは 19.03.15 です。 -
コンテナランタイムが containerd の場合、デフォルトの
RUNTIME_VERSIONは 1.6.20 です。
はい
SKIP_SECURITY_FIXtrue
セキュリティ更新をスキップするかどうかを指定します。
はい
KUBE_VERSION1.30.1-aliyun.1
クラスターのバージョンです。
はい
PRESET_GPUtrue
起動を高速化するために GPU ドライバーをプリインストールするかどうかを指定します。
いいえ
NVIDIA_DRIVER_VERSION460.91.03
プリインストールする GPU ドライバーのバージョンです。デフォルト値:460.91.03。
いいえ
OS_ARCHamd64
CPU アーキテクチャです。有効な値:
amd64およびarm64。はい
MOUNT_RUNTIME_DATADISK
true
カスタムイメージにアプリケーションイメージがキャッシュされており、使用中にデータディスクを ECS インスタンスにマウントする必要がある場合は、true に設定してください。
いいえ
重要-
カスタムイメージをノードプールに割り当てる前に、ノードプールの設定 (クラスターバージョン、リージョン、コンテナランタイム、GPU インスタンスタイプ) がイメージビルド設定と一致していることを確認してください。一致していない場合、ノードはクラスターに参加できません。
-
検証するには、一致するパラメーターを持つ通常のノードプールにイメージを追加し、ワークロードが期待どおりに実行されることを確認してください。
-
-
作成した
build-config.yamlファイルを適用して、ConfigMap をクラスターにデプロイします。kubectl apply -f build-config.yaml
手順2:ビルド Job の作成
-
次のポリシーを使用して、必要な権限をアクセスキーペアに付与してください。
-
アクセスキーペアの Base64 エンコード文字列を生成してください。
echo -n "yourAccessKeyID" | base64 echo -n "yourAccessKeySecret" | base64 -
次の YAML を使用して、my-secret という名前の Secret を作成してください。
apiVersion: v1 kind: Secret metadata: name: my-secret namespace: default type: Opaque data: ALICLOUD_ACCESS_KEY: TFRI**************** # 前の手順で生成した Base64 エンコード文字列 ALICLOUD_SECRET_KEY: a0zY**************** -
build.yaml という名前のファイルに、次の YAML コンテンツを記述します。
この Job は、
source_imageから一時的な ECS インスタンスを作成し、provisionersスクリプトを実行してから、カスタムイメージを作成して指定されたリージョンにプッシュします。 -
Job をデプロイして、イメージのビルドを開始してください。
kubectl apply -f build.yaml
手順3: (オプション) ビルドログの表示
ビルドプロセスでは、パラメーターの検証、一時的なリソースの作成、ソフトウェアの事前インストール、クリーンアップなどの手順が記録されたログが生成されます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
Jobs のリストで、作成した Job を見つけます。アクション 列で 詳細 をクリックし、ログ タブをクリックしてビルドログを表示します。
プロビジョナーの設定
プロビジョナーは、実行中のマシンを OS イメージとしてキャプチャする前に、そのマシンにソフトウェアをインストールし、設定します。典型的なユースケースは次のとおりです:
-
ソフトウェアパッケージのインストール。
-
カーネルへのパッチ適用。
-
ユーザーの作成。
-
アプリケーションコードのダウンロード。
-
カスタム Alibaba Cloud Linux 3 イメージの構築。
シェルスクリプトの実行
"provisioners": [{
"type": "shell",
"script": "script.sh"
}]
Ansible プレイブックの実行
"provisioners": [
{
"type": "ansible",
"playbook_file": "./playbook.yml"
}
]
CPFS クライアントのインストール
CPFS クライアントのインストールには多くのパッケージとオンザフライコンパイルが必要であり、時間がかかる場合があります。カスタムイメージを使用すると、大規模なインストールコストを削減できます。
Arm アーキテクチャ用のカスタムイメージの構築
GPU ノード OS イメージの構築
カスタム GPU イメージとカスタム CPU イメージは併用できません。
アプリケーションイメージのキャッシュ
データディスクがアタッチされた ECS インスタンスをノードプールに追加すると、データディスクが初期化され、事前にキャッシュされたアプリケーションイメージが削除されます。これらを保持するには、カスタムイメージのビルド時にデータディスクスナップショットを作成します。
{
"variables": {
"image_name": "ack-custom_image",
"source_image": "aliyun_3_x64_20G_alibase_20240528.vhd",
"instance_type": "ecs.c6.xlarge",
"access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
"region": "{{env `ALICLOUD_REGION`}}",
"secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
},
"builders": [
{
"type": "alicloud-ecs",
"system_disk_mapping": {
"disk_size": 120,
"disk_category": "cloud_essd"
},
"image_disk_mappings": {
"disk_size": 40,
"disk_category": "cloud_auto"
}, # カスタムイメージを構築する際にデータディスクを設定します。イメージの構築後、プロセスは自動的にデータディスクのスナップショットを作成します。
"access_key": "{{user `access_key`}}",
"secret_key": "{{user `secret_key`}}",
"region": "{{user `region`}}",
"image_name": "{{user `image_name`}}",
"source_image": "{{user `source_image`}}",
"instance_type": "{{user `instance_type`}}",
"ssh_username": "root",
"skip_image_validation": "true",
"io_optimized": "true"
}
],
"provisioners": [
{
"type": "file",
"source": "scripts/ack-optimized-os-linux3-all.sh",
"destination": "/root/"
},
{
"type": "shell",
"inline": [
"export RUNTIME=containerd",
"export RUNTIME_VERSION=2.1.6",
"export SKIP_SECURITY_FIX=true",
"export KUBE_VERSION=1.30.1-aliyun.1",
"export OS_ARCH=amd64",
"export MOUNT_RUNTIME_DATADISK=true", # コンテナランタイムのファイルパスをデータディスクにマウントします。
"bash /root/ack-optimized-os-linux3-all.sh",
"ctr -n k8s.io i pull registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/pause:3.9", # アプリケーションイメージを OS イメージに組み込みます。
"mv /var/lib/containerd /var/lib/container/containerd" # イメージファイルをデータディスクに移動します。
]
}
]
}
ノードプールを設定する際、データディスクスナップショット付きのカスタムイメージを選択します。システムは、データディスクスナップショットが自動的にロードされることを通知します。ディスクタイプは ESSD AutoPL、容量は 120 GiB に設定され、バーストパフォーマンスとインスタンスに連動して解放のオプションがあります。ディスクは ext4 を使用してコンテナランタイム形式で初期化されます。データディスクの容量を変更した場合、ECS インスタンスの作成後にパーティションとファイルシステムを手動で拡張する必要があります。

プライベートレジストリからのプル (Docker)
docker login <image_address> -u user -p password
docker pull nginx
プライベートレジストリからのプル (containerd)
ctr -n k8s.io i pull --user=username:password nginx
ビルド中のプライベートレジストリからのプル
-
Docker がインストールされた Linux マシンで、
docker loginを実行して認証情報を生成します。docker login --username=zhongwei.***@aliyun-test.com --password xxxxxxxxxx registry.cn-beijing.aliyuncs.comdocker loginが成功すると、/root/.dockerディレクトリに config.json が作成されます。
-
生成された config.json から ConfigMap を作成します。
apiVersion: v1 kind: ConfigMap metadata: name: docker-config data: config.json: |- { "auths": { "registry.cn-beijing.aliyuncs.com": { "auth": "xxxxxxxxxxxxxx" } }, "HttpHeaders": { "User-Agent": "Docker-Client/19.03.15 (linux)" } } -
Job YAML を変更して、ConfigMap を Pod にマウントします。

-
build-config ファイルを次のように変更します。

-
Job を実行します。
イメージの同時アップロードとダウンロードの設定
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
-
対象のノードプールの名前をクリックします。基本情報 タブで、ノードプール情報 セクションを見つけ、Auto Scaling (ESS) スケーリンググループ の横にあるリンクをクリックします。
-
[インスタンス設定ソース] タブをクリックします。対象のスケーリング設定を見つけ、操作 列の 変更 をクリックし、次に OK をクリックします。
-
[スケーリング設定の変更] ページで、詳細設定 を展開し、ユーザーデータ の内容をコピーします。ユーザーデータ ボックスのデータを Base64 でデコードします。
-
ユーザーデータをデコードして変更します。
インスタンスのユーザーデータを Base64 でデコードし、スクリプトに次のコードを追加します。
このコードは
jqをインストールし、Docker デーモンの設定を更新して同時ダウンロードとアップロードを増やし、Docker を再起動します。yum install -y jq echo "$(jq '. += {"max-concurrent-downloads": 20,"max-concurrent-uploads": 20}' /etc/docker/daemon.json)" > /etc/docker/daemon.json service docker restart
-
データを再エンコードして更新します。
変更したスクリプトを Base64 でエンコードします。ユーザーデータ ボックスの内容をエンコードされた出力に置き換え、変更を確認 をクリックします。