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
Un cluster ACK managé a été créé.
Un client kubectl est connecté au cluster ACK. Pour plus d'informations, consultez la section Connexion à un cluster ACK avec kubectl.
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.
-
Créez un fichier nommé build-config.yaml avec le contenu YAML suivant.
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
variablespour Alicloud Image Builder.RemarqueCoder en dur des informations sensibles telles que
access_keyetsecret_keydans 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 -yinstalle Redis.Consultez la section Configuration du provisioner.
Tableau 2. Paramètres de construction d'image
Paramètre
Exemple
Description
Obligatoire
access_keyyourAccessKeyID
L'ID AccessKey. Consultez la section Obtention d'une paire AccessKey.
Oui
secret_keyyourAccessKeySecret
La clé secrète de la paire AccessKey.
Oui
regioncn-beijing
La région de l'image personnalisée.
Oui
image_nameack-custom_image
Le nom de l'image personnalisée. Il doit être unique parmi les images existantes.
Oui
source_imagealiyun_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_typeecs.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
RUNTIMEcontainerd
Le runtime de conteneur. Valeurs valides :
dockeretcontainerd.Oui
RUNTIME_VERSION1.6.28
Si le runtime de conteneur est docker, la valeur par défaut de
RUNTIME_VERSIONest 19.03.15.Si le runtime de conteneur est containerd, la valeur par défaut de
RUNTIME_VERSIONest 1.6.20.
Oui
SKIP_SECURITY_FIXtrue
Indique s'il faut ignorer les mises à jour de sécurité.
Oui
KUBE_VERSION1.30.1-aliyun.1
La version du cluster.
Oui
PRESET_GPUtrue
Indique s'il faut préinstaller le pilote GPU pour accélérer le démarrage.
Non
NVIDIA_DRIVER_VERSION460.91.03
La version du pilote GPU à préinstaller. Valeur par défaut : 460.91.03.
Non
OS_ARCHamd64
L'architecture CPU. Valeurs valides :
amd64etarm64.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
ImportantAvant 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.
-
Déployez Alicloud Image Builder sur le cluster :
kubectl apply -f build-config.yaml
Étape 2 : Créez un Job de construction
-
Accordez les autorisations requises à la paire AccessKey avec la stratégie suivante.
-
Générez des chaînes encodées en Base64 pour votre paire AccessKey :
echo -n "yourAccessKeyID" | base64 echo -n "yourAccessKeySecret" | base64 -
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**************** -
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 scriptsprovisioners, puis crée une image personnalisée et la pousse vers la région spécifiée. -
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.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
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.
Construction d'une image personnalisée pour l'architecture Arm
Construction d'une image système d'exploitation pour nœud GPU
Les images GPU personnalisées et les images CPU personnalisées ne peuvent pas être utilisées ensemble.
Mise en cache des images d'application
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
-
Sur une machine Linux avec Docker installé, exécutez
docker loginpour générer les identifiants.docker login --username=zhongwei.***@aliyun-test.com --password xxxxxxxxxx registry.cn-beijing.aliyuncs.comUne connexion
docker loginré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 ~]# -
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)" } } -
Modifiez le YAML du Job pour monter la ConfigMap dans le Pod.
-
Modifiez le fichier build-config comme suit.
Exécutez le Job.
Définition des téléchargements et uploads d'images simultanés
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
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.
Cliquez sur l'onglet Scaling Configurations. Recherchez la configuration de scaling cible, cliquez sur Edit dans la colonne Actions, puis cliquez sur OK.
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.
-
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 -
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.