Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Custom images for scaling optimization

Dernière mise à jour :Aug 11, 2026

Dans les scénarios nécessitant des logiciels préinstallés ou des configurations haute performance, créez des images système d'exploitation personnalisées pour simplifier le scaling automatique. Utilisez Alicloud Image Builder pour générer ces images et créer des pools de nœuds, ce qui accélère l'approvisionnement des nœuds et améliore les performances de scaling.

Prérequis

Pourquoi utiliser des images personnalisées pour le scaling

Les pools de nœuds ACK prennent en charge le scaling automatique avec des images système d'exploitation intégrées, telles qu'Alibaba Cloud Linux et CentOS, qui couvrent la plupart des cas d'utilisation. Toutefois, pour les scénarios nécessitant des logiciels préinstallés ou des configurations haute performance, les images de base intégrées peuvent ne pas répondre aux exigences métier. Utilisez Alicloud Image Builder pour créer des images système d'exploitation personnalisées et simplifier le scaling automatique dans les scénarios complexes.

Lorsque vous utilisez Alicloud Image Builder pour créer une image personnalisée, soumettez la tâche de construction d'image au cluster en tant que Job ou CronJob.

Générez une image personnalisée avec un Job ACK

Les exemples suivants montrent comment utiliser Alicloud Image Builder pour générer des images système d'exploitation personnalisées, en utilisant une ConfigMap nommée build-config et un Job nommé build.

Étape 1 : Configurez les paramètres de construction

Créez une ConfigMap nommée build-config pour configurer les paramètres de construction de l'image.

  1. Créez un fichier nommé build-config.yaml avec le contenu YAML suivant.

    Afficher les détails

    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
                        },   # Specifies the system disk size for the image in GB. The default is 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": "",  # If you do not specify vpc_id, the process creates a temporary virtual private cloud (VPC) and automatically deletes it after completion.
              "vswitch_id": "",  # If you do not specify vswitch_id, the process creates a temporary vSwitch and automatically deletes it after completion.
              "security_group_id": "",   # If you do not specify security_group_id, the process creates a temporary security group and automatically deletes it after completion.
              "instance_type": "{{user `instance_type`}}",
              "skip_image_validation": "true",
              "io_optimized": "true"
            }
          ],
          "provisioners": [{
           "type": "file",
           "source": "scripts/ack-optimized-os-all.sh",    # Applies only to Alibaba Cloud Linux 2 images.
           "destination": "/root/"
            },
            {
           "type": "shell",
           "inline": [
             "export RUNTIME=containerd",    # Specify the container runtime.
             "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 requirements.
             "bash /root/ack-optimized-os-all.sh"
          ]
          }]
        }

    Les tableaux suivants répertorient les paramètres YAML.

    Tableau 1. Paramètres du fichier de configuration Alicloud Image Builder

    Paramètre

    Exemple

    Description

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

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

    Les variables pour Alicloud Image Builder.

    Remarque

    Coder en dur des informations sensibles telles que access_key et secret_key dans le fichier de configuration pose un risque de sécurité. Définissez-les comme des variables qui reçoivent des valeurs lors de l'exécution.

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

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

    Le générateur d'images (builders). Lorsque type est alicloud-ecs, une instance ECS temporaire est créée pour générer l'image, puis libérée par la suite.

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

    provisioners{"type":"shell"}

    Le programme de provisionnement d'images (provisioners) qui définit les opérations sur l'instance temporaire. Lorsque type est shell, un script shell s'exécute automatiquement sur l'instance. Par exemple, yum install redis.x86_64 -y installe Redis.

    Consultez la section Configuration du provisioner.

    Tableau 2. Paramètres de construction d'image

    Paramètre

    Exemple

    Description

    Obligatoire

    access_key

    yourAccessKeyID

    L'ID AccessKey. Consultez la section Obtention d'une paire AccessKey.

    Oui

    secret_key

    yourAccessKeySecret

    La clé secrète de la paire AccessKey.

    Oui

    region

    cn-beijing

    La région de l'image personnalisée.

    Oui

    image_name

    ack-custom_image

    Le nom de l'image personnalisée. Il doit être unique parmi les images existantes.

    Oui

    source_image

    aliyun_2_1903_x64_20G_alibase_20200904.vhd

    L'ID de l'image publique Alibaba Cloud avec le système d'exploitation correspondant. Consultez la section Images système d'exploitation prises en charge par ACK.

    Oui

    instance_type

    ecs.c6.xlarge

    Le type d'instance ECS pour l'instance de construction temporaire. Spécifiez un type accéléré par GPU pour les images GPU.

    Oui

    RUNTIME

    containerd

    Le runtime de conteneur. Valeurs valides : docker et containerd.

    Oui

    RUNTIME_VERSION

    1.6.28

    • Si le runtime de conteneur est docker, la valeur par défaut de RUNTIME_VERSION est 19.03.15.

    • Si le runtime de conteneur est containerd, la valeur par défaut de RUNTIME_VERSION est 1.6.20.

    Oui

    SKIP_SECURITY_FIX

    true

    Indique s'il faut ignorer les mises à jour de sécurité.

    Oui

    KUBE_VERSION

    1.30.1-aliyun.1

    La version du cluster.

    Oui

    PRESET_GPU

    true

    Indique s'il faut préinstaller le pilote GPU pour accélérer le démarrage.

    Non

    NVIDIA_DRIVER_VERSION

    460.91.03

    La version du pilote GPU à préinstaller. Valeur par défaut : 460.91.03.

    Non

    OS_ARCH

    amd64

    L'architecture CPU. Valeurs valides : amd64 et arm64.

    Oui

    MOUNT_RUNTIME_DATADISK

    true

    Définissez sur true si l'image personnalisée contient des images d'application mises en cache et si un disque de données doit être monté sur l'instance ECS lors de l'utilisation.

    Non

    Important
    • Avant d'attribuer une image personnalisée à un pool de nœuds, assurez-vous que la configuration du pool de nœuds (version du cluster, région, runtime de conteneur et type d'instance GPU) correspond aux paramètres de construction de l'image. Sinon, le nœud ne pourra pas rejoindre le cluster.

    • Pour valider, ajoutez l'image à un pool de nœuds standard avec des paramètres correspondants et vérifiez que vos charges de travail s'exécutent comme prévu.

  2. Déployez Alicloud Image Builder sur le cluster :

    kubectl apply -f build-config.yaml

