Por padrão, o Service Mesh (ASM) injeta um contêiner de inicialização istio-init em cada pod para configurar regras de iptables de redirecionamento de tráfego. Esse contêiner exige a capacidade NET_ADMIN, o que obriga qualquer usuário ou conta de serviço responsável pela implantação de pods a ter permissões elevadas de controle de acesso baseado em função (RBAC) do Kubernetes. O plug-in Container Network Interface (CNI) do ASM reduz essa exigência ao transferir a configuração do iptables para a cadeia CNI no nível do nó. Assim, os pods deixam de precisar do contêiner istio-init ou de privilégios elevados.
Como funciona
Sem o plug-in CNI (padrão)
O ASM injeta um contêiner istio-init em cada pod. Esse contêiner de inicialização configura regras de iptables para redirecionar o tráfego pelo proxy sidecar do Envoy antes da inicialização dos demais contêineres. Como o istio-init modifica o namespace de rede do pod, ele requer a capacidade NET_ADMIN. Consequentemente, qualquer usuário ou conta de serviço que implante pods precisa ter permissões RBAC elevadas.
Com o plug-in CNI
O plug-in CNI do ASM transfere a configuração do iptables do contêiner istio-init para a cadeia CNI no nível do nó. As regras de redirecionamento de tráfego são aplicadas durante a fase de configuração de rede do pod, antes do início de qualquer contêiner. Os pods não precisam mais do contêiner istio-init nem da capacidade NET_ADMIN.
As regras de iptables de cada pod pertencem ao seu próprio namespace de rede; portanto, alterações em um pod não afetam outros pods no mesmo nó.
O plug-in CNI do ASM não substitui o CNI existente do cluster. Ele é instalado como um plug-in encadeado cuja configuração se integra aos plug-ins CNI existentes, permitindo sua invocação durante a inicialização dos contêineres.
Identificação de pods
O plug-in CNI aplica o redirecionamento de tráfego apenas aos pods que atendem a todas as condições abaixo:
|
Condição |
Descrição |
|
Namespace não excluído |
O namespace do pod não está na lista |
|
Sidecar presente |
O pod contém um contêiner chamado |
|
Múltiplos contêineres |
O pod possui mais de um contêiner |
|
Injeção não desativada |
O pod não tem a anotação |
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do ASM executando a versão 1.14.3.86 ou posterior. Para obter mais informações, consulte Criar uma instância do ASM
Um cliente kubectl conectado à instância do ASM. Para obter mais informações, consulte Usar kubectl no plano de controle para acessar recursos do Istio
Ativar o plug-in CNI
Faça login no console do ASM.
Na página Mesh Management, clique em nome da instância do ASM. No painel de navegação à esquerda, escolha .
-
Na página ASM CNI Plug-in, ative a opção Enable Grid CNI Plugin, selecione os namespaces a serem excluídos e clique em Update Settings.
Os pods nos namespaces excluídos continuam usando o contêiner
istio-initpara configuração de rede em vez do plug-in CNI. Aguarde até que a coluna Status mude de Updating para Running. O plug-in CNI agora está ativado.
Verificar as regras de iptables
Implante o aplicativo de exemplo Bookinfo para confirmar se o plug-in CNI configura corretamente as regras de iptables.
-
Crie um arquivo chamado bookinfo.yaml com o seguinte conteúdo:
-
Implante o aplicativo Bookinfo:
kubectl apply -f bookinfo.yaml -
Obtenha o ID do contêiner e o nome do nó do pod productpage:
ns=default podname=$(kubectl get pod | grep productpage | awk '{print $1}') # For Docker runtime: container_id=$(kubectl get pod -n ${ns} ${podname} -o jsonpath="{.status.containerStatuses[?(@.name=='istio-proxy')].containerID}" | sed -n 's/docker:\/\/\(.*\)/\1/p') # For containerd runtime: container_id=$(kubectl get pod -n ${ns} ${podname} -o jsonpath="{.status.containerStatuses[?(@.name=='istio-proxy')].containerID}" | sed -n 's/containerd:\/\/\(.*\)/\1/p') echo $container_id # Get the node name kubectl get pod ${podname} -o jsonpath="{.spec.nodeName}" -
Faça login no nó (por exemplo, via SSH) e obtenha o PID do contêiner:
# For Docker runtime: docker inspect --format '{{ .State.Pid }}' $container_id # For containerd runtime: crictl inspect $container_id | jq ".info.pid" -
Acesse o namespace de rede do contêiner productpage e liste as regras da tabela NAT:
nsenter -t <pid> -n iptables -L -t nat -n -v --line-numbers -xSubstitua
<pid>pelo PID obtido na etapa anterior.