Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il sandboxing dei pod in AKS usa Kata Containers per eseguire ogni pod sottoposto a sandboxing in una macchina virtuale (VM) leggera con un proprio kernel guest. Questo limite di calcolo isola il carico di lavoro dal kernel host e dai carichi di lavoro in altre macchine virtuali pod. Per informazioni su architettura, vantaggi e casi d'uso, vedere Panoramica del sandboxing dei pod in Servizio Azure Kubernetes (AKS).
In questo articolo distribuirai il sandboxing dei pod in un cluster AKS Azure Linux nuovo o esistente, distribuirai un'applicazione con il runtime Kata e, facoltativamente, verificherai l'isolamento del kernel.
Prerequisiti
- CLI di Azure versione 2.80.0 o successiva. Eseguire
az --versionper trovare la versione dell'interfaccia della riga di comando di Azure ed eseguireaz upgradeper eseguire l'aggiornamento. Per maggiori dettagli, consulta i passaggi in Installare l'interfaccia della riga di comando di Azure. - Il servizio Azure Kubernetes supporta la sandbox dei pod nella versione 1.27.0 e successive.
- Per gestire un cluster Kubernetes, usare il client
kubectldella riga di comando kubernetes. Azure Cloud Shell includekubectl. È possibile eseguire l'installazionekubectlin locale usando ilaz aks install-clicomando .
Limitazioni
I seguenti vincoli si applicano al sandboxing dei Pod:
- I contenitori Kata potrebbero non raggiungere i limiti di prestazioni delle operazioni di I/O al secondo che i container tradizionali possono raggiungere in File di Azure e unità SSD locali con prestazioni elevate.
- Microsoft Defender per contenitori non supporta la valutazione dei pod di runtime Kata.
- L'accesso alla rete host Kata non è supportato. Non è possibile accedere direttamente alla configurazione di rete host dall'interno della macchina virtuale.
- L'allocazione della CPU e della memoria con il sandbox del pod è diversa da
runc. Ogni pod Kata viene eseguito in una macchina virtuale pod la cui dimensione di memoria fissa è basata sul limite di memoria del pod o il valore predefinito è 512Mi se non si specifica un limite. I limiti della CPU determinano l'allocazione vCPU della macchina virtuale pod e i limiti frazionari vengono arrotondati a un'intera vCPU per tale allocazione. Per ulteriori informazioni, consulta Considerazioni sulla sandbox dei pod. - Il sandboxing dei pod è supportato solo in Azure Linux. Ubuntu e Windows non sono supportati. Per altre informazioni, vedi host di contenitori Linux di Azure per AKS.
- Non è possibile abilitare Federal Information Processing Standard (FIPS) o Avvio attendibile su un pool di nodi che utilizza il sandboxing dei pod. Per ulteriori informazioni, consulta Considerazioni sulla sandbox dei pod.
- L'architettura Arm64 non è supportata su un pool di nodi che utilizza il sandboxing dei pod.
Funzionamento
Il sandboxing dei pod in AKS si basa sul progetto open source Kata Containers. Kata Containers in esecuzione nell'host per contenitori Linux in Azure per il servizio Azure Kubernetes offre isolamento basato su macchina virtuale e un kernel separato per ogni pod. L'isolamento dei pod consente di allocare risorse a ciascun pod senza condividerle con altri Kata Containers o con contenitori del namespace in esecuzione sullo stesso host.
L'architettura della soluzione si basa sui componenti principali seguenti:
- L'host contenitore Linux di Azure per il servizio Azure Kubernetes
- Microsoft Hyper-V Hypervisor
- Cloud-Hypervisor Virtual Machine Monitor (VMM) Open source
- Integrazione con Kata Containers per il runtime
La distribuzione in modalità sandbox dei pod usando Kata Containers è simile al flusso di lavoro standard containerd per distribuire i container. I cluster con sandboxing pod abilitati sono dotati di una classe di runtime specifica a cui è possibile fare riferimento in un manifesto del pod (runtimeClassName: kata-vm-isolation). Per altre informazioni sulle impostazioni predefinite e sulla personalizzazione della classe di runtime, vedere Considerazioni per il sandboxing dei pod.
Per usare questa funzionalità con un pod, l'unica differenza consiste nell'aggiungere runtimeClassNamekata-vm-isolation alla specifica del pod. Quando un pod usa runtimeClasskata-vm-isolation, l'hypervisor avvia una macchina virtuale leggera con il proprio kernel, in modo che il carico di lavoro funzioni.
Creare un cluster con sandbox del pod
Seguire questa procedura per distribuire un cluster del servizio Azure Kubernetes Linux usando l'interfaccia della riga di comando di Azure.
Crea un cluster AKS eseguendo il comando
az aks createcon i parametri seguenti:Parametro Valore obbligatorio Note --workload-runtimeKataVmIsolationAbilita la sandbox dei pod nel pool di nodi. --os-skuAzureLinuxIl sandboxing dei pod supporta solo lo SKU del sistema operativo Azure Linux. --node-vm-sizeDimensioni di vm di seconda generazione che supportano la virtualizzazione annidata Ad esempio, usare una dimensione di macchina virtuale serie Dsv3 . --node-count3Crea tre nodi per questo esempio. Regola il valore del carico di lavoro. L'esempio seguente crea un cluster denominato myAKSCluster con tre nodi in myResourceGroup:
az aks create \ --name myAKSCluster \ --resource-group myResourceGroup \ --os-sku AzureLinux \ --workload-runtime KataVmIsolation \ --node-vm-size Standard_D4s_v3 \ --node-count 3 \ --generate-ssh-keysEseguire il comando seguente per ottenere le credenziali di accesso per il cluster Kubernetes. Usare il
az aks get-credentialscomando e sostituire i valori per il nome del cluster e il nome del gruppo di risorse.az aks get-credentials --resource-group myResourceGroup --name myAKSClusterElenca tutti i Pods in tutti i namespace eseguendo il comando
kubectl get pods.kubectl get pods --all-namespaces
Abilitare il sandboxing dei pod in un cluster esistente
Per usare questa funzionalità con un cluster del servizio Azure Kubernetes esistente, è necessario soddisfare i requisiti seguenti:
Il cluster esegue Kubernetes versione 1.27.0 o successiva.
Usare il comando seguente per abilitare la sandbox dei pod creando un pool di nodi per ospitarlo.
Aggiungere un pool di nodi al cluster del servizio Azure Kubernetes usando il
az aks nodepool addcomando con i parametri seguenti:Parametro Valore obbligatorio Note --resource-groupIl gruppo di risorse che contiene il cluster AKS esistente Ad esempio, usare myResourceGroup.--cluster-nameNome del cluster AKS esistente Ad esempio, usare myAKSCluster.--nameNome univoco del pool di nodi Ad esempio, usare nodepool2.--workload-runtimeKataVmIsolationAbilita la sandbox dei pod nel pool di nodi. --os-skuAzureLinuxIl sandboxing dei pod supporta solo lo SKU del sistema operativo Azure Linux. --node-vm-sizeDimensioni di vm di seconda generazione che supportano la virtualizzazione annidata Ad esempio, usare una dimensione di macchina virtuale serie Dsv3 . --node-count1Crea un nodo per questo esempio. Regola il valore del carico di lavoro. L'esempio seguente aggiunge un pool di nodi a myAKSCluster con un nodo in nodepool2 in myResourceGroup:
az aks nodepool add --cluster-name myAKSCluster --resource-group myResourceGroup --name nodepool2 --os-sku AzureLinux --workload-runtime KataVmIsolation --node-vm-size Standard_D4s_v3 --node-count 1Eseguire il
az aks updatecomando per riconciliare la configurazione del cluster in modo che il cluster riconosca il nuovo pool di nodi con il runtime delKataVmIsolationcarico di lavoro.az aks update --name myAKSCluster --resource-group myResourceGroupVerifica che l'aggiornamento del cluster sia stato completato correttamente e che il pool di nodi per il sandboxing dei pod usi il runtime del carico di lavoro, la SKU del sistema operativo e le dimensioni della VM previste.
az aks show \ --name myAKSCluster \ --resource-group myResourceGroup \ --query provisioningState \ --output tsv az aks nodepool show \ --cluster-name myAKSCluster \ --resource-group myResourceGroup \ --name nodepool2 \ --query "{workloadRuntime:workloadRuntime, osSKU:osSKU, vmSize:vmSize}" \ --output tableLo stato del provisioning del cluster deve essere
Succeeded. L'output del pool di nodi dovrebbe mostrareKataVmIsolation,AzureLinuxe le dimensioni della macchina virtuale selezionate.
Distribuire applicazioni usando il sandbox del pod
Usando la sandbox dei pod, è possibile distribuire una combinazione di pod standard che non usano il runtime Kata insieme ai pod Kata che usano il runtime. Un pod Kata specifica runtimeClassName: kata-vm-isolation nella specifica del pod.
La RuntimeClass seleziona il runtime Kata, ma è anche necessario definire vincoli di pianificazione quando è necessario eseguire i carichi di lavoro su uno specifico pool di nodi per il sandboxing dei Pod. Ad esempio, usare l'etichetta integrata del pool di nodi del servizio Azure Kubernetes in un nodeSelector. Sostituisci nodepool2 con il nome del pool di nodi per il sandboxing dei Pod.
spec:
runtimeClassName: kata-vm-isolation
nodeSelector:
kubernetes.azure.com/agentpool: nodepool2
Per una separazione più netta, puoi applicare un taint al pool di nodi per il sandboxing dei Pod e aggiungere una toleration corrispondente ai carichi di lavoro Kata. Un taint senza una tollerazione corrispondente impedisce ad altri carichi di lavoro di pianificare in tale pool di nodi. Per altre informazioni, vedi Usare i taint dei nodi in un cluster AKS.
Distribuire un'applicazione con il runtime Kata
Per distribuire un pod con il runtime Kata nel cluster AKS, seguire i passaggi seguenti.
Creare un file denominato kata-app.yaml per descrivere il pod kata e quindi incollare il manifesto seguente.
kind: Pod apiVersion: v1 metadata: name: isolated-pod spec: runtimeClassName: kata-vm-isolation containers: - name: kata image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11 command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]Il valore della specifica del pod per
runtimeClassNameèkata-vm-isolation.Distribuire il pod Kubernetes eseguendo il
kubectl applycomando e specificando il file kata-app.yaml :kubectl apply -f kata-app.yamlL'output del comando è simile all'esempio seguente:
pod/isolated-pod created
Verificare l'isolamento del kernel (facoltativo)
- Per confrontare i kernel dei pod Kata e non Kata, creare un file denominato normal-app.yaml. Il manifesto seguente definisce un pod standard senza il runtime Kata:
kind: Pod
apiVersion: v1
metadata:
name: normal-pod
spec:
containers:
- name: non-kata
image: mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
Distribuisci il pod standard utilizzando il comando
kubectl apply.kubectl apply -f normal-app.yamlPer accedere a un contenitore all'interno del cluster AKS, avviare una sessione shell eseguendo il comando
kubectl exec. In questo esempio si accede al contenitore all'interno di un pod isolato.kubectl exec -it isolated-pod -- /bin/shKubectl si connette al cluster, esegue
/bin/shall'interno del primo container diisolated-pode inoltra i flussi di input e output del terminale al processo del container. È anche possibile avviare una sessione della shell nel contenitore che ospita il pod non Kata per visualizzare le differenze.Dopo aver avviato una sessione shell nel container da isolated-pod, eseguire i comandi per verificare che il container kata sia in esecuzione all'interno di una sandbox del pod. Ha una versione del kernel diversa rispetto al container non Kata al di fuori della sandbox.
Per visualizzare la versione del kernel, eseguire il comando seguente:
uname -rL'esempio seguente è simile all'output del kernel sandbox del pod:
[user]/# uname -r 6.6.96.mshv1Avvia una sessione shell per il contenitore da normal-pod per verificare l'output del kernel.
kubectl exec -it normal-pod -- /bin/bashPer visualizzare la versione del kernel, eseguire il comando seguente:
uname -rL'esempio seguente è simile all'output della macchina virtuale che esegue il pod normale, che è un kernel diverso rispetto al pod Kata in esecuzione all'interno della sandbox del pod:
6.6.100.mshv1-1.azl3
Pulire le risorse
Al termine della valutazione di questa funzionalità, elimina le risorse che non ti servono più per evitare addebiti di Azure. Se hai distribuito un nuovo cluster nell'ambito della valutazione o dei test, esegui il comando seguente
az aks deleteper eliminare il cluster AKS.az aks delete --resource-group myResourceGroup --name myAKSClusterSe hai distribuito il sandboxing dei pod su un cluster esistente, puoi rimuovere i pod usando il comando
kubectl delete pod.kubectl get pods kubectl delete pod <kata-pod-name>Per rimuovere le risorse di calcolo della sandbox dei pod, è anche possibile eliminare il pool di nodi Kata usando il
az aks nodepool deletecomando . Prima di eliminare il pool di nodi, assicurarsi che non siano in esecuzione carichi di lavoro da conservare.az aks nodepool delete \ --cluster-name myAKSCluster \ --resource-group myResourceGroup \ --name nodepool2
Passaggi successivi
- Altre informazioni sugli host dedicati di Azure per i nodi con il cluster del servizio Azure Kubernetes per usare l'isolamento hardware e il controllo sugli eventi di manutenzione della piattaforma Azure.
- Per esplorare ulteriormente l'isolamento della sandbox dei pod ed esplorare gli scenari di carico di lavoro, provare i lab di sandboxing dei pod.