Dela via


Använda nodtaints i en AKS som är aktiverad av Azure Arc-kluster

Gäller för: Azure Local, version 23H2

Den här artikeln beskriver hur du använder nodtaints i ett AKS-kluster.

Översikt

AKS-schemaläggningsmekanismen ansvarar för att placera poddar på noder och baseras på den överordnade Kubernetes-schemaläggaren kube-scheduler. Du kan begränsa att en podd körs på vissa noder genom att instruera noden att avvisa en uppsättning poddar med hjälp av nodtaints, som interagerar med AKS-schemaläggaren.

Nodtaints fungerar genom att markera en nod så att schemaläggaren undviker att placera vissa poddar på de markerade noderna. Du kan placera toleranser på en podd så att schemaläggaren kan schemalägga podden på en nod med matchande taint. Taints och toleranser fungerar tillsammans för att hjälpa dig att styra hur schemaläggaren placerar poddar på noder. Mer information finns i exempel på användningsfall av taints och toleranser.

Taints är nyckel/värde-par med en effekt. Det finns tre värden för effektfältet när du använder nodtaints: NoExecute, NoScheduleoch PreferNoSchedule.

  • NoExecute: Poddar som redan körs på noden avlägsnas omedelbart om de inte har någon matchande tolerans. Om en podd har en matchande tolerans kan den avlägsnas om tolerationSeconds den anges.
  • NoSchedule: Endast poddar med matchande tolerans placeras på den här noden. Befintliga poddar avlägsnas inte.
  • PreferNoSchedule: Schemaläggaren undviker att placera poddar som inte har någon matchande tolerans.

Innan du börjar

  • Den här artikeln förutsätter att du har ett befintligt AKS-kluster. Om du behöver ett AKS-kluster kan du skapa ett med hjälp av Azure CLI, Azure PowerShell eller Azure Portal.
  • När du skapar en nodpool kan du lägga till taints i den. När du lägger till en taint får alla noder i den nodpoolen också den tainten.

Viktigt!

Du bör lägga till taints eller etiketter i noder för hela nodpoolen med hjälp av az aksarc nodepool. Vi rekommenderar inte att du använder kubectl för att tillämpa taints eller etiketter på enskilda noder i en nodpool.

Ange taints för nodpool

Skapa en nodpool med en taint med kommandot az aksarc nodepool add . Ange namnet taintnp och använd parametern --node-taints för att ange sku=gpu:NoSchedule för taint:

az aksarc nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name taintnp \
    --node-count 1 \
    --node-taints sku=gpu:NoSchedule \
    --no-wait

Kontrollera statusen för nodpoolen az aksarc nodepool list med kommandot :

az aksarc nodepool list -g myResourceGroup --cluster-name myAKSCluster

Följande exempelutdata visar att nodpoolen taintnp skapar noder med angivna nodeTaints:

[
  {
    ...
    "count": 1,
    ...
    "name": "taintnp",
    ...
    "provisioningState": "Succeeded",
    ...
    "nodeTaints":  [
      "sku=gpu:NoSchedule"
    ],
    ...
  },
 ...
]

Taint-informationen visas i Kubernetes för hantering av schemaläggningsregler för noder. Kubernetes-schemaläggaren kan använda taints och toleranser för att begränsa vilka arbetsbelastningar som kan köras på noder.

  • En taint tillämpas på en nod som anger att endast specifika poddar kan schemaläggas på dem.
  • En tolerans tillämpas sedan på en podd som gör att de kan "tolerera" en nods taint.

Ange tolerationer för nodpooler

I föregående steg använde sku=gpu:NoSchedule du taint när du skapade nodpoolen. I följande exempel använder YAML-manifestet en tolerans som gör att Kubernetes-schemaläggaren kan köra en NGINX-podd på en nod i nodpoolen:

Skapa en fil med namnet nginx-toleration.yaml och kopiera/klistra in följande exempel YAML:

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"

Schemalägg podden med kommandot kubectl apply :

kubectl apply -f nginx-toleration.yaml

Det tar några sekunder att schemalägga podden och hämta NGINX-avbildningen.

Kontrollera statusen med kommandot kubectl describe pod :

kubectl describe pod mypod

Följande komprimerade exempelutdata visar att toleransen sku=gpu:NoSchedule tillämpas. I avsnittet Händelser tilldelade schemaläggaren podden till moc-lbeof1gn6x3 noden:

[...]
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

Endast poddar som har den här toleransen tillämpad kan schemaläggas på noder i taintnp. Andra poddar schemaläggs i nodepool1-nodpoolen. Om du skapar fler nodpooler kan du använda taints och toleranser för att begränsa vilka poddar som kan schemaläggas på dessa nodresurser.

Uppdatera en klusternodpool för att lägga till en nodtaint

Uppdatera ett kluster för att lägga till en nodtaint med hjälp av az aksarc update kommandot och parametern --node-taints för att ange sku=gpu:NoSchedule för taint. Alla befintliga taints ersätts med de nya värdena. De gamla tainterna tas bort:

az aksarc update -g myResourceGroup --cluster-name myAKSCluster --name taintnp --node-taints "sku=gpu:NoSchedule"   

Nästa steg