プリインストールまたはハイパフォーマンスのシナリオでは、複雑な状況におけるスケーリングの利便性を高めるために、オペレーティングシステムイメージをカスタマイズしたい場合があります。Alicloud Image Builder を使用してカスタム オペレーティングシステムイメージを構築し、このイメージに基づいてノードプールを作成できます。Alicloud Image Builder は、ノードのプロビジョニング速度を向上させ、自動スケーリングのパフォーマンスを最適化できます。
前提条件
ACK クラスタが作成されていること。詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
kubectl クライアントが ACK クラスタに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
カスタムイメージの利点
ACK ノードプールは、ノードの自動スケーリングをサポートしています。ノードプールを作成するときに、Alibaba Cloud Linux や CentOS などの OS イメージを選択できます。これらの OS イメージは、ほとんどのシナリオの要件を満たしています。ただし、プリインストールまたはハイパフォーマンスが必要なシナリオでは、これらのイメージはビジネス要件を満たせない場合があります。Alibaba Cloud は、Alicloud Image Builder を提供して、カスタム OS イメージを構築し、複雑なシナリオでの自動スケーリングを容易にします。
Alicloud Image Builder を使用してカスタムイメージを作成するには、Job または CronJob を作成して、ACK クラスタでイメージ構築タスクを分散できます。
Job を作成してカスタム OS イメージを迅速に構築する
この例では、build-config という名前の ConfigMap と build という名前の Job を使用して、Alicloud Image Builder を使用してカスタム OS イメージを迅速に構築する方法を示します。
ステップ 1:OS イメージのパラメーターを設定する
build-config という名前の ConfigMap を作成して、OS イメージのパラメーターを指定します。
build-config.yaml という名前の YAML ファイルを作成し、次の内容をファイルに追加します。
次の表にパラメーターを示します。
表 1. Alicloud Image Builder パラメーター
パラメーター
例
説明
variables{"<variable1>":"<value>"}variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}
Alicloud Image Builder によって使用される
変数です。説明access_keyパラメーターとsecret_keyパラメーターを使用して指定された AccessKey ペアなどの機密情報を構成ファイルに書き込むと、情報が漏洩する可能性があります。データセキュリティを確保するために、AccessKey ペアを変数として指定できます。変数の値は、ランタイムの入力値に基づいています。builders{"type":"<value>"}builders{"type":"alicloud-ecs"}
イメージ
ビルダーです。type パラメーターが aliyun-ecs に設定されている場合、一時的な Elastic Compute Service (ECS) インスタンスが作成されてイメージが構築されます。ECS インスタンスは、イメージが構築された後に自動的に解放されます。provisioners{"type":"<value>"}provisioners{"type":"shell"}
一時インスタンスで実行される操作を指定するために使用されるイメージ
プロビジョナーです。type パラメーターが shell に設定されている場合、シェル プロビジョナーが使用されます。Linux インスタンスが接続された後、シェルコマンドが自動的に実行されます。たとえば、yum install redis.x86_64 -yコマンドを実行して Redis をインストールできます。プロビジョナーの構成方法の詳細については、このトピックの「プロビジョナーの構成」セクションをご参照ください。
表 2. イメージ構築パラメーター
パラメーター
例
説明
必須/オプション
access_keyyourAccessKeyID
カスタムイメージの作成に使用される AccessKey ID。詳細については、「AccessKey ペアの作成」をご参照ください。
必須
secret_keyyourAccessKeySecret
カスタムイメージの作成に使用される AccessKey シークレット。
必須
regioncn-beijing
カスタムイメージがデプロイされるリージョン。
必須
image_nameack-custom_image
カスタムイメージの名前。名前はグローバルに一意である必要があります。
必須
source_imagealiyun_2_1903_x64_20G_alibase_20200904.vhd
カスタムイメージの作成元となる Alibaba Cloud パブリックイメージの ID。作成されたカスタムイメージには、パブリックイメージと同じオペレーティングシステムが含まれています。詳細については、「OS イメージの概要」トピックの「ACK でサポートされている OS イメージ」セクションをご参照ください。
必須
instance_typeecs.c6.xlarge
source_image パラメーターで指定されたベースイメージから作成される ECS インスタンスのインスタンスタイプ。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
クラスターの Kubernetes バージョン。
必須
PRESET_GPUtrue
起動を高速化するために GPU ドライバーをプリインストールするかどうかを指定します。
オプション
NVIDIA_DRIVER_VERSION460.91.03
プリインストールされた GPU ドライバーのバージョン。このパラメーターを指定しない場合、デフォルト値の 460.91.03 が使用されます。
オプション
OS_ARCHamd64
CPU アーキテクチャ。有効な値:amd64 および arm64。
必須
MOUNT_RUNTIME_DATADISK
true
事前にキャッシュされたアプリケーション依存関係を持つカスタムイメージを使用する場合、ECS インスタンスのランタイム中に動的データディスクの接続を有効にするには、このパラメーターを true に設定します。
オプション
重要ノードプールにカスタムイメージを指定する前に、ノードプールの構成がカスタムイメージのビルド設定と同じであることを確認してください。そうでない場合、カスタムイメージから作成されたノードをクラスターに追加できません。ノードプールの構成には、クラスターバージョン、クラスターリージョン、コンテナーランタイム、GPU アクセラレーテッドインスタンスタイプが含まれます。
カスタムイメージを確認するときは、カスタムイメージと同じビルド設定を使用する通常のノードプールを選択してください。カスタムイメージを使用してノードを作成し、ノードをノードプールに追加した後、アプリケーションがノード上で期待どおりに実行できるかどうかを確認してください。
次のコマンドを実行して、クラスターに Alicloud Image Builder をデプロイします。
kubectl apply -f build-config.yaml
ステップ 2:カスタム OS イメージを構築するための Job を作成する
次の YAML テンプレートを使用して、AccessKey ペアを使用するアカウントに権限を付与します。
次のコマンドを実行して、AccessKey ペアの暗号化文字列を生成します。
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 を実行するための変数を構成します。指定されたインスタンスタイプの ECS インスタンスは、ベースイメージから作成され、カスタムイメージの構築に使用されます。インスタンスタイプは instance_type パラメーターで指定され、ベースイメージは source_image パラメーターで指定されます。ECS インスタンスは、AccessKey ペアが属する Alibaba Cloud アカウントに属します。次に、システムはプロビジョナーの構成を実行し、ECS インスタンスによって構築されたイメージをカスタムイメージとして指定されたリージョンにプッシュします。カスタムイメージも、AccessKey ペアが属する Alibaba Cloud アカウントに属します。
Job をデプロイし、イメージの構築を開始します。
kubectl apply -f build.yaml
ステップ 3:(オプション)イメージ構築ログを表示する
イメージ構築プロセス中にログが生成されます。ログには、パラメーターの確認、一時リソースの作成、ソフトウェアのプリインストール、ターゲットリソースの作成、一時リソースの解放など、すべてのイメージ構築操作が記録されます。イメージ構築ログを表示するには、次の手順を実行します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[Job] ページで、作成した Job を見つけ、[アクション] 列の [詳細] をクリックします。[ログ] タブをクリックして、イメージ構築ログを確認します。
プロビジョナーの構成
プロビジョナーは、オペレーティングシステムが OS イメージにパッケージ化される前に、実行中のオペレーティングシステムにソフトウェアをインストールおよび構成するために使用されるコンポーネントです。プロビジョナーは、多くの場合、次のシナリオでイメージにソフトウェアをインストールするために使用されます。
ソフトウェアをインストールします。
カーネルにパッチを適用します。
ユーザーを作成します。
アプリケーション コードをダウンロードします。
カスタム Alibaba Cloud Linux 3 イメージをビルドします。
シェルスクリプトを実行する
"provisioners": [{
"type": "shell",
"script": "script.sh" // シェルスクリプトのパスを指定します。
}]Ansible を使用してオーケストレーションスクリプトを実行する
"provisioners": [
{
"type": "ansible",
"playbook_file": "./playbook.yml" // プレイブックのパスを指定します。
}
]CPFS クライアントをインストールする
Cloud Paralleled File System (CPFS) のインストールには、複数のパッケージが必要です。これらのパッケージの一部はリアルタイムコンパイルを伴うため、インストールに時間がかかる場合があります。カスタムイメージを使用すると、多数のノードに CPFS クライアントをインストールするコストを削減できます。
ARM ベースのイメージをビルドする
GPU アクセラレーションノードの OS イメージをカスタマイズする
CPU アクセラレーションノードに GPU ドライバーがプリインストールされたイメージをデプロイすることはできません。
アプリケーションイメージをシステムイメージに追加する
マウントされたデータディスクを持つ ECS インスタンスをノードプールに追加すると、ディスクの初期化が発生し、事前に保存されているアプリケーションイメージが削除されます。カスタムイメージから 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", // ランタイムを containerd に設定します。
"export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします。
"export KUBE_VERSION=1.30.1-aliyun.1", // Kubernetes のバージョンを指定します。
"export OS_ARCH=amd64", // OS アーキテクチャを 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", # アプリケーションイメージをシステムイメージに追加します。
"mv /var/lib/containerd /var/lib/container/containerd" # イメージファイルをデータディスクに移動します。
]
}
]
}ノードプールを設定する際に、データディスクのスナップショットを含むカスタムイメージを設定すると、システムは対応するデータディスクのスナップショットを自動的に関連付けます。

