Abilitare Istio CNI per il componente aggiuntivo del service mesh basato su Istio per servizio Azure Kubernetes

Questo articolo illustra come abilitare Istio CNI per il componente aggiuntivo Mesh di servizi basato su Istio nel servizio Azure Kubernetes. Istio CNI migliora la sicurezza eliminando la necessità di funzionalità di rete con privilegi nei carichi di lavoro dell'applicazione all'interno della mesh del servizio.

Informazioni generali

Istio reindirizza il traffico dell'applicazione al proxy sidecar Envoy usando uno dei due meccanismi seguenti:

  • Istio CNI (): un plug-in CNI aCNIChaining livello di cluster configura il reindirizzamento del traffico, quindi i pod dell'applicazione non necessitano di funzionalità di rete con privilegi. Il istio-validation contenitore init viene aggiunto durante l'inserimento sidecar per verificare che il reindirizzamento del traffico sia configurato correttamente.
  • Contenitori Init (InitContainers): ogni pod dell'applicazione usa un contenitore init con privilegi istio-init che richiede NET_ADMIN e NET_RAW funzionalità per configurare il reindirizzamento del traffico. Queste funzionalità spesso generano problemi di sicurezza negli ambienti aziendali.

A partire dalla revisione asm-1-30, Istio CNI è il meccanismo di reindirizzamento predefinito per le nuove installazioni mesh. Per le revisioni da asm-1-25 a asm-1-29, i container init rimangono l'opzione predefinita ed è necessario abilitare esplicitamente Istio CNI. Le revisioni precedenti non supportano Istio CNI.

Istio CNI offre i vantaggi seguenti rispetto ai contenitori init:

  • Migliora la sicurezza: rimuove la necessità di funzionalità di rete con privilegi (NET_ADMIN, NET_RAW) dai carichi di lavoro dell'applicazione
  • Semplifica i criteri di sicurezza dei pod: i pod dell'applicazione richiedono solo funzionalità minime
  • Mantiene la funzionalità: offre le stesse funzionalità di gestione del traffico dell'approccio tradizionale ai contenitori d'inizio.

Annotazioni

Istio CNI non sostituisce Azure CNI e non interferirà con il normale networking di AKS. Si tratta di un plug-in separato progettato per gestire la configurazione del reindirizzamento del traffico di Istio a livello di nodo, migliorando la sicurezza rimuovendo la necessità di contenitori init con privilegi nei pod dell'applicazione.

Prima di iniziare

Impostare le variabili di ambiente

export CLUSTER=<cluster-name>
export RESOURCE_GROUP=<resource-group-name>

Abilitare Istio CNI

Abilitare Istio CNI in una nuova installazione mesh

Per le revisioni asm-1-30 e successive, CNIChaining è il meccanismo predefinito di reindirizzamento del proxy per le nuove installazioni del componente aggiuntivo service mesh. Non è necessario specificare parametri aggiuntivi. Per le revisioni asm-1-25 fino a asm-1-29, abilita esplicitamente Istio CNI specificando il parametro --proxy-redirection-mechanism:

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

Abilitare Istio CNI su un'installazione di rete mesh esistente

Se il componente aggiuntivo Mesh del servizio Istio è già abilitato, è possibile passare a Istio CNI usando il comando seguente:

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

Il asm-1-30 valore predefinito si applica solo alle nuove installazioni, quindi l'aggiornamento di una mesh esistente non modifica il meccanismo di reindirizzamento.

Annotazioni

I pod esistenti non verranno trasferiti automaticamente al contenitore init istio-validation. Riavviare le distribuzioni dopo aver abilitato Istio CNI in modo che i pod rilevino la modifica (ad esempio kubectl rollout restart deployment/<name>).

Verificare che Istio CNI sia abilitato

Usa az aks get-credentials per ottenere le credenziali per il tuo cluster AKS.

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

Dopo aver abilitato Istio CNI, verificare l'installazione controllando che il DaemonSet CNI sia in esecuzione:

kubectl get daemonset -n aks-istio-system

Dovresti vedere Istio CNI DaemonSet in esecuzione:

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

Distribuire i carichi di lavoro e verificare il comportamento

Per verificare il miglioramento della sicurezza, è possibile distribuire l'applicazione di esempio bookinfo e verificare che i carichi di lavoro usino il contenitore init sicuro istio-validation anziché il contenitore con privilegi istio-init .

Distribuire l'applicazione di esempio

Prima di tutto, abilitare l'inserimento sidecar per lo spazio dei nomi predefinito:

# 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}

Distribuire l'applicazione di esempio bookinfo:

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml

Verificare l'uso dell'init container sicuro

Verificare che i pod distribuiti usino il contenitore init istio-validation sicuro anziché istio-init:

kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'

L'output previsto dovrebbe visualizzare istio-validation come il contenitore init con funzionalità rimosse:

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"]}

È anche possibile verificare la presenza di un pod specifico in YAML per verificare il contesto di sicurezza:

kubectl get pod <pod-name> -n <namespace> -o yaml | grep -A 20 -B 25 "name: istio-validation"

L'output dovrebbe indicare che il istio-validation contenitore init non dispone di funzionalità con privilegi:

initContainers:
  - args:
    …
    name: istio-validation
    …
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop:
        - ALL
      privileged: false
      readOnlyRootFilesystem: true
      runAsGroup: 1337
      runAsNonRoot: true
      runAsUser: 1337

Disabilitare Istio CNI

Per disabilitare Istio CNI e tornare all'uso dei contenitori init tradizionali, usare il comando seguente:

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

Dopo aver disabilitato Istio CNI:

  1. Il DaemonSet CNI verrà rimosso:

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

    Output previsto (nessun DaemonSet CNI):

    Error from server (NotFound): daemonsets.apps "azure-service-mesh-istio-cni-addon-node" not found
    
  2. I nuovi carichi di lavoro useranno il contenitore init tradizionale istio-init con funzionalità di rete. Riavviare tutte le distribuzioni esistenti per applicare la modifica:

    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. Verificare il nome e le funzionalità del contenitore init:

    kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.initContainers[0].name}{"\t"}{.spec.initContainers[0].securityContext.capabilities}{"\n"}{end}'
    

    L'output previsto dovrebbe visualizzare istio-init con le funzionalità di rete:

    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"]}
    

Passaggi successivi