Usare i contenitori dei nodi in un servizio Azure Kubernetes abilitato dal cluster Azure Arc
Si applica a: Locale di Azure, versione 23H2
Questo articolo descrive come usare i nodi in un cluster del servizio Azure Kubernetes.
Panoramica
Il meccanismo di pianificazione del servizio Azure Kubernetes è responsabile del posizionamento dei pod nei nodi ed è basato sull'utilità di pianificazione Kubernetes upstream, kube-scheduler. È possibile vincolare un pod per l'esecuzione in nodi specifici indicando al nodo di rifiutare un set di pod usando i nodi che interagiscono con l'utilità di pianificazione del servizio Azure Kubernetes.
I taint nodi funzionano contrassegnando un nodo in modo che l'utilità di pianificazione eviti di posizionare determinati pod nei nodi contrassegnati. È possibile posizionare tolleranze in un pod per consentire all'utilità di pianificazione di pianificare il pod in un nodo con un taint corrispondente. Taint e tolleranze interagiscono per controllare il modo in cui l'utilità di pianificazione inserisce i pod nei nodi. Per altre informazioni, vedere esempi di casi d'uso di taint e tolleranze.
I taint sono coppie chiave-valore con un effetto. Esistono tre valori per il campo dell'effetto quando si usano i taint nodi: NoExecute
, NoSchedule
e PreferNoSchedule
.
NoExecute
: i pod già in esecuzione nel nodo vengono rimossi immediatamente se non hanno una tolleranza corrispondente. Se un pod presenta una tolleranza corrispondente, potrebbe essere rimosso se vengono specificatitolerationSeconds
.NoSchedule
: solo i pod con una tolleranza corrispondente vengono inseriti in questo nodo. I pod esistenti non vengono rimossi.PreferNoSchedule
: l'utilità di pianificazione evita di posizionare i pod che non dispongono di una tolleranza corrispondente.
Operazioni preliminari
- Questo articolo presuppone che sia presente un cluster del servizio Azure Kubernetes esistente. Se è necessario un cluster del servizio Azure Kubernetes, è possibile crearne uno usando l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
- Quando si crea un pool di nodi, è possibile aggiungerlo. Quando si aggiunge un taint, anche tutti i nodi all'interno del pool di nodi ottengono tale taint.
Importante
È necessario aggiungeretaints o etichette ai nodi per l'intero pool di nodi usando az aksarc nodepool
. Non è consigliabile usare kubectl
per applicare i contenitori o le etichette ai singoli nodi in un pool di nodi.
Impostare i contenitori del pool di nodi
Creare un pool di nodi con un taint usando il comando az aksarc nodepool add
. Specificare il nome taintnp
e usare il --node-taints
parametro per specificare sku=gpu:NoSchedule
per il taint:
az aksarc nodepool add \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name taintnp \
--node-count 1 \
--node-taints sku=gpu:NoSchedule \
--no-wait
Controllare lo stato del pool di nodi usando il az aksarc nodepool list
comando :
az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster
L'output di esempio seguente mostra che il taintnp
pool di nodi crea nodi con l'oggetto specificato nodeTaints
:
[
{
...
"count": 1,
...
"name": "taintnp",
...
"provisioningState": "Succeeded",
...
"nodeTaints": [
"sku=gpu:NoSchedule"
],
...
},
...
]
Le informazioni sul taint sono visibili in Kubernetes per la gestione delle regole di pianificazione per i nodi. L'utilità di pianificazione Kubernetes può usare i contenitori e le tolleranze per limitare i carichi di lavoro che possono essere eseguiti nei nodi.
- Un taint viene applicato a un nodo per indicare che possono essere pianificati solo pod specifici.
- Una tollerazione viene quindi applicata a un pod che consente di "tollerare" il taint di un nodo.
Impostare le tolleranze del pool di nodi
Nel passaggio precedente è stato applicato il sku=gpu:NoSchedule
taint al momento della creazione del pool di nodi. Il manifesto YAML di esempio seguente usa una tolleranza per consentire all'utilità di pianificazione Kubernetes di eseguire un pod NGINX in un nodo del pool di nodi:
Creare un file denominato nginx-toleration.yaml e copiare/incollare l'esempio YAML seguente:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine
name: mypod
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 1
memory: 2G
tolerations:
- key: "sku"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
Pianificare il pod usando il comando kubectl apply
:
kubectl apply -f nginx-toleration.yaml
Sono necessari alcuni secondi per pianificare il pod ed eseguire il pull dell'immagine NGINX.
Controllare lo stato usando il kubectl describe pod
comando :
kubectl describe pod mypod
L'output di esempio condensato seguente mostra che viene applicata la sku=gpu:NoSchedule
tolleranza. Nella sezione Eventi l'utilità di pianificazione ha assegnato il pod al moc-lbeof1gn6x3
nodo:
[...]
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
sku=gpu:NoSchedule
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 54s default-scheduler Successfully assigned default/mypod to moc-lbeof1gn6x3
Normal Pulling 53s kubelet Pulling image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine"
Normal Pulled 48s kubelet Successfully pulled image "mcr.microsoft.com/oss/nginx/nginx:1.15.9-alpine" in 3.025148695s (3.025157609s including waiting)
Normal Created 48s kubelet Created container
Normal Started 48s kubelet Started container
Solo i pod con questa tolerazione applicata possono essere pianificati nei nodi in taintnp
. Tutti gli altri pod vengono pianificati nel pool di nodi nodepool1. Se si creano più pool di nodi, è possibile usare taint e tolleranze per limitare i pod pianificati in tali risorse del nodo.
Aggiornare un pool di nodi del cluster per aggiungere un taint del nodo
Aggiornare un cluster per aggiungere un taint del nodo usando il az aksarc update
comando e il --node-taints
parametro da specificare sku=gpu:NoSchedule
per il taint. Tutti i taints esistenti vengono sostituiti con i nuovi valori. I vecchi taints vengono eliminati:
az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"
Passaggi successivi
- Usare le etichette in un cluster del servizio Azure Kubernetes abilitato per Azure Arc.