Sdílet prostřednictvím


Použití taintů uzlů v clusteru Azure Kubernetes Service (AKS)

Tento článek popisuje, jak používat tainty uzlů v clusteru Azure Kubernetes Service (AKS).

Přehled

Plánovací mechanismus AKS zodpovídá za umístění podů na uzly a je založený na upstreamovém plánovači Kubernetes, kube-scheduleru. Pod můžete omezit tak, aby běžel na konkrétních uzlech, a to připojením podů k sadě uzlů pomocí preferenčního pravidla uzlů nebo pokynem uzlu, aby odpuzoval sadu podů pomocí taintování uzlů, které pracují s plánovačem AKS.

Tainty uzlů fungují tak, že označí uzel, aby plánovač zabránil umístění určitých podů na označené uzly. Na pod můžete umístit tolerance, aby plánovač mohl naplánovat tento pod na uzel s odpovídajícím taintem. Znečištění a tolerance spolupracují, aby vám pomohly řídit, jak plánovač umístí pody na uzly. Další informace najdete v příkladech použití taintů a tolerancí.

Tainty jsou páry klíč-hodnota s efektem . Pole efektu má při použití taintů uzlů tři hodnoty: NoExecute, NoSchedulea PreferNoSchedule.

  • NoExecute: Pody, které už běží na uzlu, se okamžitě vyřadí, pokud nemají odpovídající toleranci. Pokud má pod odpovídající tolerance, může být vyřazen, pokud tolerationSeconds jsou zadány.
  • NoSchedule: Na tomto uzlu se umístí pouze pody s odpovídajícími tolerancemi. Existující pody se nevyřadí.
  • PreferNoSchedule: Plánovač se vyhne umístění podů, které nemají odpovídající toleranci.

Možnosti taintu uzlu

Existují dva typy taintů uzlů, které se dají použít na uzly AKS: tainty uzlů a inicializační tainty uzlů.

  • Skvrny uzlů by měly zůstat trvale na uzlu pro plánování podů s afinitou uzlu. Tainty uzlů je možné přidat, aktualizovat nebo úplně odebrat pomocí rozhraní API AKS.
  • Inicializační tainty uzlů jsou umístěny do uzlu během spouštění a mají být použity dočasně, například ve scénářích, kdy potřebujete více času na nastavení uzlů. Pomocí Kubernetes API můžete odstranit taint při inicializaci uzlu, nicméně během životního cyklu uzlu jejich přítomnost není zaručena. Zobrazí se na nových replikách uzlu při vertikálním navýšení kapacity nebo na všech replikách při upgradu uzlu. Pokud chcete inicializační tainty úplně odebrat, můžete je odtranit pomocí rozhraní AKS API poté, co odstraníte tainty z uzlů pomocí rozhraní Kubernetes API. Jakmile odeberete tainty inicializace ze specifikace clusteru pomocí rozhraní API AKS, nově vytvořené uzly nepřicházejí s těmito inicializačními tainty. Pokud je inicializační taint stále přítomen na existujících uzlech, můžete jej trvale odebrat provedením upgradu image uzlu.

Poznámka:

Tainty a popisky uzlů použité pomocí rozhraní API fondu uzlů AKS se neupravují z rozhraní API Kubernetes a naopak. Úpravy systémových taintů nejsou povoleny.

To neplatí pro tainty inicializace uzlů.

Použití taintů uzlů

Požadavky

Tento článek předpokládá, že máte existující cluster AKS. Pokud potřebujete cluster AKS, můžete ho vytvořit pomocí Azure CLI, Azure PowerShellu nebo webu Azure Portal.

Vytvořte skupinu uzlů se značkou taint ukazující omezení

  1. Pomocí příkazu vytvořte fond uzlů s taintem az aks nodepool add a pomocí parametru --node-taints zadejte sku=gpu:NoSchedule pro taint.

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-count 1 \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Zkontrolujte stav poolu uzlů.

  3. Zkontrolujte, jestli je taint nastavený na uzlu.

Aktualizujte fond uzlů a přidejte taint uzlu

  1. Aktualizujte fond uzlů, abyste pomocí příkazu az aks nodepool update přidali uzlu taint a pomocí parametru --node-taints určili sku=gpu:NoSchedule účel taintu.

    az aks nodepool update \
        --resource-group $RESOURCE_GROUP_NAME \
        --cluster-name $CLUSTER_NAME \
        --name $NODE_POOL_NAME \
        --node-taints "sku=gpu:NoSchedule" \
        --no-wait
    
  2. Zkontrolujte stav poolu uzlů.

  3. Zkontrolujte, jestli je taint nastavený na uzlu.

