Habilitar o CNI do Istio para complemento de malha de serviço baseado em Istio para o Serviço de Kubernetes do Azure

Este artigo mostra como habilitar o Istio CNI para o complemento de malha de serviço baseado em Istio no AKS (Serviço de Kubernetes do Azure). O Istio CNI melhora a segurança eliminando a necessidade de recursos de rede privilegiados em cargas de trabalho de aplicativo dentro da malha de serviço.

Visão geral

Por padrão, a malha de serviço Istio usa contêineres de inicialização privilegiados (istio-init) em cada pod de aplicativo para configurar o redirecionamento de tráfego de rede para o proxy sidecar Envoy. Esses contêineres de inicialização exigem NET_ADMIN e NET_RAW funcionalidades, que geralmente são sinalizadas como preocupações de segurança em ambientes corporativos.

O Istio CNI aborda essa preocupação de segurança ao mover as responsabilidades da configuração de rede dos contêineres init de pods individuais para um plug-in CNI no nível do cluster. Essa abordagem:

  • Melhora a segurança: remove a necessidade de recursos de rede privilegiados (NET_ADMIN, NET_RAW) de cargas de trabalho do aplicativo
  • Simplifica as políticas de segurança do pod: os pods de aplicativo exigem apenas recursos mínimos
  • Mantém a funcionalidade: fornece os mesmos recursos de gerenciamento de tráfego que a abordagem de contêiner de inicialização tradicional

Quando o Istio CNI está habilitado, os pods de aplicativo usam um contêiner de inicialização mínimo istio-validation que descarta todas as capacidades em vez do contêiner privilegiado istio-init.

Observação

O Istio CNI não é um substituto para o CNI do Azure e não interferirá na rede normal do AKS. Este é um plug-in separado projetado para lidar com a configuração de redirecionamento de tráfego do Istio no nível do nó, melhorando a segurança ao remover a necessidade de contêineres de inicialização privilegiados em pods de aplicativo.

Antes de começar

  • Instale o CLI do Azure versão 2.86.0 ou posterior. Você pode executar az --version para verificar a versão. Para instalar ou atualizar, confira Instalar a CLI do Azure.

  • Você precisa de um cluster do 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 de Kubernetes do Azure.

  • Verifique se a malha de serviços Istio está usando a revisão asm-1-25 ou uma revisão mais recente. Você 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>

Habilitar o Istio CNI

Habilitar o CNI do Istio em uma nova instalação de malha

Você pode habilitar o Istio CNI especificando o parâmetro --proxy-redirection-mechanism ao habilitar o complemento de malha de serviços.

az aks mesh enable --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --proxy-redirection-mechanism CNIChaining

Habilitar o CNI do Istio em uma instalação de malha existente

Se você já tiver o complemento de malha de serviço Istio habilitado, poderá alternar 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 alternarão automaticamente para o istio-validation contêiner de inicialização. Reinicie suas implantações depois de habilitar o Istio CNI para que os pods incorporem a alteração (por exemplo, kubectl rollout restart deployment/<name>).

Verificar se o Istio CNI está habilitado

Use az aks get-credentials para obter as credenciais para o cluster do AKS:

az aks get-credentials --resource-group ${RESOURCE_GROUP} --name ${CLUSTER}

Depois de habilitar o Istio CNI, verifique a instalação verificando se o DaemonSet CNI 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 com istio-init privilégios.

Implantar um aplicativo 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 seguro 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 contêiner inicial 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"]}

Você 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 de inicialização 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

Desabilitar a CNI do Istio

Para desabilitar a CNI do Istio e voltar a usar contêineres de inicialização tradicionais, use o seguinte comando:

az aks mesh proxy-redirection-mechanism --resource-group ${RESOURCE_GROUP} --name ${CLUSTER} --mechanism InitContainers

Depois de desabilitar o Istio CNI:

  1. O DaemonSet CNI será removido:

    kubectl get daemonset azure-service-mesh-istio-cni-addon-node -n aks-istio-system
    

    Saída esperada (sem DaemonSet CNI):

    Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found
    
  2. Novas cargas de trabalho usarão o contêiner de inicialização tradicional istio-init com recursos de rede. Reinicie todas as implantações existentes para aplicar as alterações.

    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-v3
    
  3. Verifique 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 esperada deve exibir istio-init com recursos 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"]}
    

Próximas etapas