コンテナーランタイムが 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.com // Docker レジストリにログインします。docker loginコマンドが成功すると、/root/.dockerディレクトリに config.json という名前の証明書が作成されます。
config.json という名前の証明書ファイルに基づいて ConfigMap を作成します。
apiVersion: v1 kind: ConfigMap metadata: name: docker-config // ConfigMap の名前 data: config.json: |- // 証明書の内容 { "auths": { "registry.cn-beijing.aliyuncs.com": { // レジストリアドレス "auth": "xxxxxxxxxxxxxx" // 認証情報 } }, "HttpHeaders": { "User-Agent": "Docker-Client/19.03.15 (linux)" } }ConfigMap をポッドにマウントするようにジョブの YAML テンプレートを変更します。

次の図の内容を build-config ConfigMap に追加します。

ジョブを実行します。
イメージの同時アップロード数とダウンロード数の最大値を指定する
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のウィンドウで、 を選択します。
管理するノードプールを見つけて、その名前をクリックします。[概要] タブをクリックします。[ノードプール情報] セクションで、[Auto Scaling グループ] フィールドの横にあるハイパーリンクをクリックします。
表示されたページで、[インスタンス構成ソース] タブをクリックします。管理するスケーリング設定を見つけて、[アクション] 列の [編集] をクリックし、[OK] をクリックします。
[スケーリング設定の変更] ページで、パラメーターを変更し、[詳細設定] をクリックして詳細設定を表示します。[インスタンスユーザーデータ] ボックスのデータを記録します。Base64 を使用して [インスタンスユーザーデータ] ボックスのデータをデコードします。
データをデコードした後、デコードされたデータの末尾に次のコードを追加します。
yum install -y jq // jq をインストールします。 echo "$jq '. += {"max-concurrent-downloads": 20,"max-concurrent-uploads": 20}' /etc/docker/daemon.json" > /etc/docker/daemon.json // daemon.json ファイルを変更します。 service docker restart // Docker サービスを再起動します。
変更されたデータを Base64 でエンコードし、[インスタンスユーザーデータ] ボックスの元のデータを変更されたデータで上書きします。[変更] をクリックします。表示されるダイアログボックスで、[変更] をクリックします。
カスタム Alibaba Cloud Linux 3 イメージをビルドする
カスタム Red Hat Enterprise Linux 9 (RHEL 9) イメージをビルドする
次の手順
カスタム イメージを使用してノードプールを作成できます。詳細については、「ノードプールの作成と管理」をご参照ください。
カスタム イメージに基づいてノードをスケーリングする方法の詳細については、「ノードの自動スケーリングを有効にする」をご参照ください。