Steuern von Entfernung und Unterbrechung bei der Platzierung von Clusterressourcen von Azure Kubernetes Fleet Manager

Gilt für: ✔️ Flottenmanager mit Hubcluster

Administratoren, die die Clusterressourcenplatzierung (Cluster Resource Placement, CRP) von Fleet Manager verwenden, müssen möglicherweise Ressourcen entfernen, die sie zuvor auf Memberclustern platziert haben. Außerdem müssen sie sicherstellen, dass sie die Platzierung wichtiger Ressourcen nicht beeinträchtigen.

In diesem Artikel wird erläutert, wie Sie die ClusterResourcePlacementEviction- und ClusterResourcePlacementDisruptionBudget-Objekte von Fleet Manager verwenden, um diese Ziele zu erreichen.

Note

Wenn Sie noch nicht mit der Clusterressourcenplatzierung von Fleet Manager (CRP) vertraut sind, lesen Sie die konzeptionelle Übersicht über die Ressourcenplatzierung , bevor Sie diesen Artikel lesen.

Räumen platzierter Ressourcen

Ein ClusterResourcePlacementEviction Objekt wird verwendet, um Ressourcen aus einem Mitgliedscluster zu entfernen, sobald die Ressourcen vom Fleet Manager-Hubcluster übertragen wurden.

Zum erfolgreichen Auslagern von Ressourcen aus einem Cluster müssen Sie Folgendes angeben:

  • Der Name des ClusterResourcePlacement Objekts, das Ressourcen an den Zielcluster verteilt hat.
  • Der Name des Zielclusters, aus dem ressourcen entfernt werden müssen.

Sie können für das Entfernen die Richtlinien PickAll und PickN der Clusterressourcenplatzierung verwenden. PickedFixed wird nicht unterstützt, da Sie die Zielcluster bearbeiten und die CRP erneut anwenden können.

Note

Entfernung garantiert nicht, dass Ressourcen nicht erneut vom Flottenplaner an einen Mitgliedscluster verteilt werden. Sie müssenTaints anwenden, um zu verhindern, dass der Flottenplaner wieder einen bestimmten Cluster auswählt.

Betrachten Sie das folgende Beispiel-CRP.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-app-sample
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-namespace
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 2
    affinity:
      clusterAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  fleet.azure.com/location: westus

Nach der Anwendung dieses CRP können wir den Platzierungsstatus überprüfen , um zu bestimmen, für welche Cluster die Ressourcen bereitgestellt werden.

Angenommen, die Platzierung hat die beiden Cluster member-cluster-01 und member-cluster-02 ausgewählt, aber Sie möchten, dass die Ressourcen nicht in member-cluster-02 bereitgestellt werden und beschließen daher, sie zu entfernen.

  1. Erstellen Sie einen NoSchedule-Taint, um die Platzierungsanforderungen für den Mitgliedscluster zu blockieren. Weitere Informationen zur Verwendung von Taints finden Sie in der Dokumentation zu den Taints.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: MemberCluster
    metadata:
      name: member-cluster-02
    spec:
      identity:
        name: fleet-member-agent-cluster-2
        kind: ServiceAccount
        namespace: fleet-system
        apiGroup: ""
      taints:                   
        - key: any-key
          value: any-value
          effect: NoSchedule
    
  2. Erstellen Sie als Nächstes eine ClusterResourcePlacementEviction, und wenden Sie sie an.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacementEviction
    metadata:
      name: eviction-sample
    spec:
      placementName: crp-app-sample
      clusterName: member-cluster-02
    
  3. Überprüfen Sie, ob die angegebenen Ressourcen aus dem member-cluster-02 Cluster entfernt werden:

    kubectl get crpe eviction-sample
    

    Dies führt zu der folgenden Ausgabe, wobei EXECUTEDTrue zeigt.

    NAME            VALID   EXECUTED
    test-eviction   True    True 
    

Nachdem Sie nun verstehen, wie Sie das Entfernen von platzierten Ressourcen aus Clustern erzwingen, sehen wir uns an, wie Sie wichtige Ressourcen vor Löschung schützen können.

Schutz vor Entfernung

