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

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

最終更新日:Jun 17, 2025

プリインストールまたはハイパフォーマンスのシナリオでは、複雑な状況におけるスケーリングの利便性を高めるために、オペレーティングシステムイメージをカスタマイズしたい場合があります。Alicloud Image Builder を使用してカスタム オペレーティングシステムイメージを構築し、このイメージに基づいてノードプールを作成できます。Alicloud Image Builder は、ノードのプロビジョニング速度を向上させ、自動スケーリングのパフォーマンスを最適化できます。

前提条件

カスタムイメージの利点

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

  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
                        },   # システムディスクのサイズを指定します。単位:GB。デフォルト値: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": "",  # vpc_id パラメーターを指定しない場合、イメージ構築プロセス中に仮想プライベートクラウド (VPC) が自動的に作成されます。VPC は、イメージが構築された後に自動的に削除されます。
              "vswitch_id": "",  # vswitch_id パラメーターを指定しない場合、イメージ構築プロセス中に vSwitch が自動的に作成されます。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"
          ]
          }]
        }

    次の表にパラメーターを示します。

    表 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_key

    yourAccessKeyID

    カスタムイメージの作成に使用される AccessKey ID。詳細については、「AccessKey ペアの作成」をご参照ください。

    必須

    secret_key

    yourAccessKeySecret

    カスタムイメージの作成に使用される AccessKey シークレット。

    必須

    region

    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 アクセラレーテッドインスタンスタイプを指定します。

    必須

    RUNTIME

    containerd

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

    必須

    RUNTIME_VERSION

    1.6.28

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

    2. containerd を選択した場合、RUNTIME_VERSION はデフォルトで 1.6.20 です。

    オプション

    SKIP_SECURITY_FIX

    true

    セキュリティ更新プログラムをスキップするかどうかを指定します。

    必須

    KUBE_VERSION

    1.30.1-aliyun.1

    クラスターの Kubernetes バージョン。

    必須

    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 イメージを構築するための Job を作成する

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

    Job を実行するための変数を構成します。指定されたインスタンスタイプの 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:
          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. Job をデプロイし、イメージの構築を開始します。

    kubectl apply -f build.yaml

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

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

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

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

  3. [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 クライアントをインストールするコストを削減できます。

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",   # 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", // ランタイムを containerd に設定します
                "export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします
                "export KUBE_VERSION=1.28.9-aliyun.1", // Kubernetes のバージョンを指定します
                "export OS_ARCH=arm64", // OS アーキテクチャを 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",   # 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", // ランタイムを containerd に設定します。
                "export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします。
                "export PRESET_GPU=true",          # GPU ドライバーをプリインストールする必要がある場合は、PRESET_GPU を true に設定します。それ以外の場合は、パラメーターを空のままにするか、false に設定します。
                "export NVIDIA_DRIVER_VERSION=510.47.03",         # GPU ドライバーのバージョンを指定します。このパラメーターを空のままにすると、バージョン 460.91.03 がインストールされます。
                "export KUBE_VERSION=1.22.3-aliyun.1", // Kubernetes のバージョンを指定します。
                "export OS_ARCH=amd64", // OS アーキテクチャを 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", // ランタイムを containerd に設定します。
                "export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします。
                "export KUBE_VERSION=1.30.1-aliyun.1", // Kubernetes のバージョンを指定します。
                "export OS_ARCH=amd64", // OS アーキテクチャを 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", // ランタイムを 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"       # イメージファイルをデータディスクに移動します。
            ]
        }
      ]
    }

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

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 レジストリにログインします。

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

  2. 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)"
            }
    
        }
  3. ConfigMap をポッドにマウントするようにジョブの YAML テンプレートを変更します。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  // Docker 認証情報用のボリュームマウント
                  mountPath: /dockerconfig
          volumes:  // ボリュームの設定
            - name: config
              configMap:
                name: build-config
                items:
                  - key: ack.json
                    path: ack.json
            - name: docker  // Docker 認証情報用のボリューム
              configMap:
                name: docker-config  // ConfigMap 名
                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", // Docker 認証情報ファイルのソースパス
           "destination": "/root/" // Docker 認証情報ファイルのデスティネーションパス
            },
            {
           "type": "shell",
           "inline": [
             "export OS_ARCH=amd64", // OS アーキテクチャを設定します。
             "export RUNTIME=docker", // ランタイムを Docker に設定します。
             "export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします。
             "export KUBE_VERSION=1.22.15-aliyun.1", // Kubernetes のバージョンを指定します。
             "bash /root/ack-optimized-os-all.sh", // スクリプトを実行します。
             "mkdir -p /root/.docker", // .docker ディレクトリを作成します。
             "cp /root/config.json /root/.docker", // 認証情報ファイルを .docker ディレクトリにコピーします。
             "docker pull registry.cn-beijing.aliyuncs.com/ringtail/kruise-game:0.1" // プライベートレジストリからイメージをプルします。
    
          ]
          }]
        }
  5. ジョブを実行します。

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

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

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

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

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

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

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

    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 サービスを再起動します。

    加

  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",  # 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",  // SSH ユーザー名
          "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", // ランタイムを containerd に設定します。
         "export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします。
         "export OS_ARCH=amd64", // OS アーキテクチャを amd64 に設定します。
         "export KUBE_VERSION=1.22.3-aliyun.1", // Kubernetes のバージョンを指定します。
         "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",       # 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": "", // VPC ID を指定します。
          # "vswitch_id": "", // VSwitch ID を指定します。
          # "security_group_id": "",      // セキュリティグループ 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", // ランタイムを containerd に設定します。
         "export SKIP_SECURITY_FIX=true", // セキュリティ修正をスキップします。
         "export OS_ARCH=amd64", // OS アーキテクチャを amd64 に設定します。
         "export KUBE_VERSION=1.26.3-aliyun.1", // Kubernetes のバージョンを指定します。
         "bash /root/ack-optimized-os-rhel9-all.sh" // スクリプトを実行します。
      ]
      }]
    }

次の手順