一部のプリインストール済みシナリオやパフォーマンス専有型シナリオでは、複雑な状況での弾性スケーリングを簡素化するために、オペレーティングシステム (OS) イメージをカスタマイズしたい場合があります。Alicloud Image Builder を使用してカスタム OS イメージをビルドし、このイメージに基づいてノードプールを作成できます。Alicloud Image Builder は、ノードのプロビジョニングを高速化し、ノードの自動スケーリングのパフォーマンスを最適化できます。
前提条件
Container Service for Kubernetes (ACK) クラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」をご参照ください。
kubectl クライアントが ACK クラスターに接続されていること。詳細については、「クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
伸縮性最適化カスタムイメージの必要性
ACK ノードプールは、ノードの自動スケーリングをサポートしています。ノードプール用に提供されている Alibaba Cloud Linux や CentOS などの OS イメージは、ほとんどのシナリオの要件を満たしています。しかし、一部のプリインストール済みシナリオやパフォーマンス専有型シナリオでは、ベースイメージがビジネスニーズを満たせない場合があります。Alibaba Cloud は、カスタム OS イメージをビルドし、複雑なシナリオでの弾性スケーリングを簡素化するのに役立つ Alicloud Image Builder を提供しています。
Alicloud Image Builder を使用してカスタムイメージを作成する場合、イメージビルドタスクをジョブまたは CronJob としてクラスターに送信できます。
ACK ジョブを使用したカスタム OS イメージの迅速なビルド
このトピックでは、`build-config` という名前の ConfigMap と `build` という名前のジョブワークロードを例として、Alicloud Image Builder を使用してカスタム OS イメージを迅速にビルドする方法を説明します。
1. OS イメージビルド用パラメーターの設定
`build-config` という名前の ConfigMap を作成して、OS イメージのビルド用パラメーターを設定できます。
次の YAML コンテンツを含む `build-config.yaml` という名前のファイルを作成します。
次の表に、上記の YAML コンテンツのパラメーターを説明します。
表 1. Alicloud Image Builder 設定ファイルのパラメーター
パラメーター
例
説明
variables{"<variable1>":"<value>"}variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}
Alicloud Image Builder が使用する変数 (
variables)。説明AccessKey ペア (
access_keyとsecret_keyを含む) などの機密情報を設定ファイルに書き込むと、情報が漏洩する可能性があります。意図しない漏洩を防ぐため、実行時に値を取得する変数として設定してください。builders{"type":"<value>"}builders{"type":"alicloud-ecs"}
イメージビルダー (
builders)。type を alicloud-ecs に設定すると、一時 ECS インスタンスが作成されてイメージがビルドされます。ビルドが完了すると、ECS インスタンスは自動的に破棄されます。provisioners{"type":"<value>"}provisioners{"type":"shell"}
イメージプロビジョナー (
provisioners) は、一時インスタンス内で実行される操作を定義します。type を shell に設定すると、シェルプロビジョナーが使用されます。これは、Linux インスタンスへの接続後にシェルコマンドが自動的に実行されることを意味します。たとえば、シェルコマンドyum install redis.x86_64 -yを実行して Redis をインストールします。プロビジョナーの設定の詳細については、「プロビジョナーの設定」をご参照ください。
表 2. イメージビルドパラメーター
パラメーター
例
説明
必須
access_keyyourAccessKeyID
ご利用の AccessKey ID。詳細については、「AccessKey ペアの取得」をご参照ください。
必須
secret_keyyourAccessKeySecret
ご利用の AccessKey Secret。
必須
regioncn-beijing
宛先カスタムイメージのリージョン。
必須
image_nameack-custom_image
宛先カスタムイメージの名前。名前はリージョン内で一意である必要があります。
必須
source_imagealiyun_2_1903_x64_20G_alibase_20200904.vhd
同じオペレーティングシステムを持つ Alibaba Cloud パブリックイメージの ID。詳細については、「ACK でサポートされている OS イメージ」をご参照ください。
必須
instance_typeecs.c6.xlarge
`source_image` から作成されたインスタンスは、指定されたプリインストールタスクを実行し、カスタムイメージを生成します。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 バージョン互換のインスタンスタイプなど、ノードプールの設定がカスタムイメージのビルド設定と一致していることを確認してください。一致しない場合、ノードをクラスターに追加できません。
カスタムイメージの検証フェーズでは、選択したパラメーターに一致する通常のノードプールを使用して検証します。ノードがノードプールに正常に追加された後、サービスが期待どおりに実行されることを確認してください。
次のコマンドを実行して、Alicloud Image Builder をクラスターにデプロイします。
kubectl apply -f build-config.yaml
2. カスタム OS イメージをビルドするジョブの作成
次の YAML コンテンツを使用して、AccessKey ペアに必要な権限を付与します。
次のコマンドを実行して、AccessKey ID と AccessKey Secret の暗号化された文字列を生成します。
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****************次の YAML コンテンツを含む build.yaml という名前のファイルを作成します。
ジョブを実行するための変数を設定します。プロセス中に、AccessKey ペアを所有するアカウントで、`source_image` から指定された `instance_type` の ECS インスタンスが作成されます。その後、プロビジョナーの設定が実行されます。プロセスが完了すると、ECS インスタンスを使用してイメージが生成され、そのイメージがカスタムイメージとして同じアカウントの指定されたリージョンにプッシュされます。
ジョブをクラスターにデプロイして、OS イメージのビルドを開始します。
kubectl apply -f build.yaml
3. (任意) カスタムイメージビルドログの表示
イメージのビルドプロセス中に操作ログが生成されます。ログには、パラメーターの検証、一時リソースの作成、ソフトウェアのプリインストール、ターゲットリソースの作成、一時リソースの解放など、ビルド中に実行されたステップが記録されます。次の手順を実行して、イメージのビルドログを表示できます。
「ジョブ」ページで、前のステップで作成したジョブを探し、[操作] 列の [詳細] をクリックします。詳細ページで、[ログ] タブをクリックしてイメージビルドログを表示します。
プロビジョナーの設定
プロビジョナーは、実行中のマシンを静的な 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 ノードシステムイメージのカスタマイズ
カスタム GPU イメージとカスタム CPU イメージは相互に交換して使用することはできません。
システムイメージへのアプリケーションイメージのキャッシュ
マウントされたデータディスクを持つ 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",
"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", # アプリケーションイメージをシステムイメージに追加します。
"mv /var/lib/containerd /var/lib/container/containerd" # イメージファイルをデータディスクに移動します。
]
}
]
}ノードプールを設定する際に、データディスクのスナップショットを含むカスタムイメージを指定できます。システムは対応するデータディスクのスナップショットを自動的に関連付けます。

