Kontrolowanie usuwania i zakłóceń w rozmieszczaniu zasobów klastra Azure Kubernetes Fleet Manager

Dotyczy: ✔️ Fleet Manager z klastrem hubowym

Administratorzy korzystający z umieszczania zasobów klastra usługi Fleet Manager (CRP) mogą potrzebować usunąć zasoby, które zostały wcześniej umieszczone w klastrach członkowskich. Muszą również upewnić się, że nie zakłócają rozmieszczenia kluczowych zasobów.

W tym artykule wyjaśniono, jak używać obiektów usługi Fleet Manager ClusterResourcePlacementDisruptionBudget i ClusterResourcePlacementEviction do osiągnięcia tych celów.

Note

Jeśli nie znasz jeszcze rozmieszczania zasobów klastra (CRP) w usłudze Fleet Manager, zapoznaj się z koncepcyjnym omówieniem rozmieszczania zasobów przed przeczytaniem tego artykułu.

Usuń umieszczone zasoby

Obiekt ClusterResourcePlacementEviction służy do usuwania zasobów z klastra członkowskiego po propagacji zasobów z klastra centrum Fleet Manager.

Aby pomyślnie wykluczyć zasoby z klastra, należy określić:

  • Nazwa ClusterResourcePlacement obiektu, który propagował zasoby do klastra docelowego.
  • Nazwa klastra docelowego, z którego musimy eksmitować zasoby.

Eksmisję można używać z zasadami umieszczania zasobów klastra PickAll i PickN. Funkcja PickedFixed nie jest obsługiwana, ponieważ można edytować klastry docelowe i ponownie zastosować zasady CRP.

Note

Eksmisja nie gwarantuje, że zasoby nie są ponownie propagowane do klastra członkowskiego przez harmonogram floty. Należy zastosować skazy, aby zapobiec ponownemu wybraniu określonego klastra przez planistę floty.

Rozważmy następujący przykładowy 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

Po zastosowaniu tego CRP możemy sprawdzić stan wdrożenia, aby określić, do jakich klastrów wdrażane są zasoby.

Załóżmy, że rozmieszczenie wybrało dwa klastry o nazwie member-cluster-01 i member-cluster-02, a my ustaliliśmy, że nie chcemy, aby zasoby były wdrożone na member-cluster-02 i chcemy go usunąć.

  1. Utwórz NoSchedule znak, aby zablokować żądania umieszczania dla klastra członkowskiego. Więcej informacji na temat używania taintów znajdziesz w dokumentacji taintów.

    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. Następnie utwórz i zastosuj element ClusterResourcePlacementEviction.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacementEviction
    metadata:
      name: eviction-sample
    spec:
      placementName: crp-app-sample
      clusterName: member-cluster-02
    
  3. Sprawdź, czy określone zasoby są usuwane z klastra member-cluster-02 :

    kubectl get crpe eviction-sample
    

    Co skutkuje następującym wynikiem, z EXECUTED pokazującym True.

    NAME            VALID   EXECUTED
    test-eviction   True    True 
    

Teraz, gdy już wiesz, jak wymusić usunięcie umieszczonych zasobów z klastrów, zobaczmy, jak można chronić kluczowe zasoby przed eksmisji.

Chroń przed eksmisją

Obiekt ClusterResourcePlacementDisruptionBudget chroni przed zamierzonymi zakłóceniami występującymi podczas stosowania ClusterResourcePlacementEviction obiektu do umieszczonego zasobu. Nie chroni przed mimowolnymi zakłóceniami.

Dla przykładu rozmieszczenia zasobów klastra przedstawionego wcześniej w tym artykule, można zdefiniować obiekt budżetu reakcji na zakłócenia w następujący sposób.

Nazwa budżetu zakłóceń musi być zgodna z CRP.

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

Określ jedno z następujących dwóch wzajemnie wykluczających się pól w specyfikacji:

  • maxUnavailable: maksymalna liczba klastrów, w których umieszczanie może być niedostępne z powodu jakichkolwiek zakłóceń.
  • minAvailable: minimalna liczba klastrów, w których umieszczanie jest dostępne pomimo jakiejkolwiek formy zakłóceń.

Oba pola mogą być bezwzględną liczbą klastrów jako liczbą całkowitą lub procentem całkowitej liczby klastrów w flocie.

Podczas określania budżetu zakłóceń dla określonej zasady ClusterResourcePlacement zapoznaj się z następującą macierzą obsługi:

Zasady CRP minAvailable (liczba całkowita) minAvailable (%) maxUnavailable (liczba całkowita) MaxUnavailable (%)
PickFixed ❌ ❌ ❌ ❌
PickAll ✅ ❌ ❌ ❌
PickN ✅ ✅ ✅ ✅

Note

Jeśli utworzysz nieprawidłowy obiekt budżetu zakłóceń dla lokalizacji, wszelkie próby eksmisji kończą się niepowodzeniem.

Sprawdź, czy eksmisja jest zablokowana

Sprawdź, czy skonfigurowany budżet zakłóceń zablokował usunięcie.

kubectl get crpe eviction-sample

W polu EXECUTED jest wyświetlana wartość False, co oznacza, że usunięcie nie zostało zastosowane.

NAME            VALID   EXECUTED
test-eviction   True    False

Aby potwierdzić, że budżet zakłóceń poda zablokował eksmisję poda, uruchom to samo kubectl polecenie i dodaj polecenie -o yaml. Wartość message pokazuje, że budżet zakłóceń zablokował eksmisję.

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

Mimowolne zakłócenia

Budżety zakłóceń rozmieszczenia nie chronią przed mimowolnymi zakłóceniami. Przykłady nieumyślnych zakłóceń to:

  • Harmonogramator Fleet Manager usuwa zasoby z klastra członkowskiego z powodu zmian zasad planowania.
  • Ręcznie usuwasz zasoby obciążenia uruchomione w klastrze członkowskim (nie za pośrednictwem ewikcji lub zaktualizowanego protokołu CRP).
  • Należy ręcznie usunąć obiekt ClusterResourceBinding, który jest wewnętrznym zasobem reprezentującym umieszczanie zasobów w klastrze członkowskim.
  • Obciążenia nie działają prawidłowo w klastrze członkowskim z powodu błędnej konfiguracji lub problemów związanych z klastrem.

Następne kroki