Alicloud Image Builderは、Alibaba Cloudが提供するイメージ構築ツールで、イメージ構築を簡素化および自動化します。 Alicloud Image Builderを使用して作成したOSイメージをカスタムイメージとして使用して、Container Service for Kubernetes (ACK) クラスターにノードプールを作成できます。 これにより、ノードをACKクラスターにすばやく追加できます。 このトピックでは、Alicloud Image Builderをジョブとして実行して、ACKクラスターにカスタムOSイメージを作成する方法について説明します。
前提条件
ACKクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
カスタム画像の利点
ACKクラスターのノードプールは自動スケーリングをサポートしています。 デフォルトでは、ノードプールを作成するときに、CentOSやAlibaba Cloud LinuxなどのOSイメージを選択できます。 これらのOSイメージは、ほとんどのシナリオの要件を満たします。 ただし、プリインストールまたは高いパフォーマンスが必要なシナリオでは、これらのイメージがビジネス要件を満たすことができない場合があります。 Alibaba Cloudは、カスタムOSイメージを構築し、複雑なシナリオでの自動スケーリングを容易にするためのAlicloud Image Builderを提供しています。
Alicloud Image Builderを使用してカスタムイメージを作成するには、ジョブまたはCronJobを作成して、イメージ作成タスクをACKクラスターに分散します。
カスタムOSイメージをすばやく構築するためのジョブの作成
この例では、ビルド-configという名前のConfigMapとビルドという名前のジョブを作成して、Alicloud Image Builderを使用してカスタムOSイメージをすばやくビルドする方法を示します。
ステップ1: OSイメージのパラメータを設定する
build-configという名前のConfigMapを作成して、OSイメージのパラメーターを指定します。
build-config. YAMLという名前のyamlファイルを作成し、次の内容をファイルに追加します。
下表に、各パラメーターを説明します。
表 1. Alicloud Image Builderパラメーター
パラメーター
例
説明
変数 {"<variable1>":"<value>"}
変数 {"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}
Alicloud Image Builderで使用される
変数
。説明access_key
およびsecret_key
パラメーターを使用して指定されたAccessKeyペアなどの機密情報を設定ファイルに書き込むと、情報が漏洩する可能性があります。 データのセキュリティを確保するために、AccessKeyペアを変数として指定できます。 変数の値は、ランタイムの入力値に基づいています。ビルダー {"type":"<value>"}
builders{"type":"alicloud-ecs"}
イメージ
ビルダー
。 typeパラメーターがaliyun-ecsに設定されている場合、イメージを構築するために一時的なECS (Elastic Compute Service) インスタンスが作成されます。 イメージの構築後、ECSインスタンスは自動的にリリースされます。provisioners{"type":"<value>"}
provisioners{"type":"shell"}
一時インスタンスで実行される操作を指定するために使用されるイメージの
プロビジョニング
。 typeパラメーターがshellに設定されている場合は、シェルプロバイダーが使用されます。 Linuxインスタンスが接続されると、シェルコマンドが自動的に実行されます。 たとえば、yum install redis.x86_64 -y
コマンドを実行してRedisをインストールできます。プロビジョンの設定方法の詳細については、このトピックの「Provisionerの設定」をご参照ください。
表 2. 画像構築パラメータ
パラメーター
例
説明
必須 /オプション
access_key
LTAInPyXXXXQ ****
カスタムイメージの作成に使用されるAccessKey ID。 詳細については、「AccessKeyペアの取得」をご参照ください。
必要
secret_key
CM1ycKrrCekQ0dhXXXXXXXXXl7y ****
カスタムイメージの作成に使用されるAccessKeyシークレット。
必要
リージョン
cn-beijing
カスタムイメージがデプロイされるリージョン。
必要
image_name
ack-custom_image
カスタムイメージの名前 名前はグローバルに一意である必要があります。
必要
source_image
aliyun_2_1903_x64_20G_alibase_20200904.vhd
カスタムイメージが作成されたAlibaba CloudパブリックイメージのID。 作成されたカスタムイメージには、パブリックイメージと同じオペレーティングシステムが含まれます。 詳細については、「OSイメージの概要」トピックの「ACKでサポートされているOSイメージ」セクションをご参照ください。
必要
instance_type
ecs.c6.xlarge
source_imageパラメーターで指定されたベースイメージから作成されたECSインスタンスのインスタンスタイプ。 ECSインスタンスは、プレインストールタスクを実行し、カスタムイメージを構築するために使用されます。 GPU高速化イメージを使用する場合は、GPU高速化インスタンスタイプを指定します。
必要
ランタイム
containerd
コンテナーランタイム。Dockerまたはcontainerdです。
必要
RUNTIME_バージョン
1.6.28
Dockerを選択した場合、RUNTIME_VERSIONはデフォルトで19.03.15です。
containerdを選択した場合、RUNTIME_VERSIONはデフォルトで1.6.20です。
任意
SKIP_SECURITY_FIX
true
セキュリティ更新をスキップするかどうかを指定します。
必要
KUBE_バージョン
1.30.1-aliyun.1
クラスターの Kubernetes のバージョンです。
必要
PRESET_GPU
true
起動を高速化するためにGPUドライバーをプリインストールするかどうかを指定します。
任意
NVIDIA_DRIVER_バージョン
460.91.03
プリインストールされているGPUドライバーのバージョン。 このパラメーターを指定しない場合、デフォルト値460.91.03が使用されます。
任意
OS_ARCH
amd64
CPUアーキテクチャ。 有効な値: amd64およびarm64。
必要
MOUNT_RUNTIME_DATADISK
true
システムがカスタムイメージをインストールするときに、ボリュームイメージから作成されたディスクボリュームをECSインスタンスにマウントする場合は、値をtrueに設定します。
任意
重要ノードプールにカスタムイメージを指定する前に、ノードプールの設定がカスタムイメージのビルド設定と同じであることを確認してください。 そうしないと、カスタムイメージから作成されたノードをクラスターに追加できません。 ノードプールの設定には、クラスターバージョン、コンテナランタイム、GPU高速化インスタンスタイプが含まれます。
カスタムイメージを検証するときに、カスタムイメージと同じビルド設定を使用する通常のノードプールを選択します。 カスタムイメージを使用してノードを作成し、ノードをノードプールに追加した後、アプリケーションがノードで期待どおりに実行できるかどうかを確認します。
次のコマンドを実行して、Alicloud Image Builderをクラスターにデプロイします。
kubectl apply -f build-config.yaml
ステップ2: カスタムOSイメージをビルドするジョブを作成する
次のYAMLテンプレートを使用して、AccessKeyペアを使用するアカウントに権限を付与します。
次のコマンドを実行して、AccessKeyペアの暗号化文字列を生成します。
echo -n "AKxxxxxxxxxxxxxxx" | base64 echo -n "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | base64
次のYAMLテンプレートを使用して、my-Secretという名前のシークレットを作成します。
apiVersion: v1 kind: Secret metadata: name: my-secret namespace: default type: Opaque data: ALICLOUD_ACCESS_KEY: TFRxxxxxxxxxxxxxRTkx // The Base64-encoded string in the previous substep. ALICLOUD_SECRET_KEY: a0zxxxxxxxxxxxxxx2UThl
という名前のYAMLファイルを作成します。build.yaml次の内容をファイルに追加します。
ジョブを実行するように変数を設定します。 基本イメージから作成された指定されたインスタンスタイプのECSインスタンスは、カスタムイメージの構築に使用されます。 インスタンスタイプはinstance_typeパラメーターを使用して指定し、ベースイメージはsource_imageパラメーターを使用して指定します。 ECSインスタンスは、AccessKeyペアが属するAlibaba Cloudアカウントに属しています。 次に、システムはプロビジョニングの設定を実行し、ECSインスタンスによって構築されたイメージをカスタムイメージとして指定されたリージョンにプッシュします。 カスタムイメージは、AccessKeyペアが属するAlibaba Cloudアカウントにも属します。
次のコマンドを実行してジョブをデプロイし、イメージのビルドを開始します。
kubectl apply -f build.yaml
ステップ3: (オプション) イメージ構築ログを表示する
画像構築プロセス中にログが生成されます。 ログには、パラメータのチェック、一時リソースの作成、ソフトウェアのプリインストール、ターゲットリソースの作成、一時リソースの解放など、すべてのイメージ構築操作が記録されます。 イメージ構築ログを表示するには、次の手順を実行します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[ジョブ] ページで、作成したジョブを見つけ、[操作] 列の [詳細] をクリックします。
[ジョブの詳細] ページで、ログタブでイメージ構築ログを確認します。
Provisionerの設定
プロビジョニングは、オペレーティングシステムが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"
}, # Configure a data disk when you create the custom image, and a snapshot of the data disk is automatically generated after the image is created.
"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", # Mount the file path of the container runtime to the data disk.
"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", # Add the application image to the system image.
"mv /var/lib/containerd /var/lib/container/containerd" # Move the image file to the data disk.
]
}
]
}
ノードプールを構成するときに、データディスクスナップショットを含むカスタムイメージを設定できます。システムは、対応するデータディスクスナップショットを自動的に関連付けます。
コンテナランタイムが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 login
コマンドが成功すると、config.jsonという名前の証明書が/root/.docker
ディレクトリに作成されます。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をポッドにマウントします。
次の図の内容をbuild-config ConfigMapに追加します。
ジョブを実行します。
イメージの同時アップロードとダウンロードの最大数の指定
ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、
を選択します。管理するノードプールを見つけ、その名前をクリックします。 [概要] タブをクリックします。 [ノードプール情報] セクションで、[自動スケーリンググループ] フィールドの横にあるハイパーリンクをクリックします。
表示されるページで、[インスタンス設定ソース] タブをクリックします。 管理するスケーリング設定を見つけ、[操作] 列の [編集] をクリックし、[OK] をクリックします。
[スケーリング設定の変更] ページでパラメーターを変更し、[詳細設定] をクリックして詳細設定を表示します。 [インスタンスユーザーデータ] ボックスにデータを記録します。 Base64を使用して、[インスタンスユーザーデータ] ボックスのデータをデコードします。
データをデコードした後、デコードされたデータの最後に次のコードを追加します。
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 (RHEL 9) イメージの作成
次のステップ
Alicloud image Builderを使用してカスタムイメージを作成した後、カスタムイメージに基づいてエラスティックノードプールを作成し、クラスターにノードをすばやく追加できます。 エラスティックノードプールの作成方法の詳細については、「ノード自動スケーリングの有効化」をご参照ください。
カスタムイメージを作成した後、そのカスタムイメージを使用してACKクラスターを作成できます。 詳細については、「」をご参照ください。既存のECSインスタンスに基づいてカスタムイメージを作成し、それを使用してノードを作成するにはどうすればよいですか。