Étape 2 : Créez un Job de construction

  1. Accordez les autorisations requises à la paire AccessKey avec la stratégie suivante.

    Afficher les détails

    {
      "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. Générez des chaînes encodées en Base64 pour votre paire AccessKey :

    echo -n "yourAccessKeyID" | base64
    echo -n "yourAccessKeySecret" | base64
  3. Créez un Secret nommé my-secret avec le YAML suivant.

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
      namespace: default
    type: Opaque
    data:
      ALICLOUD_ACCESS_KEY: TFRI**************** # The Base64-encoded string from the previous step.
      ALICLOUD_SECRET_KEY: a0zY****************
  4. Créez un fichier nommé build.yaml avec le contenu YAML suivant.

    Le Job crée une instance ECS temporaire à partir de l'image source_image, exécute les scripts provisioners, puis crée une image personnalisée et la pousse vers la région spécifiée.

    Afficher les détails

    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.5"
              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. Déployez le Job pour démarrer la construction de l'image.

    kubectl apply -f build.yaml

Étape 3 : (Facultatif) Consultez les journaux de construction

Le processus de construction génère des journaux qui enregistrent les étapes telles que la validation des paramètres, la création de ressources temporaires, la préinstallation de logiciels et le nettoyage.

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

  2. Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Workloads > Jobs.

  3. Dans la liste des Jobs, recherchez le Job que vous avez créé. Dans la colonne Actions, cliquez sur Details, puis cliquez sur l'onglet Logs pour afficher les journaux de construction.

Configuration du provisioner

Un provisioner installe et configure des logiciels sur une machine en cours d'exécution avant de la capturer en tant qu'image système d'exploitation. Cas d'utilisation typiques :

  • Installation de packages logiciels.

  • Application de correctifs au noyau.

  • Création d'utilisateurs.

  • Téléchargement de code d'application.

  • Construction d'une image personnalisée Alibaba Cloud Linux 3.

Exécution de scripts shell

  "provisioners": [{
      "type": "shell",
      "script": "script.sh"
  }]

Exécution de playbooks Ansible

  "provisioners": [
    {
    "type": "ansible",
    "playbook_file": "./playbook.yml"
    }
  ]

Installation du client CPFS

L'installation du client CPFS nécessite de nombreux packages et une compilation à la volée, ce qui peut être lent. Une image personnalisée réduit le coût d'installation à grande échelle.

Afficher les détails

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

Construction d'une image personnalisée pour l'architecture Arm

Afficher les détails

{
      "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 for 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 RUNTIME_VERSION=2.1.6",
                "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"
            ]
        }
      ]
    }