ランタイムが Docker の場合にプライベートリポジトリからイメージをプルする
docker login <Registry 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)" } }ジョブの YAML を変更して、ConfigMap を Pod にマウントします。

図に示す内容を追加して `build-config` を変更します。

ジョブを実行します。
イメージのアップロード/ダウンロード同時実行数の設定
ターゲットノードプールの名前をクリックします。[基本情報] タブの [ノードプール情報] セクションで、[Auto Scaling グループ] の横にあるリンクをクリックします。
[インスタンス設定ソース] タブをクリックします。変更するスケーリング設定を見つけ、[操作] 列の [変更] をクリックし、次に [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 エンコードします。[インスタンスのユーザーデータ] フィールドの元のデータを新しく生成されたエンコード済みのコンテンツに置き換え、[変更の確認] をクリックして変更を保存します。
カスタム Alibaba Cloud Linux 3 イメージの作成
カスタム Red Hat Enterprise Linux 9 イメージの作成
次のステップ
カスタムイメージに基づいてノードプールを作成できます。詳細については、「既存の ECS インスタンスからカスタムイメージを作成し、そのイメージを使用してノードを作成する」をご参照ください。
カスタムイメージに基づいてノードをスケールアウトする方法については、「ノードの自動スケーリングの有効化」をご参照ください。