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

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

最終更新日:Mar 01, 2026

一部のプリインストール済みシナリオやパフォーマンス専有型シナリオでは、複雑な状況での弾性スケーリングを簡素化するために、オペレーティングシステム (OS) イメージをカスタマイズしたい場合があります。Alicloud Image Builder を使用してカスタム OS イメージをビルドし、このイメージに基づいてノードプールを作成できます。Alicloud Image Builder は、ノードのプロビジョニングを高速化し、ノードの自動スケーリングのパフォーマンスを最適化できます。

前提条件

伸縮性最適化カスタムイメージの必要性

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 イメージのビルド用パラメーターを設定できます。

  1. 次の YAML コンテンツを含む `build-config.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
                        },   # イメージのシステムディスクのサイズを GB 単位で指定します。デフォルト値は 40 GB です。
              "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": "",  # vpc_id を指定しない場合、プロセス中に VPC が作成され、プロセス終了後に自動的にリリースされます。
              "vswitch_id": "",  # vswitch_id を指定しない場合、プロセス中に vSwitch が作成され、プロセス終了後に自動的にリリースされます。
              "security_group_id": "",   # security_group_id を指定しない場合、プロセス中にセキュリティグループが作成され、プロセス終了後に自動的にリリースされます。
              "instance_type": "{{user `instance_type`}}",
              "skip_image_validation": "true",
              "io_optimized": "true"
            }
          ],
          "provisioners": [{
           "type": "file",
           "source": "scripts/ack-optimized-os-all.sh",    # これは Alibaba Cloud Linux 2 イメージにのみ適用されます。
           "destination": "/root/"
            },
            {
           "type": "shell",
           "inline": [
             "export RUNTIME=containerd",    # コンテナーランタイムを指定します。
             "export RUNTIME_VERSION=1.6.28",
             "export SKIP_SECURITY_FIX=true",
             "export KUBE_VERSION=1.30.1-aliyun.1",
             "export OS_ARCH=amd64",    # 必要に応じて amd64 または arm64 を指定します。
             "bash /root/ack-optimized-os-all.sh"
          ]
          }]
        }

    次の表に、上記の YAML コンテンツのパラメーターを説明します。

    表 1. Alicloud Image Builder 設定ファイルのパラメーター

    パラメーター

    説明

    variables{"<variable1>":"<value>"}

    variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}

    Alicloud Image Builder が使用する変数 (variables)。

    説明

    AccessKey ペア (access_keysecret_key を含む) などの機密情報を設定ファイルに書き込むと、情報が漏洩する可能性があります。意図しない漏洩を防ぐため、実行時に値を取得する変数として設定してください。

    builders{"type":"<value>"}

    builders{"type":"alicloud-ecs"}

    イメージビルダー (builders)。typealicloud-ecs に設定すると、一時 ECS インスタンスが作成されてイメージがビルドされます。ビルドが完了すると、ECS インスタンスは自動的に破棄されます。

    provisioners{"type":"<value>"}

    provisioners{"type":"shell"}

    イメージプロビジョナー (provisioners) は、一時インスタンス内で実行される操作を定義します。typeshell に設定すると、シェルプロビジョナーが使用されます。これは、Linux インスタンスへの接続後にシェルコマンドが自動的に実行されることを意味します。たとえば、シェルコマンド yum install redis.x86_64 -y を実行して Redis をインストールします。

    プロビジョナーの設定の詳細については、「プロビジョナーの設定」をご参照ください。

    表 2. イメージビルドパラメーター

    パラメーター

    説明

    必須

    access_key

    yourAccessKeyID

    ご利用の AccessKey ID。詳細については、「AccessKey ペアの取得」をご参照ください。

    必須

    secret_key

    yourAccessKeySecret

    ご利用の AccessKey Secret。

    必須

    region

    cn-beijing

    宛先カスタムイメージのリージョン。

    必須

    image_name

    ack-custom_image

    宛先カスタムイメージの名前。名前はリージョン内で一意である必要があります。

    必須

    source_image

    aliyun_2_1903_x64_20G_alibase_20200904.vhd

    同じオペレーティングシステムを持つ Alibaba Cloud パブリックイメージの ID。詳細については、「ACK でサポートされている OS イメージ」をご参照ください。

    必須

    instance_type

    ecs.c6.xlarge

    `source_image` から作成されたインスタンスは、指定されたプリインストールタスクを実行し、カスタムイメージを生成します。GPU イメージが必要な場合は、ここで GPU インスタンスタイプを指定します。

    必須

    RUNTIME

    containerd

    コンテナーランタイム。Docker または containerd を指定できます。

    必須

    RUNTIME_VERSION

    1.6.28

    • コンテナーランタイムが Docker の場合、`RUNTIME_VERSION` のデフォルト値は 19.03.15 です。

    • コンテナーランタイムが containerd の場合、`RUNTIME_VERSION` のデフォルト値は 1.6.20 です。

    必須

    SKIP_SECURITY_FIX

    true

    セキュリティ更新プログラムをスキップします。

    必須

    KUBE_VERSION

    1.30.1-aliyun.1

    クラスターのバージョン番号。

    必須

    PRESET_GPU

    true

    GPU ドライバーをプリインストールして起動を高速化します。

    任意

    NVIDIA_DRIVER_VERSION

    460.91.03

    プリインストールされる GPU ドライバーのバージョン。このパラメーターを指定しない場合、デフォルトバージョンの 460.91.03 が使用されます。

    任意

    OS_ARCH

    amd64

    CPU アーキテクチャ。amd64 または arm64 を指定できます。

    必須

    MOUNT_RUNTIME_DATADISK

    true

    カスタムイメージにアプリケーションイメージがキャッシュされており、実行時に ECS インスタンスにデータディスクをアタッチする必要がある場合は、このパラメーターを true に設定します。

    任意

    重要
    • ノードプールにカスタムイメージを設定する前に、クラスターバージョン、クラスターリージョン、コンテナーランタイム、GPU バージョン互換のインスタンスタイプなど、ノードプールの設定がカスタムイメージのビルド設定と一致していることを確認してください。一致しない場合、ノードをクラスターに追加できません。

    • カスタムイメージの検証フェーズでは、選択したパラメーターに一致する通常のノードプールを使用して検証します。ノードがノードプールに正常に追加された後、サービスが期待どおりに実行されることを確認してください。

  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 ID と AccessKey Secret の暗号化された文字列を生成します。

    echo -n "yourAccessKeyID" | base64
    echo -n "yourAccessKeySecret" | base64
  3. 次の 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****************
  4. 次の YAML コンテンツを含む build.yaml という名前のファイルを作成します。

    ジョブを実行するための変数を設定します。プロセス中に、AccessKey ペアを所有するアカウントで、`source_image` から指定された `instance_type` の ECS インスタンスが作成されます。その後、プロビジョナーの設定が実行されます。プロセスが完了すると、ECS インスタンスを使用してイメージが生成され、そのイメージがカスタムイメージとして同じアカウントの指定されたリージョンにプッシュされます。

    クリックして 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.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. ジョブをクラスターにデプロイして、OS イメージのビルドを開始します。

    kubectl apply -f build.yaml

3. (任意) カスタムイメージビルドログの表示

イメージのビルドプロセス中に操作ログが生成されます。ログには、パラメーターの検証、一時リソースの作成、ソフトウェアのプリインストール、ターゲットリソースの作成、一時リソースの解放など、ビルド中に実行されたステップが記録されます。次の手順を実行して、イメージのビルドログを表示できます。

  1. 「ジョブ」ページで、前のステップで作成したジョブを探し、[操作] 列の [詳細] をクリックします。詳細ページで、[ログ] タブをクリックしてイメージビルドログを表示します。

プロビジョナーの設定

プロビジョナーは、実行中のマシンを静的な 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 クライアントのバッチインストールのコストを削減できます。

詳細を表示するにはクリックします

    {
      "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 アーキテクチャイメージのカスタマイズ

詳細を表示するにはクリックします

{
      "variables": {
        "region": "{{env `ALICLOUD_REGION`}}",
        "image_name": "ack-custom_image",
        "source_image": "aliyun_3_arm64_20G_alibase_20240528.vhd",
        "instance_type": "ecs.r8y.xlarge",   # Arm アーキテクチャのインスタンスタイプを設定します。
        "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 ノードシステムイメージのカスタマイズ

重要

カスタム GPU イメージとカスタム CPU イメージは相互に交換して使用することはできません。

詳細を表示するにはクリックします

{
      "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",   # GPU ドライバーをプリインストールするには、GPU インスタンスタイプを指定する必要があります。
        "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",          # GPU ドライバーをプリインストールするには、PRESET_GPU を true に設定します。GPU ドライバーをプリインストールする必要がない場合は、このパラメーターを空にするか、false に設定します。
                "export NVIDIA_DRIVER_VERSION=510.47.03",         # GPU ドライバーのバージョンを指定します。このパラメーターを空にすると、デフォルトでバージョン 460.91.03 がインストールされます。
                "export KUBE_VERSION=1.22.3-aliyun.1",
                "export OS_ARCH=amd64",
                "bash /root/ack-optimized-os-all.sh"
            ]
        }
      ]
    }

システムイメージへのアプリケーションイメージのキャッシュ

詳細を表示するにはクリックします

{
      "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"        # アプリケーションイメージをシステムイメージに追加します。
            ]
        }
      ]
    }

マウントされたデータディスクを持つ 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"       # イメージファイルをデータディスクに移動します。
            ]
        }
      ]
    }

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

image

ランタイムが Docker の場合にプライベートリポジトリからイメージをプルする

docker login <Registry 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 コマンドが正常に実行されると、/root/.docker ディレクトリに `config.json` という名前の証明書ファイルが生成されます。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 を Pod にマウントします。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: yourAccessKeyID
                - name: ALICLOUD_SECRET_KEY
                  value: yourAccessKeySecret
                - 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` を変更します。94

    詳細を表示するにはクリックします

    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. ターゲットノードプールの名前をクリックします。[基本情報] タブの [ノードプール情報] セクションで、[Auto Scaling グループ] の横にあるリンクをクリックします。

  2. [インスタンス設定ソース] タブをクリックします。変更するスケーリング設定を見つけ、[操作] 列の [変更] をクリックし、次に [OK] をクリックします。

  3. [スケーリング構成の変更] ページで [詳細設定] を展開し、[インスタンスのユーザーデータ] フィールドの内容をコピーします。[インスタンスのユーザーデータ] フィールドのデータを Base64 デコードします。

  4. ユーザーデータのデコードと変更

    既存のインスタンスのユーザーデータを 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

    image

  5. ユーザーデータの再エンコードと更新

    変更後のスクリプト全体を Base64 エンコードします。[インスタンスのユーザーデータ] フィールドの元のデータを新しく生成されたエンコード済みのコンテンツに置き換え、[変更の確認] をクリックして変更を保存します。

カスタム Alibaba Cloud Linux 3 イメージの作成

詳細を表示するにはクリックします

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",  # 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 イメージの作成

詳細を表示するにはクリックします

apiVersion: v1
kind: ConfigMap
metadata:
  name: build-config
data:
  ack.json: |-
    
    {
      "variables": {
        "image_name": "ack-optimized_image-1.26-{{timestamp}}",
        "source_image": "m-bp1c7zuf8mcabc99babc",       # 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_security_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"
      ]
      }]
    }

次のステップ