Em cenários que exigem software pré-instalado ou configurações de alto desempenho, crie imagens de SO personalizadas para simplificar o auto scaling. Utilize o Alicloud Image Builder para gerar essas imagens e criar node pools, acelerando o provisionamento de nós e melhorando a performance do dimensionamento.
Pré-requisitos
Um ACK managed cluster foi criado.
Um cliente kubectl está conectado ao cluster ACK. Para mais informações, consulte Connect to an ACK cluster using kubectl.
Por que usar imagens personalizadas no dimensionamento
Os node pools do ACK suportam auto scaling com imagens de SO integradas, como Alibaba Cloud Linux e CentOS, que atendem à maioria dos casos de uso. No entanto, em situações que demandam software pré-instalado ou configurações de alta performance, as imagens base padrão podem não satisfazer os requisitos do negócio. Nesses casos, utilize o Alicloud Image Builder para construir imagens de SO personalizadas e simplificar o auto scaling em cenários complexos.
Ao usar o Alicloud Image Builder para criar uma imagem personalizada, 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 demonstram como utilizar o Alicloud Image Builder para gerar imagens de SO personalizadas, usando um ConfigMap chamado build-config e um Job chamado build.
Etapa 1: Configurar 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 descrevem 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.NotaIncluir informações confidenciais diretamente no arquivo de configuração, como
access_keyesecret_key, 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 imagem (
builders). Quando type é alicloud-ecs, uma instância ECS temporária é criada para gerar a imagem e liberada posteriormente.provisioners{"type":"<value>"}provisioners{"type":"shell"}
O provisionador de imagem (
provisioners) define as operações na instância temporária. Se type for shell, um script shell executa automaticamente na instância. Por exemplo,yum install redis.x86_64 -yinstala o Redis.Consulte Provisioner configuration.
Tabela 2. Parâmetros de criação de imagem
Parâmetro
Exemplo
Descrição
Obrigatório
access_keyyourAccessKeyID
O AccessKey ID. Consulte Obtain an AccessKey pair.
Sim
secret_keyyourAccessKeySecret
O segredo do par de AccessKey.
Sim
regioncn-beijing
A região da imagem personalizada.
Sim
image_nameack-custom_image
O nome da imagem personalizada. Deve ser único entre as imagens existentes.
Sim
source_imagealiyun_2_1903_x64_20G_alibase_20200904.vhd
O ID da imagem pública do Alibaba Cloud com o SO correspondente. Consulte OS images supported by ACK.
Sim
instance_typeecs.c6.xlarge
O tipo de instância ECS para a instância temporária de criação. Especifique um tipo acelerado por GPU para imagens de GPU.
Sim
RUNTIMEcontainerd
O runtime de contêiner. Valores válidos:
dockerecontainerd.Sim
RUNTIME_VERSION1.6.28
Se o runtime de contêiner for docker, o
RUNTIME_VERSIONpadrão é 19.03.15.Se o runtime de contêiner for containerd, o
RUNTIME_VERSIONpadrão é 1.6.20.
Sim
SKIP_SECURITY_FIXtrue
Indica se as atualizações de segurança devem ser ignoradas.
Sim
KUBE_VERSION1.30.1-aliyun.1
A versão do cluster.
Sim
PRESET_GPUtrue
Define se o driver de GPU deve ser pré-instalado para acelerar a inicialização.
Não
NVIDIA_DRIVER_VERSION460.91.03
A versão do driver de GPU a ser pré-instalada. Valor padrão: 460.91.03.
Não
OS_ARCHamd64
A arquitetura da CPU. Valores válidos:
amd64earm64.Sim
MOUNT_RUNTIME_DATADISK
true
Defina como true se a imagem personalizada contiver imagens de aplicativo 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 node pool, verifique se a configuração do node pool (versão do cluster, região, runtime de contêiner e 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 node pool comum com parâmetros correspondentes e confirme se suas cargas de trabalho executam conforme o esperado.
-
Implante o Alicloud Image Builder no cluster:
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" ] }] }
Etapa 2: Criar um Job de criação
-
Conceda as permissões necessárias ao par de AccessKey com a política a seguir.
-
Gere strings codificadas em Base64 para seu par de AccessKey:
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" ] }] } -
Crie um Secret chamado my-secret com o YAML abaixo.
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" ] }] } -
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.
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" ] }] }
Etapa 3: (Opcional) Visualizar 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 ACK console. 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 selecione a 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 SO. Casos de uso comuns incluem:
Instalação de pacotes de software.
Aplicação de patches no kernel.
Criação de usuários.
Baixe o código de aplicativo.
Criação de uma imagem personalizada do Alibaba Cloud Linux 3.
Executar scripts shell
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"
]
}]
}
Executar playbooks do Ansible
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"
]
}]
}
Instalar cliente CPFS
A instalação do cliente CPFS exige muitos pacotes e compilação em tempo real, o que pode ser lento. Uma imagem personalizada reduz o custo de instalação em grande escala.
Criar imagem personalizada para arquitetura ARM
Criar imagem de SO para nó de GPU
Imagens personalizadas de GPU e de CPU não podem ser usadas simultaneamente.
Armazenar imagens de aplicativo em cache
Adicionar uma instância ECS com um disco de dados anexado a um node pool inicializa esse disco, removendo as imagens de aplicativo previamente armazenadas em cache. Se você precisar anexar um disco de dados ao usar a imagem personalizada, crie um snapshot do disco de dados durante a criação da imagem para preservar as imagens de aplicativo em cache.
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"
]
}]
}
Ao configurar um node pool, selecione uma imagem personalizada que contenha um snapshot de disco de dados. O sistema exibirá a mensagem de que a imagem personalizada selecionada contém um snapshot de disco de dados e o disco de dados correspondente será carregado automaticamente. O tipo de disco é ESSD AutoPL, a capacidade é de 120 GiB, e as opções Enable Burst Performance e Release with Instance estarão selecionadas. A configuração de inicialização será Format and use as container runtime, com sistema de arquivos ext4. Se você modificar a capacidade do disco de dados, deverá expandir manualmente a partição e o sistema de arquivos após a criação da instância ECS.
Fazer pull de um registro privado (docker)
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"
]
}]
}
Fazer pull de um registro privado (containerd)
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"
]
}]
}
Fazer pull de um registro privado durante a criação
-
Em uma máquina Linux com docker instalado, execute
docker loginpara gerar credenciais.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" ] }] }Um
docker loginbem-sucedido cria o arquivo config.json no diretório/root/.docker.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" ] }] } -
Crie um ConfigMap a partir do config.json gerado.
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" ] }] } -
Modifique o YAML do Job para montar o ConfigMap no Pod.
-
Modifique o arquivo build-config conforme descrito abaixo.
Execute o Job.
Definir uploads e downloads simultâneos de imagens
Faça login no ACK console. 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 node pool desejado. Na aba Overview, localize a seção Node Pool Information e clique no link ao lado de Auto Scaling Group.
Clique na aba Scaling Configurations. Localize a configuração de dimensionamento alvo, clique em Edit na coluna Actions e selecione OK.
Na página Modify Scaling Configuration, expanda Advanced Settings e copie o conteúdo de Instance User Data. Decodifique os dados em Base64 presentes no conteúdo de Instance User Data. Decodifique os dados em Base64 na caixa Instance User Data.
-
Decodifique e modifique os dados do usuário da instância.
Decodifique os dados do usuário da instância em Base64 e anexe o código a seguir 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.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" ] }] } -
Codifique novamente e atualize os dados.
Codifique o script modificado em Base64. Substitua o conteúdo na caixa Instance User Data pela saída codificada e clique em OK.