Das ClusterResourcePlacementDisruptionBudget-Objekt schützt vor beabsichtigten Unterbrechungen, die auftreten, wenn Sie ein ClusterResourcePlacementEviction-Objekt auf eine platzierte Ressource anwenden. Es schützt nicht vor unbeabsichtigten Unterbrechungen.

Für die oben in diesem Artikel gezeigte Beispiel-Clusterressourcenplatzierung können Sie ein Budgetobjekt für Platzierungsunterbrechungen wie folgt definieren.

Der Name des Unterbrechungsbudgets muss mit dem CRP übereinstimmen.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacementDisruptionBudget
metadata:
  name: crp-app-sample
spec:
  minAvailable: 1

Geben Sie eines der folgenden beiden sich gegenseitig ausschließenden Felder in der Spezifikation an:

  • maxUnavailable: Die maximale Anzahl von Clustern, in denen eine Platzierung aufgrund einer beliebigen Form von Unterbrechungen nicht verfügbar sein kann.
  • minAvailable: Die Mindestanzahl der Cluster, in denen Platzierungen trotz jeglicher Form von Unterbrechungen verfügbar sind.

Beide Felder können entweder eine absolute Anzahl von Clustern als ganze Zahl oder ein Prozentsatz der Gesamtzahl der Cluster in der Flotte sein.

Wenn Sie ein Unterbrechungsbudget für eine bestimmte ClusterResourcePlacement Richtlinie angeben, lesen Sie die folgende Supportmatrix:

CRP-Richtlinie minAvailable (ganze Zahl) minAvailable (%) maxUnavailable (ganze Zahl) MaxUnavailable (%)
PickFixed ❌ ❌ ❌ ❌
PickAll ✅ ❌ ❌ ❌
PickN ✅ ✅ ✅ ✅

Note

Wenn Sie ein ungültiges Unterbrechungsbudgetobjekt für eine Platzierung erstellen, führen alle Entfernungsversuche zu Fehlern.

Überprüfen, ob die Zwangsräumung blockiert ist

Überprüfen Sie, ob ein konfiguriertes PodDisruptionBudget eine Eviction blockiert hat.

kubectl get crpe eviction-sample

Im EXECUTED-Feld wird False angezeigt, was bedeutet, dass die Entfernung nicht angewendet wurde.

NAME            VALID   EXECUTED
test-eviction   True    False

Führen Sie denselben kubectl-Befehl aus und fügen Sie -o yaml hinzu, um zu bestätigen, dass das Disruptions-Budget die Entfernung verhindert hat. Der message-Wert zeigt das Unterbrechungsbudget an, das die Entfernung blockiert hat.

status:
  conditions:
  - lastTransitionTime: "2025-01-21T15:52:29Z"
    message: Eviction is valid
    observedGeneration: 1
    reason: ClusterResourcePlacementEvictionValid
    status: "True"
    type: Valid
  - lastTransitionTime: "2025-01-21T15:52:29Z"
    message: 'Eviction is blocked by specified ClusterResourcePlacementDisruptionBudget,
      availablePlacements: 1, totalPlacements: 1'
    observedGeneration: 1
    reason: ClusterResourcePlacementEvictionNotExecuted
    status: "False"
    type: Executed

Unfreiwillige Unterbrechung

Platzierungs-Disruptions-Budgets schützen nicht vor ungeplanten Unterbrechungen. Beispiele für unfreiwillige Unterbrechungen sind:

  • Der Fleet Manager-Planer entfernt Ressourcen aus einem Mitgliedscluster aufgrund von Planungsrichtlinienänderungen.
  • Sie löschen Workloadressourcen, die auf einem Mitgliedscluster ausgeführt werden, manuell (nicht durch Entfernung oder aktualisierte CRP).
  • Sie löschen manuell ein ClusterResourceBinding Objekt, bei dem es sich um eine interne Ressource handelt, die die Platzierung von Ressourcen in einem Membercluster darstellt.
  • Workloads werden aufgrund falscher Konfiguration oder clusterbezogener Probleme nicht ordnungsgemäß auf einem Membercluster ausgeführt.

Nächste Schritte