Construction d'une image système d'exploitation pour nœud GPU

Important

Les images GPU personnalisées et les images CPU personnalisées ne peuvent pas être utilisées ensemble.

Afficher les détails

{
      "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",   # To pre-install a GPU driver, set this parameter to a GPU-accelerated instance type.
        "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 RUNTIME_VERSION=1.6.36",
                "export SKIP_SECURITY_FIX=true",
                "export PRESET_GPU=true",          # To pre-install a GPU driver, set PRESET_GPU to true. If you do not want to pre-install a GPU driver, leave this 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 builder installs version 460.91.03 by default.
                "export KUBE_VERSION=1.22.3-aliyun.1",
                "export OS_ARCH=amd64",
                "bash /root/ack-optimized-os-all.sh"
            ]
        }
      ]
    }

Mise en cache des images d'application

Afficher les détails

{
      "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 RUNTIME_VERSION=2.1.6",
                "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"        # Bake application images into the OS image.
            ]
        }
      ]
    }

L'ajout d'une instance ECS avec un disque de données attaché à un pool de nœuds initialise le disque de données, supprimant ainsi les images d'application pré-mises en cache. Si vous devez attacher un disque de données lors de l'utilisation de l'image personnalisée, créez un snapshot de disque de données lors de la construction de l'image pour conserver les images d'application pré-mises en cache.

{
      "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 build the custom image. After building the image, the process automatically creates a snapshot of the data disk.
          "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 RUNTIME_VERSION=2.1.6",
                "export SKIP_SECURITY_FIX=true",
                "export KUBE_VERSION=1.30.1-aliyun.1",
                "export OS_ARCH=amd64",
                "export MOUNT_RUNTIME_DATADISK=true",     # Mount container runtime file paths 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",        # Bake the application image into the OS image.
                "mv /var/lib/containerd /var/lib/container/containerd"       # Move the image files to the data disk.
            ]
        }
      ]
    }

Lors de la configuration d'un pool de nœuds, sélectionnez une image personnalisée contenant un snapshot de disque de données. Le système indique que l'image personnalisée sélectionnée contient un snapshot de disque de données et que le disque de données correspondant est automatiquement chargé. Le type de disque est ESSD AutoPL, la capacité est de 120 GiB et les options Enable Burst Performance et Release with Instance sont sélectionnées. Le paramètre d'initialisation est Format and use as container runtime et le système de fichiers est ext4. Si vous modifiez la capacité du disque de données, vous devez étendre manuellement la partition et le système de fichiers après la création de l'instance ECS.

Extraction depuis un registre privé (Docker)

docker login <image_address> -u user -p password
docker pull nginx

Extraction depuis un registre privé (containerd)

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

