Condividi tramite


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 specificati tolerationSeconds.
  • 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