すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:カスタムイメージの作成

最終更新日:Dec 12, 2024

Alicloud Image Builderは、Alibaba Cloudが提供するイメージ構築ツールで、イメージ構築を簡素化および自動化します。 Alicloud Image Builderを使用して作成したOSイメージをカスタムイメージとして使用して、Container Service for Kubernetes (ACK) クラスターにノードプールを作成できます。 これにより、ノードをACKクラスターにすばやく追加できます。 このトピックでは、Alicloud Image Builderをジョブとして実行して、ACKクラスターにカスタムOSイメージを作成する方法について説明します。

前提条件

カスタム画像の利点

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イメージのパラメーターを指定します。

  1. build-config. YAMLという名前のyamlファイルを作成し、次の内容をファイルに追加します。

    YAMLテンプレート

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: build-config
    data:
      ack.json: |-
    
        {
          "variables": {
            "image_name": "ack-optimized_image-1.30-{{timestamp}}",
            "source_image": <source_image>,
            "instance_type": <instance_type>,
            "region": "{{env `ALICLOUD_REGION`}}",
            "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
            "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
          },
          "builders": [
            {
              "type": "alicloud-ecs",
              "system_disk_mapping": {    
                        "disk_size": 120
                        },   # Specify the size of the system disk. Unit: GB. Default value: 40. 
              "access_key": "{{user `access_key`}}",
              "secret_key": "{{user `secret_key`}}",
              "region": "{{user `region`}}",
              "image_name": "{{user `image_name`}}",
              "source_image": "{{user `source_image`}}",
              "ssh_username": "root",
              "vpc_id": "",  # If you do not specify the vpc_id parameter, a virtual private cloud (VPC) is automatically created during the image building process. The VPC is automatically deleted after the image is built. 
              "vswitch_id": "",  # If you do not specify the vswitch_id parameter, a vSwitch is automatically created during the image building process. The vSwitch is automatically deleted after the image is built. 
              "security_group_id": "",   # If you do not specify the security_group_id parameter, a security group is automatically created during the image building process. The security group is automatically deleted after the image is built. 
              "instance_type": "{{user `instance_type`}}",
              "skip_image_validation": "true",
              "io_optimized": "true"
            }
          ],
          "provisioners": [{
           "type": "file",
           "source": "scripts/ack-optimized-os-all.sh",
           "destination": "/root/"
            },
            {
           "type": "shell",
           "inline": [
             "export RUNTIME=containerd",    # Specify the runtime that is used. 
             "export RUNTIME_VERSION=1.6.28",
             "export SKIP_SECURITY_FIX=true",
             "export KUBE_VERSION=1.30.1-aliyun.1",
             "export OS_ARCH=amd64",    # Specify amd64 or arm64 based on your business requirements. 
             "bash /root/ack-optimized-os-all.sh"
          ]
          }]
        }

    下表に、各パラメーターを説明します。

    表 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

    1. Dockerを選択した場合、RUNTIME_VERSIONはデフォルトで19.03.15です。

    2. 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に設定します。

    任意

    重要
    1. ノードプールにカスタムイメージを指定する前に、ノードプールの設定がカスタムイメージのビルド設定と同じであることを確認してください。 そうしないと、カスタムイメージから作成されたノードをクラスターに追加できません。 ノードプールの設定には、クラスターバージョン、コンテナランタイム、GPU高速化インスタンスタイプが含まれます。

    2. カスタムイメージを検証するときに、カスタムイメージと同じビルド設定を使用する通常のノードプールを選択します。 カスタムイメージを使用してノードを作成し、ノードをノードプールに追加した後、アプリケーションがノードで期待どおりに実行できるかどうかを確認します。

  2. 次のコマンドを実行して、Alicloud Image Builderをクラスターにデプロイします。

    kubectl apply -f build-config.yaml

