Używanie przesłonięć zasobów do dostosowywania zasobów wdrożonych przez umieszczanie zasobów usługi Azure Kubernetes Fleet Manager

Dotyczy: ✔️ Fleet Manager z klastrem hubowym

Inteligentne rozmieszczanie zasobów w usłudze Azure Kubernetes Fleet Manager umożliwia wdrożenie tego samego zasobu w wielu klastrach w obrębie floty. Często należy zmodyfikować konfigurację zasobu, aby wymuszać reguły dotyczące zachowania w różnych środowiskach (deweloperskie, testowe, prod). W tym celu usługa Fleet Manager udostępnia przesłonięcia zasobów, które oferują możliwości, które są koncepcyjnie podobne do sposobu użycia szablonów programu Helm i poprawek Kustomize.

Modyfikowanie konfiguracji zasobu jest przydatne w sytuacjach takich jak:

  • Chcesz używać ClusterRole o nazwie secret-reader we wszystkich klastrach, ale w klastrach produkcyjnych mieć dla tej roli bardziej ograniczony zestaw dozwolonych działań.
  • Chcesz użyć tego samego Deployment dla wszystkich klastrów, ale użyj innego obrazu kontenera lub portu w klastrach produkcyjnych.

W tym artykule przedstawiono sposób tworzenia przesłonięć dla zasobów wdrożonych przez umieszczanie zasobów usługi Fleet Manager.

Azure Kubernetes Fleet Manager obsługuje dwa zakresy nadpisania:

  • Zakres klastra: Użyj ClusterResourceOverride z ClusterResourcePlacement do zarządzania zmianami na poziomie infrastruktury przez administratorów floty.
  • Zakres przestrzeni nazw: użyj polecenia ResourceOverride dla ResourcePlacement zespołów aplikacji zarządzających wdrożeniami w określonych przestrzeniach nazw.

Wybierz zakres, który ma zastosowanie do Ciebie z opcji typu zakresu w górnej części artykułu.

Nadpisania zasobów w zakresie klastra

Element ClusterResourceOverride ma następujące właściwości:

  • placement (opcjonalnie): określa ClusterResourcePlacement, z którym skojarzone jest zastąpienie.
  • clusterResourceSelectors: określa zestaw zasobów klastra wybranych do zastąpienia.
  • policy: określa zestaw reguł, które mają być stosowane do wybranych zasobów klastra.

Ważne

Jeśli nie określisz placement, to przesłonięcie ma zastosowanie do wszystkich zasobów, które są zgodne z elementem clusterResourceSelectors i które wdraża dowolny ClusterResourcePlacement. Ten warunek może mieć niezamierzone konsekwencje związane z zasobami i ogólną wydajnością wdrożenia, dlatego określ umiejscowienie.

Poniższy przykład ClusterRole o nazwie secret-reader pokazuje, jak ClusterResourceOverride działa.

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

Wybieranie zasobów klastra

Element ClusterResourceOverride może zawierać co najmniej jeden clusterResourceSelector , aby wybrać, które zasoby mają być zastępowane. Każda z nich clusterResourceSelector obsługuje następujące pola.

  • group: grupa interfejsów API zasobu.
  • version: wersja interfejsu API zasobu.
  • kind: rodzaj zasobu.
  • name: nazwa zasobu.

Uwaga / Notatka

Jeśli wybierzesz przestrzeń nazw w ClusterResourceSelector, przesłonięcia będą dotyczyć wszystkich zasobów w tej przestrzeni.

Korzystając z naszego przykładu ClusterRole, zobaczmy, jak go wybieramy w komponencie ClusterResourceOverride.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
  name: example-cro
spec:
  placement:
    name: sample-placement
  clusterResourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      version: v1
      name: secret-reader

Zastąpienia zasobów w zakresie przestrzeni nazw

Element ResourceOverride ma następujące właściwości:

  • placement (opcjonalnie): określa element ResourcePlacement, z którym powiązane jest zastąpienie.
  • resourceSelectors: określa zestaw zasobów wybranych do zastąpienia.
  • policy: określa zestaw reguł, które mają być stosowane do wybranych zasobów.

Ważne

