Anpassen von Apps für Kubernetes-Cluster mit gemischten Betriebssystemen unter Verwendung von Knotenselektoren oder Taints und Toleranzen

Gilt für: Azure Stack HCI und Windows Server

Mit Azure Kubernetes Service (AKS) in Azure Stack HCI und Windows Server können Sie Kubernetes-Cluster mit Linux- und Windows-Knoten ausführen. Für die Verwendung in diesen Clustern mit gemischten Betriebssystemen müssen Sie jedoch kleine Änderungen an Ihren Apps vornehmen. In dieser Schrittanleitung erfahren Sie, wie Sie sicherstellen können, dass Ihre Anwendung entweder mithilfe von Knotenselektoren oder Taints und Toleranzen auf dem richtigen Hostbetriebssystem geplant wird.

Für diese Schrittanleitung werden Grundkenntnisse in Bezug auf die Kubernetes-Konzepte vorausgesetzt. Weitere Informationen finden Sie unter Clusterarchitektur und -workloads von Kubernetes für Azure Kubernetes Service in Azure Stack HCI und Windows Server.

Knotenselektor

Ein Knotenselektor ist ein einfaches Feld in der YAML-Datei der Podspezifikation, mit dem Pods nur auf fehlerfreien Knoten geplant werden können, die mit dem Betriebssystem übereinstimmen. Geben Sie in Ihrer YAML der Podspezifikation einnodeSelector (Windows oder Linux) an, wie in den folgenden Beispielen gezeigt.

kubernetes.io/os = Windows

oder

kubernetes.io/os = Linux

Weitere Informationen zu „nodeSelectors“ finden Sie unter Knotenselektoren.

Taints und Toleranzen

Taints und Toleranzen arbeiten zusammen, um sicherzustellen, dass Pods nicht unbeabsichtigt auf Knoten geplant werden. Ein Knoten kann „verfälscht“ sein, um keine Pods zu akzeptieren, die seinen Taint nicht ausdrücklich durch eine „Toleranz“ in der YAML-Datei der Podspezifikation zu tolerieren.

Windows-Betriebssystemknoten unter AKS in Azure Stack HCI und Windows Server können verfälscht sein, wenn sie über den Befehl New-AksHciNodePool oder New-AksHciCluster erstellt werden. Sie können diese Befehle auch verwenden, um Linux-Betriebssystemknoten mit einem Taint zu versehen. Im folgenden Beispiel wird Windows genutzt.

Führen Sie den folgenden Befehl aus, um einen Windows-Knotenpool mit einem Taint zu erstellen, wenn Sie auch einen neuen Cluster erstellen. Falls Sie bereits über einen vorhandenen Cluster verfügen, dem Sie einen Knotenpool mit einem Taint hinzufügen möchten, können Sie das nächste Beispiel verwenden, in dem der Befehl New-AksHciNodePool genutzt wird.

New-AksHciCluster -name mycluster -nodePoolName taintnp -nodeCount 1 -osType windows -taints sku=Windows:NoSchedule

Führen Sie den folgenden Befehl aus, um einem vorhandenen Cluster einen Knotenpool mit Taint hinzuzufügen:

New-AksHciNodePool -clusterName <cluster-name> -nodePoolNAme taintnp -count 1 -osType windows -taints sku=Windows:NoSchedule

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob die Bereitstellung des Knotenpools mit dem Taint erfolgreich war:

Get-AksHciNodePool -clusterName <cluster-name> -name taintnp

Beispielausgabe

Status       : {Phase, Details}
ClusterName  : mycluster
NodePoolName : taintnp
Version      : v1.20.7-kvapkg.1
OsType       : Windows
NodeCount    : 0
VmSize       : Standard_K8S3_v1
Phase        : Deployed
Taints       : {sku=Windows:NoSchedule}

Sie geben eine Toleranz für einen Pod in der YAML der Podspezifikation an. Die folgende Toleranz weist eine Übereinstimmung mit dem Taint auf, der mit der obigen kubectl-Taintzeile erstellt wurde. Das Ergebnis ist, dass es für einen Pod mit der Toleranz möglich ist, die Planung auf den Knoten mit Taint durchzuführen.

tolerations:
- key: node.kubernetes.io/os
  operator: Equal
  value: Windows
  effect: NoSchedule

Die Schritte in diesem Abschnitt funktionieren gut, wenn Sie die Kontrolle über die von Ihnen bereitgestellten Podspezifikation haben. In einigen Fällen verfügen Benutzer jedoch über eine bereits vorhandene große Anzahl von Bereitstellungen für Linux-Container sowie über ein Ökosystem gängiger Konfigurationen, z. B. Helm-Communitydiagramme. Sie haben keinen Zugriff auf die Podspezifikation, es sei denn, Sie möchten das Diagramm herunterladen und bearbeiten. Wenn Sie diese Helm-Diagramme in einer gemischten Clusterumgebung mit Linux- und Windows-Workerknoten bereitstellen, tritt bei Ihren Anwendungspods der Fehler „ImagePullBackOff“ auf. Beispiel:

C:\>kubectl get pods
NAMESPACE              NAME                                                    READY   STATUS              RESTARTS   AGE
default                nginx-deployment-558fc78868-795dp                       0/1     ImagePullBackOff    0          6m24s
default                nginx-deployment-6b474476c4-gpb77                       0/1     ImagePullBackOff    0          11m

In diesem Fall sollten Sie die Verwendung von Taints betrachten, um dies zu unterstützen: Windows Server-Knoten können mit dem folgenden Schlüssel-Wert-Paar versiert werden: node.kubernetes.io/os=windows:NoSchedule

Weitere Informationen zu Taints und Toleranzen finden Sie unter Taints und Toleranzen.

Nächste Schritte

In dieser Schrittanleitung haben Sie erfahren, wie Sie mithilfe von kubectl Knotenselektoren oder Taints und Toleranzen zu Ihren Kubernetes-Clustern hinzufügen können. Als Nächstes haben Sie folgende Möglichkeiten: