Crie imagens personalizadas de sistema operacional com o Alicloud Image Builder para acelerar o provisionamento de nós em pools de nós do ACK.
Pré-requisitos
Um cluster gerenciado do ACK criado.
Cliente kubectl conectado ao cluster ACK. Para mais informações, consulte Conectar-se a um cluster ACK usando kubectl.
Por que usar imagens personalizadas para dimensionamento
Os pools de nós do ACK suportam Auto Scaling com imagens de sistema operacional integradas, como Alibaba Cloud Linux e CentOS, que atendem à maioria dos casos de uso. Para cenários que exigem software pré-instalado ou configurações de alto desempenho, utilize o Alicloud Image Builder para criar imagens personalizadas de sistema operacional.
Envie a tarefa de criação da imagem para o cluster como um Job ou CronJob.
Criar uma imagem personalizada com um Job do ACK
Os exemplos a seguir utilizam um ConfigMap chamado build-config e um Job chamado build.
Etapa 1: Configure parâmetros de criação
Crie um ConfigMap chamado build-config para definir os parâmetros de criação da imagem.
-
Crie um arquivo chamado build-config.yaml com o seguinte conteúdo YAML.
As tabelas a seguir listam os parâmetros YAML.
Tabela 1. Parâmetros no arquivo de configuração do Alicloud Image Builder
Parâmetro
Exemplo
Descrição
variables{"<variable1>":"<value>"}variables{"access_key":"{{env ALICLOUD_ACCESS_KEY}}"}
As
variablesdo Alicloud Image Builder.NotaCodificar informações sensíveis como
access_keyesecret_keydiretamente no arquivo de configuração representa um risco de segurança. Defina-as como variáveis que recebem valores em tempo de execução.builders{"type":"<value>"}builders{"type":"alicloud-ecs"}
O construtor de imagens (
builders). Quando type é alicloud-ecs, o sistema cria uma instância ECS temporária para gerar a imagem e a libera posteriormente.provisioners{"type":"<value>"}provisioners{"type":"shell"}
O provisionador de imagens (
provisioners) define as operações na instância temporária. Quando type é shell, um script shell executa automaticamente na instância. Por exemplo,yum install redis.x86_64 -yinstala o Redis.Consulte Configuração do provisionador.
Tabela 2. Parâmetros de criação de imagem
Parâmetro
Exemplo
Descrição
Obrigatório
access_keyyourAccessKeyID
ID do par AccessKey. Consulte Obter um par AccessKey.
Sim
secret_keyyourAccessKeySecret
Segredo do par AccessKey.
Sim
regioncn-beijing
Região da imagem personalizada.
Sim
image_nameack-custom_image
Nome da imagem personalizada. Deve ser único entre as imagens existentes.
Sim
source_imagealiyun_2_1903_x64_20G_alibase_20200904.vhd
ID da imagem pública do Alibaba Cloud com o sistema operacional correspondente. Consulte Imagens de SO suportadas pelo ACK.
Sim
instance_typeecs.c6.xlarge
Tipo de instância ECS para a instância temporária de criação. Especifique um tipo acelerado por GPU para imagens GPU.
Sim
RUNTIMEcontainerd
Runtime de contêiner. Valores válidos:
dockerecontainerd.Sim
RUNTIME_VERSION1.6.28
-
Se o runtime de contêiner for docker, o valor padrão de
RUNTIME_VERSIONé 19.03.15. -
Se o runtime de contêiner for containerd, o valor padrão de
RUNTIME_VERSIONé 1.6.20.
Sim
SKIP_SECURITY_FIXtrue
Define se as atualizações de segurança devem ser ignoradas.
Sim
KUBE_VERSION1.30.1-aliyun.1
Versão do cluster.
Sim
PRESET_GPUtrue
Indica se o driver GPU deve ser pré-instalado para acelerar a inicialização.
Não
NVIDIA_DRIVER_VERSION460.91.03
Versão do driver GPU a ser pré-instalada. Valor padrão: 460.91.03.
Não
OS_ARCHamd64
Arquitetura da CPU. Valores válidos:
amd64earm64.Sim
MOUNT_RUNTIME_DATADISK
true
Defina como true se a imagem personalizada tiver imagens de aplicação em cache e for necessário montar um disco de dados na instância ECS durante o uso.
Não
ImportanteAntes de atribuir uma imagem personalizada a um pool de nós, verifique se a configuração do pool (versão do cluster, região, runtime de contêiner, tipo de instância GPU) corresponde às definições de criação da imagem. Caso contrário, o nó não conseguirá ingressar no cluster.
Para validar, adicione a imagem a um pool de nós regular com parâmetros correspondentes e verifique se suas cargas de trabalho executam conforme o esperado.
-
-
Implante o Alicloud Image Builder no cluster:
kubectl apply -f build-config.yaml
Etapa 2: Crie um Job de criação
-
Conceda as permissões necessárias ao par AccessKey com a seguinte política.
-
Gere strings codificadas em Base64 para seu par AccessKey:
echo -n "yourAccessKeyID" | base64 echo -n "yourAccessKeySecret" | base64 -
Crie um Secret chamado my-secret com o seguinte YAML.
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**************** -
Crie um arquivo chamado build.yaml com o seguinte conteúdo YAML.
O Job cria uma instância ECS temporária a partir da
source_image, executa os scripts deprovisioners, gera uma imagem personalizada e a envia para a região especificada. -
Implante o Job para iniciar a criação da imagem.
kubectl apply -f build.yaml
Etapa 3: (Opcional) Visualize logs de criação
O processo de criação gera logs que registram etapas como validação de parâmetros, criação de recursos temporários, pré-instalação de software e limpeza.
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Na lista de Jobs, localize o Job criado. Na coluna Actions, clique em Details e, em seguida, clique na aba Logs para visualizar os logs de criação.
Configuração do provisionador
Um provisionador instala e configura software em uma máquina em execução antes de capturá-la como uma imagem de sistema operacional. Casos de uso típicos incluem:
Instale pacotes de software.
Aplicar patches no kernel.
Crie usuários.
Baixe código de aplicação.
Crie uma imagem personalizada do Alibaba Cloud Linux 3.
Execute scripts shell
"provisioners": [{
"type": "shell",
"script": "script.sh"
}]
Execute playbooks do Ansible
"provisioners": [
{
"type": "ansible",
"playbook_file": "./playbook.yml"
}
]
Instale cliente CPFS
A instalação do cliente CPFS requer muitos pacotes e compilação em tempo real, o que pode ser lento. Uma imagem personalizada reduz o custo de instalação em escala.
Crie uma imagem personalizada para arquitetura ARM
Crie uma imagem de SO para nó GPU
Imagens personalizadas de GPU e imagens personalizadas de CPU não podem ser usadas simultaneamente.
Armazenar imagens de aplicação em cache
Adicionar uma instância ECS com um disco de dados anexado a um pool de nós inicializa o disco de dados e remove as imagens de aplicação previamente armazenadas em cache. Para preservá-las, crie um snapshot do disco de dados ao criar a imagem personalizada.
{
"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.
]
}
]
}
Ao configurar um pool de nós, selecione uma imagem personalizada com snapshot de disco de dados. O sistema informará que um snapshot de disco de dados é carregado automaticamente, com o tipo de disco definido como ESSD AutoPL, capacidade de 120 GiB e opções para desempenho burst e liberação com a instância. O disco é inicializado no formato de runtime de contêiner usando ext4. Se você modificar a capacidade do disco de dados, será necessário expandir manualmente a partição e o sistema de arquivos após a criação da instância ECS.

Puxar de um registro privado (Docker)
docker login <image_address> -u user -p password
docker pull nginx
Puxar de um registro privado (containerd)
ctr -n k8s.io i pull --user=username:password nginx
Puxar de um registro privado durante a criação
-
Em uma máquina Linux com Docker instalado, execute
docker loginpara gerar credenciais.docker login --username=zhongwei.***@aliyun-test.com --password xxxxxxxxxx registry.cn-beijing.aliyuncs.comUm
docker loginbem-sucedido cria o arquivo config.json no diretório/root/.docker.
-
Crie um ConfigMap a partir do config.json gerado.
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)" } } -
Modifique o YAML do Job para montar o ConfigMap no Pod.

-
Modifique o arquivo build-config conforme mostrado abaixo.

Execute o Job.
Defina uploads e downloads simultâneos de imagens
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
Clique no nome do pool de nós desejado. Na aba Basic Information, localize a seção Node Pool Information e clique no link ao lado de Auto Scaling Group.
Clique na aba Instance Configuration Sources. Localize a configuração de dimensionamento desejada, clique em Modify na coluna Actions e, em seguida, clique em OK.
Na página Modify scaling configuration, expanda Advanced Settings e copie o conteúdo de User Data. Decodifique os dados em Base64 na caixa User Data.
-
Decodifique e modifique os dados do usuário.
Decodifique os Dados do Usuário da Instância em Base64 e anexe o seguinte código ao script.
Este código instala o
jq, atualiza a configuração do daemon do Docker para aumentar os downloads e uploads simultâneos e reinicia o 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
-
Codifique novamente e atualize os dados.
Codifique o script modificado em Base64. Substitua o conteúdo na caixa User Data pela saída codificada e clique em OK.