Jeśli nie określisz placement, przesłonięcia mają zastosowanie do wszystkich zasobów, które są zgodne z elementem resourceSelectors i które dowolny element ResourcePlacement wdraża w tej samej przestrzeni nazw. Ten warunek może mieć niezamierzone skutki dla zasobów i ogólnej wydajności wdrożenia, dlatego określ rozmieszczenie.

Aby zademonstrować, jak ResourceOverride to działa, użyj następującego przykładu Deployment o nazwie nginx-sample.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-sample
  namespace: nginx-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80

Wybieranie zasobów przestrzeni nazw

Element ResourceOverride może zawierać co najmniej jeden resourceSelector , aby wybrać, które zasoby mają być zastępowane. Każda z nich resourceSelector obsługuje następujące pola:

  • group: grupa interfejsów API zasobu.
  • version: wersja interfejsu API zasobu.
  • kind: rodzaj zasobu.
  • name: nazwa zasobu.

Przestrzeń nazw zasobu, który ma zostać zastąpiony, określasz, podając zestaw namespace w elemencie metadata obiektu ResourceOverride.

Korzystając z przykładu Deployment, możesz zobaczyć, jak go wybrać w ResourceOverride.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: nginx-demo
spec:
  placement:
    name: sample-placement
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: nginx-sample

Ważne

  • Jeśli wybierzesz przestrzeń nazw w resourceSelector (kind: Namespace), przesłonięcie będzie dotyczyć wszystkich zasobów w tej przestrzeni nazw.
  • ResourceOverride musi znajdować się w tej samej przestrzeni nazw co zasób, aby go zastąpić.

Teraz, gdy wybrano ten zasób, przyjrzyjmy się, jak skonfigurować zastąpienie za pomocą elementu policy.

Policy

Element policy składa się z zestawu overrideRules , który określa zmiany, które mają być stosowane do wybranych zasobów. Każda z nich overrideRules obsługuje następujące pola:

  • clusterSelector: określa zestaw klastrów, do których ma zastosowanie reguła przesłonięcia.
  • jsonPatchOverrides: określa zmiany, które mają być stosowane do wybranych zasobów.

Selektor klastra

clusterSelector Użyj pola w pliku overrideRules , aby określić klastry, do których ma zastosowanie reguła. Element clusterSelector obsługuje następujące pole:

  • clusterSelectorTerms: lista terminów określających kryteria wybierania klastrów. Każdy termin zawiera pole labelSelector, które definiuje zestaw etykiet do dopasowania.

Ważne

Obsługiwany jest tylko labelSelector w polu clusterSelectorTerms.

Nadpisywanie modyfikacji JSON

Użyj jsonPatchOverrides w overrideRules, aby określić zmiany, które należy zastosować do wybranych zasobów. Właściwość JsonPatch obsługuje następujące pola:

  • op: Operacja do wykonania. Obsługiwane operacje obejmują:

    • add: dodaje nową wartość do określonej ścieżki.
    • remove: usuwa wartość w określonej ścieżce.
    • replace: zastępuje wartość w określonej ścieżce.
  • path: ścieżka do pola do zmodyfikowania. Wskazówki dotyczące określania ścieżek obejmują:

    • Musi zaczynać się od znaku ukośnika (/).
    • Nie można być pustym ani zawierać pustego ciągu.
    • Nie można być polem TypeMeta (/kind lub /apiVersion).
    • Nie można być polem Metadata (/metadata/name lub /metadata/namespace), z wyjątkiem pól /metadata/labels i /metadata/annotations.
    • Nie może być żadnego pola w statusie zasobu.

    Przykłady prawidłowych ścieżek to:

    • /metadata/labels/new-label
    • /metadata/annotations/new-annotation
    • /spec/template/spec/containers/0/resources/limits/cpu
    • /spec/template/spec/containers/0/resources/requests/memory
  • value: wartość do dodania, usunięcia lub zastąpienia. Jeśli op to remove, nie można określić value.

Pola jsonPatchOverrides stosują poprawkę JSON dla wybranych zasobów, postępując zgodnie z RFC 6902.

Rozszerzając nasz przykład, konfigurujesz element policy, aby usunąć czasownik list z obiektu ClusterRole o nazwie secret-reader w klastrach oznaczonych etykietą env:prod.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
  name: example-cro