Extraction depuis un registre privé pendant la construction

  1. Sur une machine Linux avec Docker installé, exécutez docker login pour générer les identifiants.

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

    Une connexion docker login réussie crée config.json dans le répertoire /root/.docker.

    [root@iZ2zehfg3i9c94b65hpriqZ ~]# docker login --username=docker-username --password xxx registry.cn-beijing.aliyuncs.com
    WARNING! Using --password via the CLI is insecure. Use --password-stdin.
    WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
    Configure a credential helper to remove this warning. See
    https://docs.docker.com/engine/reference/commandline/login/#credentials-store
    Login Succeeded
    [root@iZ2zehfg3i9c94b65hpriqZ ~]#
    [root@iZ2zehfg3i9c94b65hpriqZ ~]#
    [root@iZ2zehfg3i9c94b65hpriqZ ~]#
    [root@iZ2zehfg3i9c94b65hpriqZ ~]# cat /root/.docker/config.json
    {
            "auths": {
                    "registry.cn-beijing.aliyuncs.com": {
                            "auth": "emhvbmdxxx=="
                    }
            },
            "HttpHeaders": {
                    "User-Agent": "Docker-Client/19.03.15 (linux)"
            }
    }
    [root@iZ2zehfg3i9c94b65hpriqZ ~]#
  2. Créez une ConfigMap à partir du fichier config.json généré.

    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. Modifiez le YAML du Job pour monter la ConfigMap dans le Pod.

    Afficher les détails

    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.5"
              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. Modifiez le fichier build-config comme suit.

    Afficher les détails

    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. Exécutez le Job.

Définition des téléchargements et uploads d'images simultanés

  1. Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.

  2. Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur Nodes > Node Pools.

  3. Cliquez sur le nom du pool de nœuds cible. Dans l'onglet Overview, recherchez la section Node Pool Information et cliquez sur le lien à côté de Auto Scaling Group.

  4. Cliquez sur l'onglet Scaling Configurations. Recherchez la configuration de scaling cible, cliquez sur Edit dans la colonne Actions, puis cliquez sur OK.

  5. Sur la page Modify Scaling Configuration, développez Advanced Settings et copiez le contenu de Instance User Data. Décodez les données en Base64 dans le contenu de Instance User Data. Décodez les données en Base64 dans la zone Instance User Data.

  6. Décodez et modifiez les données utilisateur de l'instance.

    Décodez les données utilisateur de l'instance en Base64 et ajoutez le code suivant au script.

    Ce code installe jq , met à jour la configuration du démon Docker pour augmenter les téléchargements et uploads simultanés, et redémarre 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
  7. Réencodez et mettez à jour les données.

    Encodez le script modifié en Base64. Remplacez le contenu de la zone Instance User Data par la sortie encodée et cliquez sur OK.

Construction d'une image personnalisée Alibaba Cloud Linux 3

Afficher les détails

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",  # 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",
          "touch /var/.skip-yum"   # Skip yum updates because updates have already been applied during the custom image build.
       ]
       }]
    }

Construction d'une image personnalisée Alibaba Cloud Linux 4

Afficher les détails

apiVersion: v1
kind: ConfigMap
metadata:
  name: build-config
data:
  ack.json: |-
    {
      "variables": {
        "image_name": "ack-optimized_image-1.36-{{timestamp}}",
        "source_image":"aliyun_4_x64_20G_container_optimized_alibase_20260430.vhd",  # Base image for Alibaba Cloud Linux 4.
        "instance_type": "ecs.c8i.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-linux4-all.sh",
       "destination": "/root/"
        },
        {
       "type": "shell",
       "inline": [
         "export RUNTIME=containerd",
         "export RUNTIME_VERSION=2.1.8",
         "export SKIP_SECURITY_FIX=true",
         "export KUBE_VERSION=1.36.1-aliyun.1",
         "export OS_ARCH=amd64",
         "bash /root/ack-optimized-os-linux4-all.sh",
         "touch /var/.skip-yum",   # Skip yum updates because updates have already been applied during the custom image build.
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/ack-node-problem-detector:v0.8.17-80c46b7-aliyun",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/busybox:1.33",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/csi-node-driver-registrar:v2.17.0-aliyun",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/csi-plugin:v1.36.1",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/csi-plugin:v1.36.1-init",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/k8s-dns-node-cache:v1.22.28.1",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/kube-rbac-proxy:v0.11.0-703dc7e4-aliyun",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/loongcollector:v3.3.3.0-f44ebb3-aliyun",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/node-exporter:v0.17.0-slim",
         "ctr -n k8s.io i pull registry-cn-shanghai-vpc.ack.aliyuncs.com/acs/terway:v1.17.2"
         
      ]
      }]
    }

Construction d'une image personnalisée Red Hat Enterprise Linux 9

Afficher les détails

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

Étapes suivantes