Použijte tainty pro inicializaci uzlů (ukázka)

Důležité

Funkce AKS ve verzi Preview jsou k dispozici na samoobslužné bázi, s možností dobrovolného zapojení. Verze Preview jsou poskytovány "tak, jak je" a "tak, jak jsou dostupné", a jsou vyloučeny ze smluv o úrovni služeb a omezené záruky. Verze Preview AKS jsou částečně pokryty zákaznickou podporou na základě maximálního úsilí. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

Předpoklady a omezení

  • Potřebujete nainstalovanou a nakonfigurovanou verzi 3.0.0b3 Azure CLI nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalaci nebo upgrade, přečtěte si téma Instalace Azure CLI.
  • Tainty inicializace lze použít pouze během tvorby nebo upgradu clusteru při použití AKS API. Pokud používáte šablonu ARM, která bude mít za následek operaci na úrovni spravovaného clusteru, můžete během vytváření a aktualizace fondu uzlů určit tainty inicializace uzlů. Operace na úrovni fondu agentů jsou zablokovány, když jsou v textu požadavku přítomny NodeInitializationTaints.
  • Inicializační tainty nemůžete použít u fondů uzlů Windows pomocí Azure CLI.

Získání přihlašovacích údajů pro cluster

  • Pomocí příkazu získejte přihlašovací údaje pro cluster az aks get-credentials AKS.

    az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
    

aks-preview Instalace rozšíření Azure CLI

  • Zaregistrujte nebo aktualizujte rozšíření aks-preview pomocí az extension add příkazu nebo az extension update příkazu.

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

Zaregistrujte příznak funkce NodeInitializationTaintsPreview

  1. Příznak funkce NodeInitializationTaintsPreview zaregistrujte pomocí příkazu az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    Zobrazení stavu Zaregistrované trvá několik minut.

  2. Pomocí příkazu ověřte stav az feature show registrace.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. Jakmile se stav projeví jako zaregistrovaný, aktualizujte registraci poskytovatele prostředků Microsoft.ContainerService pomocí az provider register příkazu.

    az provider register --namespace Microsoft.ContainerService
    

Vytvořte cluster s initiačním taintem uzlu

  1. Vytvořte cluster s taintem inicializace uzlu pomocí příkazu az aks create a parametru --node-initialization-taints pro určení sku=gpu:NoSchedule pro taint.

    Důležité

    Tainty inicializace uzlů, které určíte, platí pro všechny fondy uzlů v klastru. Pokud chcete použít taint inicializace na konkrétní uzel, můžete místo rozhraní příkazového řádku použít šablonu ARM.

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --node-init-taints "sku=gpu:NoSchedule" \
        --generate-ssh-keys
    
  2. Zkontrolujte stav poolu uzlů.

  3. Zkontrolujte, jestli je taint nastavený na uzlu.

Aktualizace clusteru pro přidání taintu pro inicializaci uzlu

  1. Aktualizujte cluster pomocí příkazu az aks update a parametru --node-initialization-taints, abyste přidali taint sku=gpu:NoSchedule pro inicializaci uzlu.

    Důležité

    Při aktualizaci clusteru pomocí taintu inicializace uzlu se tainty vztahují na všechny pooly uzlů v clusteru. Pokud vaše uzly používají VMSS, můžete po aktualizaci modelu VMSS zobrazit aktualizace inicializace taintů uzlů (například po upgradu verze image uzlu). Inicializační tainty se na uzlech nezobrazí, dokud nedojde k operaci, která aktivuje aktualizaci modelu VMSS.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Zkontrolujte stav poolu uzlů.

  3. Zkontrolujte, jestli je taint nastavený na uzlu.

