Udostępnij przez


Stosowanie taintów węzłów w klastrze usługi Azure Kubernetes Service (AKS)

W tym artykule opisano sposób używania defektów węzłów w klastrze usługi Azure Kubernetes Service (AKS).

Omówienie

Mechanizm planowania usługi AKS jest odpowiedzialny za umieszczanie zasobników na węzłach i opiera się na głównym harmonogramie Kubernetes, kube-scheduler. Można ograniczyć działanie poda do uruchamiania na określonych węzłach, dołączając pody do zestawu węzłów za pomocą koligacji węzłów lub instruując węzeł, aby odrzucił zestaw podów za pomocą taintów węzłów, które współdziałają z harmonogramem AKS.

Zanieczyszczenia węzłów działają poprzez oznaczanie węzła, tak aby harmonizator unikał umieszczania niektórych zasobników na oznaczonych węzłach. Tolerancje można umieścić na zasobniku, aby umożliwić harmonogramowi zaplanowanie tego zasobnika w węźle z pasującym skażeniem. Tainty i tolerancje współdziałają, aby ułatwić kontrolowanie, jak scheduler umieszcza zasobniki na węzłach. Aby uzyskać więcej informacji, zobacz przykładowe przypadki użycia plam i tolerancji.

Taints to pary klucz-wartość z określonym efektem. Istnieją trzy wartości pola efektu podczas używania defektów węzłów: NoExecute, NoSchedulei PreferNoSchedule.

  • NoExecute: Zasobniki działające już w węźle są natychmiast eksmitowane, jeśli nie mają zgodnej tolerancji. Jeśli zasobnik ma zgodną tolerancję, może zostać wykluczony, jeśli tolerationSeconds zostanie określony.
  • NoSchedule: Na tym węźle są umieszczane tylko pody, które mają pasującą tolerancję. Istniejące zasobniki nie są usuwane.
  • PreferNoSchedule: Harmonogram unika umieszczania żadnych zasobników, które nie mają pasującej tolerancji.

Opcje skażenia węzła

Istnieją dwa typy skażeń, które można zastosować do węzłów usługi AKS: skażenia węzłów i skażenia inicjowania węzłów.

  • Defekty węzłów mają pozostać trwale w węźle na potrzeby planowania zasobników z koligacją węzła. Defekty węzłów można dodawać, aktualizować lub usuwać całkowicie tylko przy użyciu interfejsu API usługi AKS.
  • Inicjalizacyjne skazy węzłów są umieszczane na węźle podczas rozruchu i mają być używane tymczasowo, na przykład w scenariuszach, w których może być potrzebny dodatkowy czas na skonfigurowanie węzłów. Można usunąć defekt inicjowania węzła przy użyciu interfejsu API platformy Kubernetes i nie są one gwarantowane podczas cyklu życia węzła. Będą one wyświetlane w nowych replikach węzła, gdy jest skalowany w górę lub we wszystkich replikach po uaktualnieniu węzła. Jeśli chcesz całkowicie usunąć plamy inicjalizacji, możesz je usunąć przy użyciu interfejsu API usługi AKS po usunięciu taintów z węzłów za pomocą interfejsu API Kubernetes. Po usunięciu zanieczyszczeń inicjalizacyjnych ze specyfikacji klastra przy użyciu interfejsu API AKS, nowo utworzone węzły nie posiadają już tych zanieczyszczeń inicjalizacyjnych. Jeśli znacznik inicjalizacji jest nadal obecny na istniejących węzłach, możesz go trwale usunąć, wykonując operację aktualizacji obrazu węzła.

Uwaga

Zabrudzenia węzłów i etykiety stosowane za pomocą interfejsu API puli węzłów usługi AKS nie mogą być modyfikowane za pomocą interfejsu API platformy Kubernetes i na odwrót. Modyfikacje defektów systemowych nie są dozwolone.

Nie dotyczy to defektów inicjowania węzła.

Używanie taintów węzłów

Wymagania wstępne

W tym artykule założono, że masz istniejący klaster AKS. Jeśli potrzebujesz klastra usługi AKS, możesz go utworzyć przy użyciu interfejsu wiersza polecenia platformy Azure, programu Azure PowerShell lub witryny Azure Portal.

Tworzenie puli węzłów z zanieczyszczeniem węzła

  1. Utwórz pulę węzłów z skażeniem lub oznaczeniem przy użyciu polecenia az aks nodepool add i użyj parametru --node-taints, aby określić sku=gpu:NoSchedule dla tego oznaczenia.

    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. Sprawdź stan puli węzłów.

  3. Sprawdź, czy właściwość taint jest ustawiona w węźle.