ステップ2: カスタムOSイメージをビルドするジョブを作成する

  1. 次のYAMLテンプレートを使用して、AccessKeyペアを使用するアカウントに権限を付与します。

    YAMLテンプレート

    {
      "Version": "1",
      "Statement": [
        {
          "Action": [
            "ecs:DeleteInstance",
            "ecs:StartInstance",
            "ecs:StopInstance",
            "ecs:DescribeInstances"
          ],
          "Resource": "*",
          "Effect": "Allow"
        },
        {
          "Action": [
            "ecs:CreateInstance",
            "ecs:DescribeImages",
            "ecs:CreateImage",
            "ecs:ModifyImageSharePermission",
            "ecs:CreateKeyPair",
            "ecs:DeleteKeyPairs",
            "ecs:DetachKeyPair",
            "ecs:AttachKeyPair",
            "ecs:CreateSecurityGroup",
            "ecs:DeleteSecurityGroup",
            "ecs:AuthorizeSecurityGroupEgress",
            "ecs:AuthorizeSecurityGroup",
            "ecs:CreateSnapshot",
            "ecs:AttachDisk",
            "ecs:DetachDisk",
            "ecs:DescribeDisks",
            "ecs:CreateDisk",
            "ecs:DeleteDisk",
            "ecs:CreateNetworkInterface",
            "ecs:DescribeNetworkInterfaces",
            "ecs:AttachNetworkInterface",
            "ecs:DetachNetworkInterface",
            "ecs:DeleteNetworkInterface",
            "ecs:DescribeInstanceAttribute"
          ],
          "Resource": "*",
          "Effect": "Allow"
        },
        {
          "Action": [
            "vpc:DescribeVpcs",
            "vpc:DescribeVSwitches",
            "vpc:AllocateEipAddress",
            "vpc:AssociateEipAddress",
            "vpc:UnassociateEipAddress",
            "vpc:DescribeEipAddresses",
            "vpc:ReleaseEipAddress",
            "vpc:CreateVpc",
            "vpc:DeleteVpc",
            "vpc:DescribeVpcs",
            "vpc:CreateVSwitch",
            "vpc:DeleteVSwitch",
            "vpc:DescribeVSwitches",
            "vpc:CreateRouteTable",
            "vpc:DeleteRouteTable",
            "vpc:DescribeRouteTables",
            "vpc:CreateNatGateway",
            "vpc:DeleteNatGateway",
            "vpc:DescribeNatGateways",
            "vpc:CreateSnatEntry",
            "vpc:DeleteSnatEntry",
            "vpc:DescribeSnatTableEntries"
          ],
          "Resource": "*",
          "Effect": "Allow"
        }
      ]
    }

  2. 次のコマンドを実行して、AccessKeyペアの暗号化文字列を生成します。

    echo -n "AKxxxxxxxxxxxxxxx" | base64
    echo -n "SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | base64
  3. 次の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
  4. という名前のYAMLファイルを作成します。build.yaml次の内容をファイルに追加します。

    ジョブを実行するように変数を設定します。 基本イメージから作成された指定されたインスタンスタイプのECSインスタンスは、カスタムイメージの構築に使用されます。 インスタンスタイプはinstance_typeパラメーターを使用して指定し、ベースイメージはsource_imageパラメーターを使用して指定します。 ECSインスタンスは、AccessKeyペアが属するAlibaba Cloudアカウントに属しています。 次に、システムはプロビジョニングの設定を実行し、ECSインスタンスによって構築されたイメージをカスタムイメージとして指定されたリージョンにプッシュします。 カスタムイメージは、AccessKeyペアが属するAlibaba Cloudアカウントにも属します。

    YAMLテンプレート

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: image-builder
      namespace: default
    spec:
      template:
        metadata:
          name: image-builder
        spec:
      template:
        metadata:
          name: image-builder
        spec:
          containers:
            - name: image-builder
              image: "registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/image-builder:v3.3"
              imagePullPolicy: Always
            env:            
             - name: ALICLOUD_ACCESS_KEY              
             	 valueFrom:                
            	   secretKeyRef:                  
           		     name: my-secret                  
                   key: ALICLOUD_ACCESS_KEY            
             - name: ALICLOUD_SECRET_KEY              
               valueFrom:                
                 secretKeyRef:                  
                   name: my-secret                  
                   key: ALICLOUD_SECRET_KEY            
             - name: ALICLOUD_REGION              
               value: cn-hangzhou   
              command: ["packer"]
              args:  ["build","/config/ack.json"]
              volumeMounts:
                - name: config
                  mountPath: /config
          volumes:
            - name: config
              configMap:
                name: build-config
                items:
                  - key: ack.json
                    path: ack.json
          restartPolicy: Never
  5. 次のコマンドを実行してジョブをデプロイし、イメージのビルドを開始します。

    kubectl apply -f build.yaml