Zkontrolovat stav skupiny uzlů

  • Po aplikaci taintu uzlu nebo inicializačního taintu zkontrolujte stav shluku uzlů pomocí příkazu az aks nodepool list.

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    Pokud jste použili omezení uzlů, následující příklad výstupu ukazuje, že fond uzlů <node-pool-name> obsahuje uzly Creating se zadanými parametry nodeTaints.

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

    Pokud jste použili tainty inicializace uzlu, následující příklad výstupu ukazuje, že fond uzlů <node-pool-name> obsahuje uzly Creating se zadanými nodeInitializationTaints:

    [
      {
        ...
        "count": 1,
        ...
        "name": "<node-pool-name>",
        "orchestratorVersion": "1.15.7",
        ...
        "provisioningState": "Creating",
        ...
        "nodeInitializationTaints":  [
          "sku=gpu:NoSchedule"
        ],
        ...
      },
     ...
    ]
    

Zkontrolujte, jestli je taint nastavený na uzlu.

  • Pomocí příkazu kubectl describe node zkontrolujte tainty uzlů a inicializační tainty uzlů v konfiguraci uzlu.

    kubectl describe node $NODE_NAME
    

    Pokud jste použili uzlové tainty, následující příklad výstupu ukazuje, že <node-pool-name> pool uzlů má zadanou Taints:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: sku=gpu:NoSchedule
        ...
        ],
        ...
     ...
    ]
    

Důležité

Pokud uzly používají VMSS, nebudou tainty inicializace uzlů viditelné na skutečných uzlech v clusteru, dokud nedojde k operaci, která aktivuje aktualizaci modelu VMSS (například upgrade verze Kubernetes nebo upgrade verze image uzlu).

Odebrání taintů uzlů

Odebrání taintu určitého uzlu

  • Pomocí příkazu az aks nodepool update odeberte tainty uzlu. Následující ukázkový příkaz odebere zátěž uzlu "sku=gpu:NoSchedule" z fondu uzlů.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --name $NODE_POOL_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --node-taints "sku=gpu:NoSchedule"
    

Odebrání všech taintů uzlů

  • Odeberte všechny tainty z fondu uzlů pomocí příkazu az aks nodepool update. Následující ukázkový příkaz odebere všechny tainty uzlů z fondu uzlů.

    az aks nodepool update \
    --cluster-name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $NODE_POOL_NAME \
    --node-taints ""
    

Odebrání taintů inicializace uzlů

Z uzlu můžete odebrat tainty inicializace uzlů pomocí následujících možností:

  • Pomocí rozhraní API Kubernetes dočasně odeberte tainty inicializace uzlů. Pokud je tímto způsobem odeberete, tainty se znovu zobrazí po škálování nebo upgradu uzlu. Nové uzly mají po škálování stále taint inicializace uzlu. Tainty inicializace uzlů se zobrazí na všech uzlech po upgradu.
  • Odeberte tainty inicializace uzlů trvale tím, že uzel zrušíte pomocí rozhraní Kubernetes API a pak odeberete taint pomocí rozhraní API AKS. Jakmile se inicializační tainty odeberou ze specifikace clusteru pomocí rozhraní API AKS, nově vytvořené uzly po operacích přeobrazení už nebudou mít inicializační tainty.

Když odeberete všechny výskyty taintu inicializace z replik fondu uzlů, stávající inicializační taint se může znovu objevit po upgradu s novými inicializačními tainty.

Dočasné odebrání taintů inicializace uzlů

  • Dočasně odeberte tainty inicializace uzlů pomocí příkazu kubectl taint nodes.

    Tento příkaz odebere taint pouze ze zadaného uzlu. Pokud chcete odebrat taint z každého uzlu ve fondu uzlů, musíte spustit příkaz pro každý uzel, ze kterého chcete taint odebrat.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    Po odstranění se tainty inicializace uzlu znovu objeví po škálování nebo upgradu uzlu.

Trvalé odebrání taintů inicializace uzlů

  1. Pomocí kroků v části Odebrání taintů inicializace uzlů dočasně odeberte taint inicializace uzlu pomocí rozhraní Kubernetes API.

  2. Odeberte taint z uzlu pomocí příkazu az aks update přes rozhraní API AKS. Tento příkaz odebere značku inicializace uzlu z každého uzlu v klastru.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints ""
    

Zkontrolujte, jestli byl taint odebrán z uzlu.

  • Pomocí příkazu kubectl describe node zkontrolujte tainty uzlů a inicializační tainty uzlů v konfiguraci uzlu.

    kubectl describe node $NODE_NAME
    

    Pokud jste odebrali taint uzlu, ukazuje následující příklad výstupu, že fond uzlů <node-pool-name> nemá odstraněný taint pod Taints:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

Další kroky