Aktualizowanie puli węzłów w celu dodania defektu węzła

  1. Zaktualizuj pulę węzłów, aby dodać znacznik węzła za pomocą polecenia az aks nodepool update i użyj parametru --node-taints w celu określenia sku=gpu:NoSchedule tego znacznika.

    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. Sprawdź stan puli węzłów.

  3. Sprawdź, czy parametr taint został ustawiony w węźle.

Używanie parametrów inicjowania węzła (wersja zapoznawcza)

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi z możliwością dobrowolnego wyboru. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną na zasadzie najlepszych starań. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Wymagania wstępne i ograniczenia

  • Potrzebna jest wersja 3.0.0b3 interfejsu wiersza polecenia platformy Azure lub nowsza, zainstalowana i skonfigurowana. Uruchom polecenie az --version, aby dowiedzieć się, jaka wersja jest używana. Jeśli konieczna będzie instalacja lub uaktualnienie, zobacz Instalowanie interfejsu wiersza polecenia platformy Azure.
  • Podczas korzystania z interfejsu API AKS można stosować tainty inicjalizacyjne tylko podczas tworzenia lub uaktualniania klastra. Jeśli używasz szablonu ARM, który spowoduje operację na poziomie klastra zarządzanego, możesz określić cechy inicjalizacyjne węzłów podczas tworzenia i aktualizowania puli węzłów. Operacje na poziomie puli agentów są blokowane, gdy NodeInitializationTaints znajdują się w treści żądania.
  • Nie można zastosować defektów inicjowania do pul węzłów systemu Windows przy użyciu interfejsu wiersza polecenia platformy Azure.

Pobierz poświadczenia do klastra

  • Pobierz poświadczenia dla klastra usługi AKS przy użyciu az aks get-credentials polecenia .

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

Zainstaluj rozszerzenie Azure CLI aks-preview

  • Zarejestruj lub zaktualizuj rozszerzenie aks-preview za pomocą polecenia az extension add lub az extension update.

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

Zarejestruj flagę funkcji NodeInitializationTaintsPreview

  1. Zarejestruj flagę NodeInitializationTaintsPreview funkcji przy użyciu az feature register polecenia .

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

    Wyświetlenie stanu Zarejestrowane trwa kilka minut.

  2. Sprawdź stan rejestracji przy użyciu az feature show polecenia .

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. Gdy stan odzwierciedla Zarejestrowano, odśwież rejestrację dostawcy zasobów Microsoft.ContainerService za pomocą polecenia az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Tworzenie klastra z zanieczyszczeniem inicjacyjnym węzła

  1. Utwórz klaster z zanieczyszczeniem inicjalizacji węzła, używając polecenia az aks create i parametru --node-initialization-taints, aby określić sku=gpu:NoSchedule dla zanieczyszczenia.

    Ważne

    Inicjowanie węzła, które określisz, ma zastosowanie do wszystkich pul węzłów w klastrze. Aby zastosować taint inicjalizacji do określonego węzła, możesz użyć szablonu ARM zamiast interfejsu wiersza polecenia.

    az aks create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --node-count 1 \
        --node-init-taints "sku=gpu:NoSchedule" \
        --generate-ssh-keys
    
  2. Sprawdź stan puli węzłów.

  3. Sprawdź, czy właściwość taint jest ustawiona w węźle.

Aktualizacja klastra w celu dodania skazy inicjalizacji węzła

  1. Zaktualizuj klaster, aby dodać taint inicjalizacji węzła przy użyciu polecenia az aks update i parametru --node-initialization-taints w celu określenia sku=gpu:NoSchedule dla tainta.

    Ważne

    Podczas aktualizowania klastra z użyciem skażenia inicjalizacji węzła, skażenia te mają zastosowanie do wszystkich pul węzłów w klastrze. Jeśli węzły korzystają z zestawu skalowania maszyn wirtualnych, możesz wyświetlić aktualizacje parametrów inicjowania węzła w węźle po zaktualizowaniu modelu zestawu skalowania maszyn wirtualnych węzła (na przykład po operacji uaktualniania wersji obrazu węzła). Znaczniki inicjalizacji nie będą widoczne na węzłach, dopóki nie zostanie uruchomiona operacja, która wyzwala aktualizację modelu VMSS.

    az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-init-taints "sku=gpu:NoSchedule"
    
  2. Sprawdź stan puli węzłów.

  3. Sprawdź, czy właściwość taint jest ustawiona w węźle.

