Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo mostra como habilitar o Istio CNI para o complemento de malha de serviço baseado em Istio no Serviço Kubernetes do Azure (AKS). O Istio CNI melhora a segurança eliminando a necessidade de recursos de rede privilegiados em cargas de trabalho de aplicativos dentro da malha de serviço.
Visão geral
Por padrão, a malha de serviço do Istio usa contentores de inicialização privilegiados (istio-init) em cada pod de aplicativo para configurar o redirecionamento do tráfego de rede para o proxy Envoy sidecar. Esses contêineres de inicialização exigem NET_ADMIN e NET_RAW capacidades, que frequentemente são assinaladas como preocupações de segurança em ambientes corporativos.
Istio CNI aborda esta preocupação com a segurança ao mover as responsabilidades de configuração de rede dos containers init individuais dos pods para um plugin CNI ao nível do cluster. Esta abordagem:
-
Melhora a segurança: elimina a necessidade de recursos de rede privilegiados (
NET_ADMIN,NET_RAW) das cargas de trabalho de aplicativos - Simplifica as políticas de segurança do pod: os pods de aplicativos exigem apenas recursos mínimos
- Mantém a funcionalidade: fornece os mesmos recursos de gerenciamento de tráfego que a abordagem tradicional de contêiner init
Quando o Istio CNI está ativado, os pods de aplicação usam um init container mínimo istio-validation que descarta todas as capacidades em vez do container privilegiado istio-init.
Observação
O Istio CNI não substitui o Azure CNI e não interferirá com a sua rede AKS normal. É um plugin independente projetado para gerir a configuração de redirecionamento de tráfego do Istio ao nível do nó, melhorando a segurança ao eliminar a necessidade de contêineres init privilegiados em pods de aplicações.
Antes de começar
Instale a CLI do Azure versão 2.86.0 ou posterior. Você pode executar
az --versionpara verificar a versão. Para instalar ou atualizar, consulte Instalar a CLI do Azure.Você precisa de um cluster AKS com o complemento de malha de serviço baseado em Istio habilitado. Se você não tiver essa configuração, consulte Implantar complemento de malha de serviço baseado em Istio para o Serviço Kubernetes do Azure.
Verifique se a sua malha de serviço do Istio está a usar a revisão
asm-1-25ou posterior. Pode verificar a revisão atual com:az aks show --resource-group <resource-group-name> --name <cluster-name> --query 'serviceMeshProfile.istio.revisions'
Definir variáveis de ambiente
export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>
Ativar Istio CNI
Ativar o Istio CNI numa nova instalação de rede
Pode ativar o Istio CNI ao ativar o complemento de malha de serviço especificando o --proxy-redirection-mechanism parâmetro:
az aks mesh enable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --proxy-redirection-mechanism CNIChaining
Ativar o Istio CNI numa instalação de malha existente
Se já tiver ativado o add-on Istio Service Mesh, pode mudar para o Istio CNI usando o seguinte comando:
az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism CNIChaining
Observação
Os pods existentes não mudam automaticamente para o istio-validation init container. Reinicie as suas implementações após ativar o Istio CNI para que os pods detetem as alterações (por exemplo, kubectl rollout restart deployment/<name>).
Verifique se o Istio CNI está ativado
Use az aks get-credentials para obter as credenciais para seu cluster AKS:
az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}
Depois de ativar o Istio CNI, verifique a instalação verificando se o CNI DaemonSet está em execução:
kubectl get daemonset -n aks-istio-system
Você deve ver o Istio CNI DaemonSet em execução:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
azure-service-mesh-istio-cni-addon-node 3 3 3 3 3 kubernetes.io/os=linux 94s
Implantar cargas de trabalho e verificar o comportamento
Para verificar a melhoria de segurança, você pode implantar o aplicativo de exemplo bookinfo e verificar se as cargas de trabalho usam o contêiner de inicialização segura istio-validation em vez do contêiner privilegiado istio-init .
Implementar aplicação de exemplo
Primeiro, habilite a injeção de sidecar para o namespace padrão:
# Get the current Istio revision
REVISION=$(az aks show --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --query 'serviceMeshProfile.istio.revisions[0]' -o tsv)
# Label the namespace for sidecar injection
kubectl label namespace default istio.io/rev=${REVISION}
Implante o aplicativo de exemplo bookinfo:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml
Verificar o uso seguro do contêiner de inicialização
Verifique se os pods implantados usam o contêiner de inicialização segura istio-validation em vez de istio-init:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
A saída esperada deve mostrar istio-validation como o contentor de inicialização com capacidades removidas:
details-v1-799dc5d847-7x9gl istio-validation {"drop":["ALL"]}
productpage-v1-99d6d698f-89gpj istio-validation {"drop":["ALL"]}
ratings-v1-7545c4bb6c-m7t42 istio-validation {"drop":["ALL"]}
reviews-v1-8679d76d6c-jz4vg istio-validation {"drop":["ALL"]}
reviews-v2-5b9c77895c-b2b7m istio-validation {"drop":["ALL"]}
reviews-v3-5b57874f5f-kk9rt istio-validation {"drop":["ALL"]}
Também pode verificar o YAML de um pod específico para verificar o contexto de segurança:
kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 20 -B 25 "name: istio-validation"
A saída deve mostrar que o istio-validation contêiner init não tem recursos privilegiados:
initContainers:
- args:
…
name: istio-validation
…
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
privileged: false
readOnlyRootFilesystem: true
runAsGroup: 1337
runAsNonRoot: true
runAsUser: 1337
Desativar Istio CNI
Para desativar o Istio CNI e voltar a usar contêineres init tradicionais, use o seguinte comando:
az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism InitContainers
Depois de desativar o Istio CNI:
O DaemonSet CNI será removido:
kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-systemSaída esperada (sem CNI DaemonSet):
Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not foundNovas cargas de trabalho usarão o contêiner init tradicional
istio-initcom recursos de rede. Reinicie todas as implantações existentes para aplicar a alteração.kubectl rollout restart deployment/details-v1 kubectl rollout restart deployment/productpage-v1 kubectl rollout restart deployment/ratings-v1 kubectl rollout restart deployment/reviews-v1 kubectl rollout restart deployment/reviews-v2 kubectl rollout restart deployment/reviews-v3Verifique o nome e os recursos do contêiner de inicialização:
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'A saída prevista deverá exibir
istio-initcom as capacidades de rede:details-v1-57bc58c559-722v8 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} productpage-v1-7bb64f657c-jw6gs istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} ratings-v1-57d5594c75-4zd49 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v1-7fd8f9cd59-mdcf9 istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v2-7b8bdc9cdf-k9qgb istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]} reviews-v3-588854d9d7-s2f7j istio-init {"add":["NET_ADMIN","NET_RAW"],"drop":["ALL"]}