spec:
  placement:
    name: sample-placement
  clusterResourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      version: v1
      name: secret-reader
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: remove
            path: /rules/0/verbs/2

Rozszerzając nasz przykład, konfigurujesz obiekt policy, aby zastąpić obraz kontenera w Deployment obrazem nginx:1.30.0 dla klastrów z etykietą env: prod.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: nginx-demo
spec:
  placement:
    name: sample-placement
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: test-nginx
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:1.30.0"

Definiowanie wielu przesłonięć

Dodaj wiele pól jsonPatchOverrides do overrideRules, aby zastosować wiele zmian w wybranych zasobach klastra. Oto przykład:

W tym przykładzie usunięto czasowniki list i watch w przykładzie ClusterRole o nazwie secret-reader w klastrach z etykietą env: prod.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
  name: cro-1
spec:
  placement:
    name: sample-placement
  clusterResourceSelectors:
    - group: rbac.authorization.k8s.io
      kind: ClusterRole
      version: v1
      name: secret-reader
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: remove
            path: /rules/0/verbs/2
          - op: remove
            path: /rules/0/verbs/1

Ten przykład zastępuje zarówno obraz kontenera, jak i port w Deployment na 443 dla klastrów z etykietą env: prod.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: nginx-demo
spec:
  placement:
    name: sample-placement
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: test-nginx
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:1.30.0"
          - op: replace
            path: /spec/template/spec/containers/0/ports/0/containerPort
            value: "443"

Zmienne zarezerwowane w poprawce JSON zastępują wartość

Element value reguły zastępowania poprawki JSON zastępuje zmienne zarezerwowane podczas umieszczania. Obecnie obsługiwane zmienne zarezerwowane:

  • ${MEMBER-CLUSTER-NAME}: zastąpiony nazwą elementu memberCluster.

Na przykład, aby utworzyć nazwę hosta usługi Azure DNS zawierającą nazwę klastra, w przykładzie ResourceOverride do klastrów w regionie platformy Azure fleet-clustername-eastus dodawana jest wartość eastus.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: ro-kuard-demo-eastus
  namespace: kuard-demo
spec:
  placement:
    name: crp-kuard-demo
  resourceSelectors:
    -  group: ""
        kind: Service
        version: v1
        name: kuard-svc
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  fleet.azure.com/location: eastus
        jsonPatchOverrides:
          - op: add
            path: /metadata/annotations
            value:
              {"service.beta.kubernetes.io/azure-dns-label-name":"fleet-${MEMBER-CLUSTER-NAME}-eastus"}

Wiele reguł przesłonięcia

Dodaj wiele overrideRules do pola policy, aby zastosować wiele zmian do wybranych zasobów. Oto przykład dla elementu ResourceOverride.

W tym przykładzie Deployment obraz kontenera zostanie zastąpiony następującymi elementami:

  • nginx:1.20.0 obraz ilustrujący klastry z etykietą env: prod.
  • nginx:latest obraz ilustrujący klastry z etykietą env: test.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: ro-1
  namespace: test
spec:
  placement:
    name: sample-placement
  resourceSelectors:
    -  group: apps
       kind: Deployment
       version: v1
       name: test-nginx
  policy:
    overrideRules:
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: prod
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:1.20.0"
      - clusterSelector:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  env: test
        jsonPatchOverrides:
          - op: replace
            path: /spec/template/spec/containers/0/image
            value: "nginx:latest"