ステップ3: (オプション) イメージ構築ログを表示する

画像構築プロセス中にログが生成されます。 ログには、パラメータのチェック、一時リソースの作成、ソフトウェアのプリインストール、ターゲットリソースの作成、一時リソースの解放など、すべてのイメージ構築操作が記録されます。 イメージ構築ログを表示するには、次の手順を実行します。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ワークロード] > [ジョブ] を選択します。

  3. [ジョブ] ページで、作成したジョブを見つけ、[操作] 列の [詳細] をクリックします。

  4. [ジョブの詳細] ページで、ログタブでイメージ構築ログを確認します。

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クライアントをインストールするコストを大幅に削減できます。 設定例を次のサンプルコードに示します。

YAMLテンプレート

    {
      "variables": {
        "region": "{{env `ALICLOUD_REGION`}}",
        "image_name": "ack-custom_image",
        "source_image": "centos_7_04_64_20G_alibase_201701015.vhd",
        "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
        "instance_type": "ecs.c6.xlarge",
        "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
      },
    "builders": [
        {
          "type": "alicloud-ecs",
          "access_key": "{{user `access_key`}}",
          "secret_key": "{{user `secret_key`}}",
          "region": "{{user `region`}}",
          "image_name": "{{user `image_name`}}",
          "source_image": "{{user `source_image`}}",
          "ssh_username": "root",
          "instance_type": "{{user `instance_type`}}",
          "skip_image_validation": "true",
          "io_optimized": "true"
        }
      ],
   "provisioners": [{
        "type": "shell",
        "inline": [
            "cd $HOME",
            "wget https://cpfs-client.oss-cn-beijing.aliyuncs.com/kernel/kernel-devel-`uname -r`.rpm",
            "rpm -ivh --replacefiles kernel-devel-`uname -r`.rpm"
        ]
      }]

ARMベースのイメージを作成する

YAMLテンプレート

{
      "variables": {
        "region": "{{env `ALICLOUD_REGION`}}",
        "image_name": "ack-custom_image",
        "source_image": "aliyun_3_arm64_20G_alibase_20240528.vhd",
        "instance_type": "ecs.r8y.xlarge",   # Specify an instance type that uses the ARM architecture. 
        "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
        "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
      },
    "builders": [
        {
          "type": "alicloud-ecs",
          "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.28.9-aliyun.1",
                "export OS_ARCH=arm64",
                "bash /root/ack-optimized-os-linux3-all.sh"
            ]
        }
      ]
    }

GPUアクセラレーションノードのOSイメージのカスタマイズ

重要

CPUアクセラレーションノードにGPUドライバーがプリインストールされているイメージはデプロイできません。

YAMLテンプレート

{
      "variables": {
        "region": "{{env `ALICLOUD_REGION`}}",
        "image_name": "ack-custom_image",
        "source_image": "aliyun_2_1903_x64_20G_alibase_20221102.vhd",
        "instance_type": "ecs.gn6i-c4g1.xlarge",   # Specify the type of the GPU-accelerated instance where the GPU driver will be preinstalled. 
        "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
        "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
      },
    "builders": [
        {
          "type": "alicloud-ecs",
          "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-all.sh",
            "destination": "/root/"
        },
        {
            "type": "shell",
            "inline": [
                "export RUNTIME=containerd",
                "export SKIP_SECURITY_FIX=true",
                "export PRESET_GPU=true",          # Set PRESET_GPU to true if you need to preinstall the GPU driver. Otherwise, leave the parameter empty or set it to false. 
                "export NVIDIA_DRIVER_VERSION=510.47.03",         # Specify the GPU driver version. If you leave this parameter empty, the 460.91.03 version is installed. 
                "export KUBE_VERSION=1.22.3-aliyun.1",
                "export OS_ARCH=amd64",
                "bash /root/ack-optimized-os-all.sh"
            ]
        }
      ]
    }

