O Alibaba Cloud Service Mesh (ASM) oferece suporte aos modos sidecar e sem sidecar para implantar proxies de malha. No modo sidecar, um contêiner de proxy de malha compartilha o pod e o namespace de rede com o contêiner da aplicação. Ele intercepta transparentemente o tráfego de entrada e saída para fornecer balanceamento de carga, descoberta de serviços, controle de tráfego, segurança e observabilidade.
O modo sidecar nativo usa o recurso de contêiner sidecar integrado do Kubernetes (disponível desde a versão 1,29) para vincular o ciclo de vida do proxy de malha ao contêiner da aplicação. Isso elimina problemas de inicialização, encerramento e conclusão de Jobs comuns em implantações tradicionais de sidecar.
Por que usar o modo sidecar nativo
Em uma implantação tradicional de sidecar, o Kubernetes trata o proxy de malha e a aplicação como contêineres independentes com ciclos de vida separados. Essa incompatibilidade causa vários problemas operacionais:
Condição de corrida na inicialização: se o contêiner da aplicação iniciar antes do sidecar
istio-proxyficar pronto, a aplicação não conseguirá acessar a rede. O recurso Inicialização Graceful do Sidecar atenua esse problema, mas ele persiste quando o sidecar demora para iniciar.Ordem de encerramento: caso o sidecar
istio-proxyseja encerrado antes do contêiner da aplicação, esta perde o acesso à rede. O Encerramento Graceful do Sidecar mitiga essa situação, mas pode prolongar o tempo de término do pod.Pods zumbis em Jobs: quando um contêiner de aplicação em um Job termina após a conclusão da tarefa, o proxy sidecar continua em execução e impede o término do pod.
Falta de rede para contêineres init: contêineres init executados antes do início do proxy sidecar não conseguem acessar a rede. Uma solução alternativa é excluir portas específicas do redirecionamento de tráfego do sidecar.
O modo sidecar nativo resolve todos esses quatro problemas. Como o proxy de malha é definido como um contêiner sidecar nativo (um contêiner init com restartPolicy: Always), o Kubernetes garante que ele:
Inicie antes dos contêineres regulares e permaneça em execução durante todo o ciclo de vida do pod.
Seja encerrado somente após o término de todos os contêineres regulares.
Saia automaticamente quando o último contêiner regular for encerrado, evitando pods zumbis.
Execute antes de outros contêineres init, concedendo-lhes acesso à rede por meio do proxy de malha.
Sidecar tradicional versus sidecar nativo
|
Atributo |
Sidecar tradicional |
Sidecar nativo |
|
Versão do Kubernetes |
Comunidade: 1,4 a 1,28. Clusters ACK, ACK Serverless ou ACS: 1,30 e anteriores |
Comunidade: 1,29 e posteriores. Clusters ACK, ACK Serverless ou ACS: 1,30 e posteriores |
|
Versão do ASM |
ASM 1,22 e anteriores |
Ao adicionar clusters ACK, ACK Serverless ou ACS da versão 1,30 e anteriores a instâncias do ASM da versão 1,22 e anteriores, os proxies de malha são implantados no modo sidecar nativo por padrão |
|
Posicionamento na especificação do Pod |
O |
O |
|
Gerenciamento de ciclo de vida |
Independente do contêiner principal; exige configuração manual para ordenar a inicialização e o encerramento |
Sincroniza automaticamente com o contêiner principal; nenhuma configuração adicional necessária |
Verifique o modo de implantação
Para identificar qual modo sidecar um pod utiliza, inspecione sua especificação em busca de dois indicadores: a localização do contêiner istio-proxy e a presença de restartPolicy: Always.
kubectl get pod <pod-name> -o yaml
Substitua <pod-name> pelo nome real do pod.
Modo sidecar nativo: a saída inclui istio-proxy na seção initContainers:
apiVersion: v1
kind: Pod
metadata:
name: sleep-xxxxxxxx-xxxxx
namespace: default
spec:
containers:
...
- image: 'registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2'
imagePullPolicy: IfNotPresent
name: sleep
...
initContainers:
...
- image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/proxyv2:v1.22.2.35-ge64ec8af-aliyun
imagePullPolicy: IfNotPresent
name: istio-proxy
ports:
- containerPort: 15090
name: http-envoy-prom
protocol: TCP
restartPolicy: Always # Confirms native sidecar mode
...
Modo sidecar tradicional: o contêiner istio-proxy aparece no campo containers em vez de initContainers, e não há definição de restartPolicy: Always.
No modo sidecar nativo, as configurações de proxy sidecar relacionadas ao ciclo de vida (como inicialização graceful e encerramento graceful) não são necessárias e não têm efeito. Para obter a lista completa de configurações de proxy sidecar, consulte Configure proxies sidecar .
Alterne para o modo sidecar tradicional
Alguns componentes MutatingWebhook de terceiros configurados no Kubernetes versão 8 ou anterior podem modifique a definição do pod e entrar em conflito com contêineres sidecar nativos. Por exemplo, o logsidecar-injector do KubeSphere pode remover a definição de sidecar nativo e causar falhas na criação do pod. Se você encontrar problemas semelhantes, alterne para o modo sidecar tradicional.
Webhooks de mutação podem modifique pods com base em várias condições. Antes de alternar os modos, verifique se algum webhook de admissão em seu cluster interfere nos contêineres sidecar nativos.
Pré-requisitos
Antes de começar, certifique-se de ter:
Acesso à instância do ASM com
kubectl. Para mais detalhes, consulte Usar kubectl no plano de controle para acessar recursos do Istio
Etapas
-
Desative o modo sidecar nativo aplicando um patch no recurso
asmmeshconfig:kubectl patch asmmeshconfig default --type=merge --patch='{"spec":{"enableNativeSidecar":false}}'Saída esperada:
asmmeshconfig.istio.alibabacloud.com/default patched Reinicie os pods afetados para aplicar a alteração. Para mais detalhes, consulte Reimplantar cargas de trabalho.
-
Verifique se o pod agora usa o modo sidecar tradicional:
kubectl get pod <pod-name> -o yamlNa saída, confirme que
istio-proxyaparece no campocontainers(e não eminitContainers):apiVersion: v1 kind: Pod metadata: name: sleep-xxxxxxxx-xxxxx namespace: default spec: containers: ... - image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/proxyv2:v1.22.2.35-ge64ec8af-aliyun name: istio-proxy ports: - containerPort: 15090 name: http-envoy-prom protocol: TCP ... - image: 'registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2' imagePullPolicy: IfNotPresent name: sleep ...O contêiner
istio-proxynão está mais eminitContainerse não possuirestartPolicy: Always, confirmando a alternância para o modo sidecar tradicional.