Użycie przy umieszczaniu zasobów klastra

  1. Utwórz element , ClusterResourcePlacement aby określić reguły umieszczania dla dystrybucji przesłonięć zasobów klastra w całej infrastrukturze klastra. Poniższy kod jest przykładem. Pamiętaj, aby wybrać odpowiedni zasób.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: crp
    spec:
      resourceSelectors:
        - group: rbac.authorization.k8s.io
          kind: ClusterRole
          version: v1
          name: secret-reader
      policy:
        placementType: PickAll
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      env: prod
    

    W tym przykładzie zasoby są dystrybuowane we wszystkich klastrach oznaczonych etykietą env: prod. Podczas implementowania zmian odpowiednie ClusterResourceOverride konfiguracje mają zastosowanie do wyznaczonych klastrów. Wybór pasującego zasobu roli dla klastra secret-reader wyzwala zastosowanie konfiguracji do klastrów.

  2. Zastosuj element ClusterResourcePlacement przy użyciu kubectl apply polecenia :

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Sprawdź, czy ClusterResourceOverride element został zastosowany do wybranych zasobów, sprawdzając stan ClusterResourcePlacement zasobu za pomocą kubectl describe polecenia :

    kubectl describe clusterresourceplacement crp
    

    Dane wyjściowe powinny przypominać następujący przykład:

    Status:
      Conditions:
        ...
        Last Transition Time:   2024-04-27T04:18:00Z
        Message:                The selected resources are successfully overridden in the 10 clusters
        Observed Generation:    1
        Reason:                 OverriddenSucceeded
        Status:                 True
        Type:                   ClusterResourcePlacementOverridden
        ...
      Observed Resource Index:  0
      Placement Statuses:
        Applicable Cluster Resource Overrides:
          example-cro-0
        Cluster Name:  member-50
        Conditions:
          ...
          Message:               Successfully applied the override rules on the resources
          Observed Generation:   1
          Reason:                OverriddenSucceeded
          Status:                True
          Type:                  Overridden
         ...
    

    Stan ClusterResourcePlacementOverridden wskazuje, czy nadpisanie zasobu zostało pomyślnie zastosowane na wskazane zasoby w klastrach. Każdy klaster przechowuje własną Applicable Cluster Resource Overrides listę. Ta lista zawiera migawkę nadpisania zasobów klastra, jeśli jest to istotne. Poszczególne komunikaty o stanie dla każdego klastra wskazują, czy reguły przesłonięcia zostały pomyślnie zastosowane.

Używanie z umieszczaniem zasobów

  1. Utwórz zasób ClusterResourcePlacement w celu określenia zasad rozmieszczania dla dystrybucji nadpisań zasobów w infrastrukturze klastra. Poniższy kod jest przykładem. Pamiętaj, aby wybrać odpowiednie przestrzenie nazw.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: crp-example
    spec:
      resourceSelectors:
        - group: ""
          kind: Namespace
          name: test-namespace
          version: v1
      policy:
        placementType: PickAll
        affinity:
          clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      env: prod
                - labelSelector:
                    matchLabels:
                      env: test
    

    W tym przykładzie zasoby są dystrybuowane w test-namespace pomiędzy wszystkimi klastrami oznaczonymi etykietami env:prod i env:test. W miarę implementowania zmian odpowiednie ResourceOverride konfiguracje mają zastosowanie do wyznaczonych zasobów. Wybór odpowiedniego zasobu wdrożenia my-deployment wyzwala zastosowanie konfiguracji do wyznaczonych zasobów.

  2. ClusterResourcePlacement Zastosuj zasób przy użyciu kubectl apply polecenia :

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Sprawdź, czy ResourceOverride element został zastosowany do wybranych zasobów, sprawdzając stan ClusterResourcePlacement zasobu za pomocą kubectl describe polecenia :

    kubectl describe clusterresourceplacement crp-example
    

    Dane wyjściowe powinny przypominać następujący przykład:

    Status:
      Conditions:
        ...
        Message:                The selected resources are successfully overridden in the 10 clusters
        Observed Generation:    1
        Reason:                 OverriddenSucceeded
        Status:                 True
        Type:                   ClusterResourcePlacementOverridden
        ...
      Observed Resource Index:  0
      Placement Statuses:
        Applicable Resource Overrides:
          Name:        ro-1-0
          Namespace:   test-namespace
        Cluster Name:  member-50
        Conditions:
          ...
          Last Transition Time:  2024-04-26T22:57:14Z
          Message:               Successfully applied the override rules on the resources
          Observed Generation:   1
          Reason:                OverriddenSucceeded
          Status:                True
          Type:                  Overridden
         ...
    

    Stan ClusterResourcePlacementOverridden wskazuje, czy nadpisanie zasobu zostało pomyślnie zastosowane do wybranych zasobów. Każdy klaster przechowuje własną Applicable Resource Overrides listę. Ta lista zawiera migawkę zasobu po zastąpieniu, jeśli jest to istotne. Poszczególne komunikaty o stanie dla każdego klastra wskazują, czy reguły przesłonięcia zostały pomyślnie zastosowane.