アプリケーションイメージをシステムイメージに追加

YAMLテンプレート

{
      "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",
          "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",
                "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. 
            ]
        }
      ]
    }

データディスクがマウントされた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.
            ]
        }
      ]
    }

ノードプールを構成するときに、データディスクスナップショットを含むカスタムイメージを設定できます。システムは、対応するデータディスクスナップショットを自動的に関連付けます。

image

コンテナランタイムがDockerの場合、プライベートイメージリポジトリからイメージをプルします

docker login <Image address> -u user -p password
docker pull nginx

コンテナランタイムがcontainerdの場合、プライベートイメージリポジトリからイメージをプルします

ctr -n k8s.io i pull --user=username:password nginx

カスタムイメージのビルド後にプライベートリポジトリからイメージを取得

  1. dockerがインストールされているLinuxサーバーで次のDocker loginコマンドを実行し、証明書を生成します。

    docker login --username=zhongwei.***@aliyun-test.com --password xxxxxxxxxx registry.cn-beijing.aliyuncs.com

    docker loginコマンドが成功すると、config.jsonという名前の証明書が /root/.dockerディレクトリに作成されます。 96

  2. 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)"
            }
    
        }
  3. ジョブのYAMLテンプレートを変更して、ConfigMapをポッドにマウントします。 95

    YAMLテンプレート

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: image-builder
      namespace: default
    spec:
      template:
        metadata:
          name: image-builder
        spec:
          containers:
            - name: image-builder
              image: "registry.cn-hangzhou.aliyuncs.com/acs/image-builder:v2.9"
              imagePullPolicy: Always
              env:
                - name: ALICLOUD_ACCESS_KEY
                  value: xxxxxxxxxxxxxx
                - name: ALICLOUD_SECRET_KEY
                  value: xxxxxxxxxxxxx
                - name: ALICLOUD_REGION
                  value: cn-heyuan
              command: ["packer"]
              args:  ["build","/config/ack.json"]
              volumeMounts:
                - name: config
                  mountPath: /config
                - name: docker
                  mountPath: /dockerconfig
          volumes:
            - name: config
              configMap:
                name: build-config
                items:
                  - key: ack.json
                    path: ack.json
            - name: docker
              configMap:
                name: docker-config
                items:
                  - key: config.json
                    path: config.json
          restartPolicy: Never
  4. 次の図の内容をbuild-config ConfigMapに追加します。94

    YAMLテンプレート

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: build-config
    data:
      ack.json: |-
    
        {
          "variables": {
            "image_name": "ack-optimized_image-1.20-{{timestamp}}",
            "source_image": "aliyun_2_1903_x64_20G_alibase_20221102.vhd",
            "instance_type": "ecs.c6.xlarge",
            "region": "{{env `ALICLOUD_REGION`}}",
            "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
            "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
          },
          "builders": [
            {
              "type": "alicloud-ecs",
              "access_key": "{{user `access_key`}}",
              "secret_key": "{{user `secret_key`}}",
              "region": "{{user `region`}}",
              "image_name": "{{user `image_name`}}",
              "source_image": "{{user `source_image`}}",
              "ssh_username": "root",
              "instance_type": "{{user `instance_type`}}",
              "skip_image_validation": "true",
              "io_optimized": "true"
            }
          ],
          "provisioners": [{
           "type": "file",
           "source": "scripts/ack-optimized-os-all.sh",
           "destination": "/root/"
            },
            {
           "type": "file",
           "source": "dockerconfig/config.json",
           "destination": "/root/"
            },
            {
           "type": "shell",
           "inline": [
             "export OS_ARCH=amd64",
             "export RUNTIME=docker",
             "export SKIP_SECURITY_FIX=true",
             "export KUBE_VERSION=1.22.15-aliyun.1",
             "bash /root/ack-optimized-os-all.sh",
             "mkdir -p /root/.docker",
             "cp /root/config.json /root/.docker",
             "docker pull registry.cn-beijing.aliyuncs.com/ringtail/kruise-game:0.1"
    
          ]
          }]
        }
  5. ジョブを実行します。

