Em clusters mistos com nós reais e virtuais, agendar pods para o Elastic Container Instance (ECI) e ativar recursos específicos do ECI geralmente exige modificar os arquivos YAML dos pods. Essa prática mistura operações de plataforma com configurações de aplicação. O eci-profile elimina essa necessidade. Como administrador do cluster, defina regras de agendamento e injeção de anotações em um único ConfigMap no nível do cluster. Assim, os pods recebem a configuração correta automaticamente, sem alterações no YAML da aplicação.
Como funciona
Ao criar um pod, o ack-virtual-node lê o ConfigMap eci-profile no namespace kube-system e aplica ao pod a configuração presente na seção data.
O eci-profile oferece três recursos:
ECI Scheduler: encaminha pods para o ECI com base em rótulos de pod ou de namespace por meio de um mecanismo de webhook de mutação. Isso elimina a necessidade de adicionar diretivas de agendamento nos arquivos YAML individuais dos pods.
ECI Effect: injeta automaticamente anotações e rótulos nos pods correspondentes para ativar recursos avançados do ECI, como especificar tipos de instância do Elastic Compute Service (ECS), ativar caches de imagem e configurar o serviço Network Time Protocol (NTP). Para obter a lista completa de anotações suportadas, consulte Anotação de Pod ECI.
Atualizações dinâmicas: alterações na configuração do eci-profile (endereço IP do cluster, nuvem híbrida, coleta de logs, vSwitches) entram em vigor imediatamente para novos pods. Não é necessário reiniciar o ack-virtual-node. Os pods existentes só adotam as mudanças após uma atualização contínua (rolling update).
Pré-requisitos
Antes de começar, verifique se:
O componente ack-virtual-node no cluster está na versão mais recente. Para atualizá-lo, consulte Gerenciar componentes.
Os webhooks de mutação estão ativados no cluster (necessário para o ECI Scheduler). Em clusters ACK Serverless, os pods são agendados automaticamente para o ECI; portanto, o ECI Scheduler não é necessário.
Observações de uso
Após atualizar o eci-profile, os novos pods ECI usam a configuração atualizada imediatamente. Os pods existentes só passam a usar a nova configuração depois de uma atualização contínua.
Se você não configurar
namespaceSelectornemobjectSelectorpara um seletor, mas configurareffect, as definições de efeito serão aplicadas a todos os pods agendados para o ECI.Se vários seletores corresponderem a um pod, a avaliação ocorrerá em ordem. Anotações e rótulos de seletores correspondidos anteriormente têm prioridade sobre os de seletores subsequentes. As anotações e rótulos já existentes no pod sempre prevalecem sobre qualquer item injetado pelo
effect.
Visualizar o eci-profile
Execute o comando abaixo para visualizar o ConfigMap eci-profile atual:
kubectl get cm -n kube-system eci-profile -o yaml
A seção data do ConfigMap contém dois tipos de configuração:
|
Parâmetro |
Descrição |
|
|
Define as regras do ECI Scheduler e do ECI Effect. Consulte Configurar seletores. |
|
Outros parâmetros ( |
Parâmetros no nível do cluster aplicados quando não há substituição no nível do pod. Suportam atualizações dinâmicas. Consulte Atualizar parâmetros no nível do cluster. |
Um eci-profile padrão tem a seguinte estrutura:
apiVersion: v1
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
featureGates: "WaitForFirstConsumer=false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****
kind: ConfigMap
metadata:
creationTimestamp: "2023-01-11T08:28:14Z"
name: eci-profile
namespace: kube-system
resourceVersion: "356"
uid: b345fa8c-919e-41fc-a981-57864b1a****
Editar o eci-profile
Use um dos métodos a seguir para editar o eci-profile.
kubectl
kubectl edit configmap eci-profile -n kube-system
Console do ACK
Faça login no Console do Container Service ACK.
Na página Clusters, clique em nome do cluster desejado.
No painel de navegação à esquerda, escolha Configurations > ConfigMaps.
Selecione kube-system na lista suspensa Namespace.
Localize eci-profile e clique em Edit YAML na coluna Actions.
Configurar seletores
Os seletores definem quais pods são encaminhados ao ECI (ECI Scheduler) e quais anotações ou rótulos são injetados nesses pods (ECI Effect). Durante a criação de um pod, o sistema avalia cada seletor em sequência e aplica as regras correspondentes.
Cada seletor suporta os seguintes campos:
name(obrigatório): nome exclusivo do seletor.namespaceSelector(opcional): corresponde a pods com base nos rótulos do namespace. Especifique os rótulos emmatchLabels. Múltiplos rótulos seguem a lógica AND.objectSelector(opcional): corresponde a pods com base nos rótulos do próprio pod. Especifique os rótulos emmatchLabels. Múltiplos rótulos seguem a lógica AND.effect(opcional): anotações e rótulos a serem injetados nos pods correspondentes. Os valores injetados não sobrescrevem anotações ou rótulos existentes no pod.
Quando tanto namespaceSelector quanto objectSelector estiverem configurados, o pod deve satisfazer ambos para corresponder ao seletor. Se nenhum dos dois estiver configurado, mas effect estiver definido, o efeito será aplicado a todos os pods agendados para o ECI.
Modelo de seletor
data:
selectors: |
[
{
"name": "selector-demo1", # Required. Unique selector name.
"namespaceSelector": { # Optional. Matches by namespace labels.
"matchLabels": { # AND logic among multiple labels.
"eci": "true"
}
},
"objectSelector": { # Optional. Matches by pod labels.
"matchLabels": { # AND logic among multiple labels.
"eci": "true"
}
},
"effect": { # Optional. Annotations and labels to inject.
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.c6.xlarge"
},
"labels": {
"created-by-eci": "true"
}
}
},
{
"name": "selector-demo2",
"objectSelector": {
"matchLabels": {
"eci": "test"
}
}
}
]
No exemplo acima, o selector-demo1 corresponde aos pods que possuem o rótulo eci: true e pertencem a um namespace com o rótulo eci: true. Os pods correspondentes são agendados para o ECI e recebem a anotação k8s.aliyun.com/eci-use-specs: ecs.c6.xlarge e o rótulo created-by-eci: true.
Remova os comentários em linha ( # ) antes de aplicar a configuração. JSON não suporta comentários.
Verificar se os seletores entraram em vigor
Após atualizar os seletores, execute o comando abaixo para confirmar o registro:
kubectl get mutatingwebhookconfigurations -o yaml vk-webhook
Se a saída contiver os seletores configurados, a configuração estará ativa. Caso contrário, verifique se o JSON do seletor está formatado corretamente.
Exemplos de configuração
Exemplo 1: Encaminhar pods específicos para o ECI
O seletor a seguir encaminha um pod para o ECI quando ele possui o rótulo created-by-eci: true e seu namespace tem o rótulo type: eci.
data:
selectors: |
[
{
"name": "eci-selector",
"namespaceSelector": {
"matchLabels": {
"type": "eci"
}
},
"objectSelector": {
"matchLabels": {
"created-by-eci": "true"
}
}
}
]
Exemplo 2: Encaminhar pods para o ECI com tipo de instância acelerada por GPU
Este seletor encaminha para o ECI os pods cujo namespace possui o rótulo gpu: true, utiliza o tipo de instância acelerada por GPU ecs.gn6v-c8g1.2xlarge e adiciona o rótulo gpu: test aos pods correspondentes.
data:
selectors: |
[
{
"name": "gpu-namespace-selector",
"namespaceSelector": {
"matchLabels": {
"gpu": "true"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-use-specs": "ecs.gn6v-c8g1.2xlarge"
},
"labels": {
"gpu": "test"
}
}
}
]
Exemplo 3: Encaminhar pods para o ECI com correspondência automática de cache de imagem
O seletor abaixo encaminha pods com o rótulo imc: auto para o ECI e ativa a correspondência automática de cache de imagem.
data:
selectors: |
[
{
"name": "autoimc-object-selector",
"objectSelector": {
"matchLabels": {
"imc": "auto"
}
},
"effect": {
"annotations": {
"k8s.aliyun.com/eci-auto-imc": "true"
}
}
}
]
Atualizar parâmetros no nível do cluster
Os parâmetros listados na seção data são padrões no nível do cluster. Quando um pod é criado sem uma substituição no nível do pod, os valores do eci-profile são utilizados. Todos os parâmetros suportam atualizações dinâmicas: as alterações entram em vigor imediatamente, sem necessidade de reiniciar o ack-virtual-node.
Esses parâmetros se aplicam apenas quando não há configuração no nível do pod que os substitua.
| Parâmetro | Padrão | Descrição |
|---|---|---|
enableClusterIp | "true" | Indica se deve haver suporte ao endereço IP do cluster. |
enableHybridMode | "false" | Indica se o modo de nuvem híbrida deve ser ativado. |
enableLinuxArm64Node | "false" | Indica se nós baseados em ARM devem ser ativados. Consulte Agendar pods para um nó virtual baseado em ARM. |
enableLogController | "false" | Indica se a Custom Resource Definition (CRD) do Simple Log Service deve ser usada para coletar logs de pods. Se definido como "true", configure também slsMachineGroup. |
enablePVCController | "false" | Indica se a extensão de disco online deve ser ativada. Se definido como "true", o sistema pode estender dinamicamente PersistentVolumeClaims (PVCs) vinculados a discos. |
enablePrivateZone | "false" | Indica se o PrivateZone deve ser usado para resolução de nomes de domínio. |
enableReuseSSLKey | "false" | Indica se chaves SSL devem ser reutilizadas entre pods. Por padrão, o ack-virtual-node emite um certificado SSL exclusivo para cada pod. Definir isso como "true" faz com que todos os pods compartilhem o mesmo certificado, o que melhora o throughput de criação de pods às custas de menor segurança. |
featureGates | "WaitForFirstConsumer=false" | Feature gate canário. Apenas WaitForFirstConsumer é configurável. Consulte a nota abaixo. |
securityGroupId | — | O grupo de segurança para pods ECI. Exemplo: sg-2zeeyaaxlkq9sppl****. |
slsMachineGroup | — | O grupo de máquinas para pods ECI. Obrigatório quando enableLogController é "true". Exemplo: test-mg. |
vSwitchIds | — | Os IDs dos vSwitches para pods ECI. Separe múltiplos IDs com vírgulas. Exemplo: vsw-2ze23nqzig8inprou**,vsw-2ze94pjtfuj9vaymf**. |
vpcId | — | O ID da Virtual Private Cloud (VPC) onde os pods ECI são implantados. Exemplo: vpc-2zeghwzptn5zii0w7****. |
Sobre featureGates: WaitForFirstConsumer
Quando WaitForFirstConsumer é definido como "true":
Atualize o componente csi-provisioner para a versão mais recente antes de ativar essa configuração.
PersistentVolumes (PVs) e armazenamento de backend são criados somente após o agendamento do pod. A zona e a região especificadas no StorageClass deixam de ser usadas; em vez disso, a zona e a região do nó onde o pod foi agendado são utilizadas para criar os recursos de armazenamento. Isso garante que os recursos de computação sejam agendados prioritariamente.
Para mais informações, consulte Modo de vinculação de volume.
Exemplo completo de uma seção data:
data:
enableClusterIp: "true"
enableHybridMode: "false"
enableLinuxArm64Node: "false"
enableLogController: "false"
enablePVCController: "false"
enablePrivateZone: "false"
enableReuseSSLKey: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
selectors: ""
slsMachineGroup: ""
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****