Sprawdź stan puli węzłów

  • Po zastosowaniu znaku węzła lub znaku inicjalizacji sprawdź stan puli węzłów przy użyciu polecenia az aks nodepool list.

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

    Jeśli zastosowano skazy węzłów, następujące przykładowe dane wyjściowe pokazują, że <node-pool-name> pula węzłów ma Creating węzły o określonej wartości nodeTaints:

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

    W przypadku zastosowania parametrów inicjalizacji węzła następujące przykładowe dane wyjściowe pokazują, że <node-pool-name> pula węzłów jest Creating węzłami o określonym parametrze nodeInitializationTaints:

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

Sprawdź, czy właściwość taint jest ustawiona w węźle

  • Sprawdź zabrudzenia węzła i zabrudzenia inicjalizacji węzła w konfiguracji węzła przy użyciu polecenia kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Jeśli zastosowano defekty węzłów, następujące przykładowe dane wyjściowe pokazują, że <node-pool-name> pula węzłów ma określony parametr Taints:

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

Ważne

Jeśli węzły korzystają z VMSS, znaki inicjacji węzła nie będą widoczne na rzeczywistych węzłach w klastrze, dopóki nie nastąpi operacja wyzwalana przez aktualizację modelu VMSS (na przykład uaktualnienie wersji Kubernetes lub uaktualnienie wersji obrazu węzła).

Usuń skazy węzłów

Usuń określone skażenie węzła

  • Usuń zanieczyszczenia węzłów przy użyciu polecenia az aks nodepool update. Następujące przykładowe polecenie usuwa "sku=gpu:NoSchedule" defekt węzła z puli węzłów.

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

Usuń wszystkie defekty węzłów

  • Usuń wszystkie defekty węzłów z puli węzłów przy użyciu az aks nodepool update polecenia . Poniższe przykładowe polecenie usuwa wszystkie defekty węzłów z puli węzłów.

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

Usuwanie defektów inicjowania węzła

Dostępne są następujące opcje usuwania defektów inicjowania węzła z węzła:

  • Tymczasowo usuń tainty inicjalizacyjne węzła przy użyciu interfejsu API Kubernetes. Jeśli usuniesz je w ten sposób, tainty pojawią się ponownie po skalowaniu lub aktualizacji węzła. Nowe węzły nadal mają skażenie inicjalizacji węzła po skalowaniu. Po aktualizacji skazy inicjalizacji węzła pojawiają się na wszystkich węzłach.
  • Usuń trwałe defekty inicjowania węzła przez niezamierzenie węzła przy użyciu interfejsu API platformy Kubernetes, a następnie usunięcie defektu przy użyciu interfejsu API usługi AKS. Po usunięciu parametrów inicjalizacji ze specyfikacji klastra przy użyciu interfejsu API usługi AKS nowo utworzone węzły po operacjach ponownego obrazu nie mają już zaświadczeń inicjowania.

Po usunięciu wszystkich wystąpień skazy inicjalizacji z replik puli węzłów, istniejąca skaza inicjalizacji może ponownie pojawić się po uaktualnieniu wraz z jakimikolwiek nowymi skazami inicjalizacji.

Tymczasowe usunięcie zanieczyszczeń inicjalizacji węzłów

  • Tymczasowo usuń "tainty" inicjalizacji węzła przy użyciu polecenia kubectl taint nodes.

    To polecenie usuwa defekt tylko z określonego węzła. Jeśli chcesz usunąć skazę z każdego węzła w puli węzłów, musisz uruchomić polecenie dla każdego węzła, z którego ta skaza ma zostać usunięta.

    kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
    

    Po usunięciu inicjowanie węzła pojawia się ponownie po przeprowadzeniu skalowania lub uaktualniania węzłów.

Trwałe usuwanie defektów inicjowania węzła

  1. Wykonaj kroki opisane w temacie Tymczasowe usuwanie defektów inicjowania węzła, aby usunąć defekt inicjowania węzła przy użyciu interfejsu API platformy Kubernetes.

  2. Usuń skazę z węzła z użyciem interfejsu API AKS przy użyciu az aks update polecenia. To polecenie usuwa inicjację węzła z każdego węzła w klastrze.

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

Sprawdź, czy defekt został usunięty z węzła

  • Sprawdź zabrudzenia węzła i zabrudzenia inicjalizacji węzła w konfiguracji węzła przy użyciu polecenia kubectl describe node.

    kubectl describe node $NODE_NAME
    

    Jeśli usunięto skażenie węzła, następujące przykładowe dane wyjściowe pokazują, że <node-pool-name> pula węzłów nie ma usuniętego skażenia w Taints:

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

Następne kroki