イメージの同時アップロードとダウンロードの最大数の指定

  1. ACK コンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ノード] > [ノードプール] を選択します。

  3. 管理するノードプールを見つけ、その名前をクリックします。 [概要] タブをクリックします。 [ノードプール情報] セクションで、[自動スケーリンググループ] フィールドの横にあるハイパーリンクをクリックします。

  4. 表示されるページで、[インスタンス設定ソース] タブをクリックします。 管理するスケーリング設定を見つけ、[操作] 列の [編集] をクリックし、[OK] をクリックします。

  5. [スケーリング設定の変更] ページでパラメーターを変更し、[詳細設定] をクリックして詳細設定を表示します。 [インスタンスユーザーデータ] ボックスにデータを記録します。 Base64を使用して、[インスタンスユーザーデータ] ボックスのデータをデコードします。

  6. データをデコードした後、デコードされたデータの最後に次のコードを追加します。

    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

    加

  7. 変更されたデータをBase64でエンコードし、[インスタンスユーザーデータ] ボックスの元のデータを変更されたデータで上書きします。 [変更] をクリックします。 表示されるダイアログボックスで、[変更] をクリックします。

カスタムAlibaba Cloud Linux 3イメージの構築

YAMLテンプレート

apiVersion: v1
kind: ConfigMap
metadata:
  name: build-config
data:
  ack.json: |-
    
    {
      "variables": {
        "image_name": "ack-optimized_image-1.22-{{timestamp}}",
        "source_image":"aliyun_3_x64_20G_alibase_20230110.vhd",  # The base image for Alibaba Cloud Linux 3. 
        "instance_type": "ecs.c6.xlarge",
        "region": "{{env `ALICLOUD_REGION`}}",
        "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
        "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}",
      },
      "builders": [
        {
          "type": "alicloud-ecs",
          "access_key": "{{user `access_key`}}",
          "secret_key": "{{user `secret_key`}}",
          "region": "{{user `region`}}",
          "image_name": "{{user `image_name`}}",
          "source_image": "{{user `source_image`}}",
          "ssh_username": "root",  
          "instance_type": "{{user `instance_type`}}",
          "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 OS_ARCH=amd64",
         "export KUBE_VERSION=1.22.3-aliyun.1",
         "bash /root/ack-optimized-os-linux3-all.sh",
      ]
      }]
    }

カスタムRed Hat Enterprise Linux 9 (RHEL 9) イメージの作成

YAMLテンプレート

apiVersion: v1
kind: ConfigMap
metadata:
  name: build-config
data:
  ack.json: |-
    
    {
      "variables": {
        "image_name": "ack-optimized_image-1.26-{{timestamp}}",
        "source_image": "m-bp1c7zuf8mcabc99babc",       # The base image for RHEL 9. 
        "instance_type": "ecs.c6.xlarge",
        "region": "{{env `ALICLOUD_REGION`}}",
        "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
        "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}",
        "runtime": "{{env `RUNTIME`}}",
        "skip_secrutiy_fix": "{{env `SKIP_SECURITY_FIX`}}"
      },
      "builders": [
        {
          "type": "alicloud-ecs",
          "access_key": "{{user `access_key`}}",
          "secret_key": "{{user `secret_key`}}",
          "region": "{{user `region`}}",
          "image_name": "{{user `image_name`}}",
          "source_image": "{{user `source_image`}}",
          "ssh_username": "root",
          # "vpc_id": "",
          # "vswitch_id": "",
          # "security_group_id": "",      
          "instance_type": "{{user `instance_type`}}",
          "skip_image_validation": "true",
          "io_optimized": "true"
        }
      ],
      "provisioners": [{
       "type": "file",
       "source": "scripts/ack-optimized-os-rhel9-all.sh",
       "destination": "/root/"
        },
        {
       "type": "shell",
       "inline": [
         "export RUNTIME=containerd",
         "export SKIP_SECURITY_FIX=true",
         "export OS_ARCH=amd64",
         "export KUBE_VERSION=1.26.3-aliyun.1",
         "bash /root/ack-optimized-os-rhel9-all.sh"
      ]
      }]
    }

次のステップ