Verwenden Sie Ressourcenüberschreibungen, um Ressourcen anzupassen, die durch die Ressourcenplatzierung des Azure Kubernetes Fleet Managers bereitgestellt werden.

Gilt für: ✔️ Flottenmanager mit Hubcluster

Azure Kubernetes Fleet Manager intelligente Ressourcenplatzierung kann dieselbe Ressource für mehrere Cluster in einer Flotte bereitstellen. Häufig müssen Sie die Ressourcenkonfiguration ändern, um Regeln für das Verhalten in verschiedenen Umgebungen (Dev, Test, Prod) zu erzwingen. Zu diesem Zweck bietet Fleet Manager Ressourcenüberschreibungen, die eine Funktion bieten, die konzeptuell ähnlich ist, wie Helm-Vorlagen und Kustomize-Patches verwendet werden.

Das Ändern einer Ressourcenkonfiguration ist in Situationen hilfreich, z. B.:

  • Sie möchten eine ClusterRole mit dem Namen secret-reader für alle Cluster verwenden, aber für die Rolle in Ihren Produktionsclustern nur eine kleinere Auswahl zulässiger Aktionen haben.
  • Sie möchten dasselbe Deployment für alle Cluster verwenden, aber ein anderes Containerimage oder einen anderen Port in Ihren Produktionsclustern verwenden.

In diesem Artikel wird erläutert, wie Sie Außerkraftsetzungen für Ressourcen erstellen, die durch die Ressourcenplatzierung von Fleet Manager bereitgestellt werden.

Azure Kubernetes Fleet Manager unterstützt zwei Bereiche für Außerkraftsetzungen:

  • Clusterbereich: Verwenden Sie ClusterResourceOverride mit ClusterResourcePlacement für Flotten-Administratoren, die Änderungen auf Infrastrukturebene verwalten.
  • Namespace-Bereich: Verwenden Sie ResourceOverride mit ResourcePlacement für Anwendungsteams, die Rollouts innerhalb ihrer spezifischen Namespaces verwalten.

Wählen Sie oben im Artikel unter den Optionen für den Geltungsbereichstyp den für Sie am ehesten zutreffenden Geltungsbereich aus.

Außerkraftsetzungen von Ressourcen im Cluster-Bereich

Ein ClusterResourceOverride hat folgende Eigenschaften:

  • clusterResourceSelectors: Gibt den Satz von Clusterressourcen an, die zum Überschreiben ausgewählt sind.
  • policy: Gibt den Satz von Regeln an, die auf die ausgewählten Clusterressourcen angewendet werden sollen.

Hinweis

Policy Definitionen sind sowohl für Cluster- als auch für Namespace-gebundene Ressourcen identisch.

Das folgende Beispiel ClusterRole namens secret-reader zeigt, wie ClusterResourceOverride funktioniert.

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

Auswählen von Clusterressourcen

Eine ClusterResourceOverride kann einen oder mehrere clusterResourceSelector enthalten, um auszuwählen, welche Ressourcen außer Kraft gesetzt werden sollen. Jede clusterResourceSelector unterstützt die folgenden Felder.

  • group: Die API-Gruppe der Ressource.
  • version: Die API-Version der Ressource.
  • kind: Die Art der Ressource.
  • name: Der Name der Ressource.

Hinweis

Wenn Sie einen Namespace in ClusterResourceSelector auswählen, gilt die Überschreibung für alle Ressourcen im Namespace.

Lassen Sie uns mit unserem Beispiel ClusterRole sehen, wie wir es in einem ClusterResourceOverride auswählen.

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

Überschreibungen von Ressourcen auf Namespaceebene

Ein ResourceOverride hat folgende Eigenschaften:

  • resourceSelectors: Gibt die Menge der Ressourcen an, die zum Überschreiben ausgewählt wurden.
  • policy: Gibt den Satz von Regeln an, die auf die ausgewählten Ressourcen angewendet werden sollen.

Hinweis

Policy Definitionen sind sowohl für Cluster- als auch für Namespace-gebundene Ressourcen identisch.

Um zu demonstrieren, wie ResourceOverride funktioniert, verwenden Sie das folgende Beispiel Deployment namens 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

Auswählen von Namespaceressourcen

Eine ResourceOverride kann einen oder mehrere resourceSelector enthalten, um auszuwählen, welche Ressourcen außer Kraft gesetzt werden sollen. Jede resourceSelector unterstützt die folgenden Felder:

  • group: Die API-Gruppe der Ressource.
  • version: Die API-Version der Ressource.
  • kind: Die Art der Ressource.
  • name: Der Name der Ressource.

Sie legen den Namespace der zu überschreibenden Ressource fest, indem Sie den namespace-Satz im metadata des ResourceOverride angeben.

Anhand des Beispiels Deployment sehen Sie, wie Sie es in ResourceOverride auswählen.

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

Von Bedeutung

  • Wenn Sie einen Namespace in resourceSelector (kind: Namespace) auswählen, gilt die Überschreibung für alle Ressourcen im Namespace.
  • Dies ResourceOverride muss sich im selben Namespace wie die Ressource befinden, die außer Kraft gesetzt werden soll.

Nachdem Sie die Ressource ausgewählt haben, sehen Sie sich an, wie Sie die Überschreibung mithilfe einer policy konfigurieren.

Policy

A policy besteht aus einem Satz von overrideRules, der die Änderungen spezifiziert, die auf die ausgewählten Ressourcen angewendet werden sollen. Jede overrideRules unterstützt die folgenden Felder:

  • clusterSelector: Gibt den Satz von Clustern an, auf den die Außerkraftsetzungsregel angewendet wird.
  • jsonPatchOverrides: Gibt die Änderungen an, die auf die ausgewählten Ressourcen angewendet werden sollen.

Clusterauswahl

Verwenden Sie das clusterSelector Feld, overrideRules um die Cluster anzugeben, für die die Regel gilt. clusterSelector unterstützt das folgende Feld:

  • clusterSelectorTerms: Eine Liste mit Begriffen, die die Kriterien für die Auswahl von Clustern angeben. Jeder Ausdruck enthält ein labelSelector Feld, das eine Reihe von Beschriftungen definiert, die übereinstimmen sollen.

Von Bedeutung

Nur labelSelector wird im clusterSelectorTerms Feld unterstützt.

JSON-Patchaußerkraftsetzungen

Verwenden Sie jsonPatchOverrides in overrideRules, um die Änderungen anzugeben, die auf die ausgewählten Ressourcen angewendet werden sollen. Die JsonPatch Eigenschaft unterstützt die folgenden Felder:

  • op: Der auszuführende Vorgang. Zu den unterstützten Vorgängen gehören:

    • add: Fügt dem angegebenen Pfad einen neuen Wert hinzu.
    • remove: Entfernt den Wert am angegebenen Pfad.
    • replace: Ersetzt den Wert im angegebenen Pfad.
  • path: Der Pfad zum zu ändernden Feld. Anleitungen zum Angeben von Pfaden umfassen:

    • Muss mit einem Schrägstrich (/) beginnen.
    • Darf nicht leer sein oder eine leere Zeichenfolge enthalten.
    • Es kann sich nicht um ein TypeMeta Feld (/kind oder /apiVersion) handeln.
    • Es kann kein Metadata-Feld (/metadata/name oder /metadata/namespace) sein, außer den Feldern /metadata/labels und /metadata/annotations.
    • Kein Feld darf im Status der Ressource vorhanden sein.

    Beispiele für gültige Pfade sind:

    • /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: Der Wert, der hinzugefügt, entfernt oder ersetzt werden soll. Wenn op ist remove, können Sie value nicht angeben.

Die jsonPatchOverrides Felder wenden einen JSON-Patch auf die ausgewählten Ressourcen an, indem sie RFC 6902 folgen.

Um unser Beispiel zu erweitern, konfigurieren Sie ein policy, um das Verb list aus dem ClusterRole namens secret-reader auf Clustern mit der Bezeichnung env:prod zu entfernen.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
  name: example-cro
spec:
  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

Zur Erweiterung unseres Beispiels konfigurieren Sie ein policy, um das Container-Image im Deployment für Cluster mit dem Label nginx:1.30.0 durch das Image env: prod zu ersetzen.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: nginx-demo
spec:
  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"

Definieren mehrerer Außerkraftsetzungen

Fügen Sie mehrere jsonPatchOverrides-Felder zu overrideRules hinzu, um mehrere Änderungen an ausgewählten Cluster-Ressourcen vorzunehmen. Ein Beispiel:

In diesem Beispiel werden die Verben list und watch im Sample ClusterRole namens secret-reader auf Clustern mit der Bezeichnung env: prod entfernt.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourceOverride
metadata:
  name: cro-1
spec:
  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

In diesem Beispiel werden sowohl das Container-Image als auch der Port in Deployment durch 443 für Cluster mit der env: prod-Kennzeichnung ersetzt.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: example-resource-override
  namespace: nginx-demo
spec:
  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"

Reservierte Variablen im JSON-Patch-Überschreibungswert

Die value Regel zum Außerkraftsetzen des JSON-Patches ersetzt reservierte Variablen bei der Platzierung. Derzeit unterstützte reservierte Variablen:

  • ${MEMBER-CLUSTER-NAME}: ersetzt durch den Namen der memberCluster.

Wenn Sie beispielsweise einen Azure DNS-Hostnamen erstellen möchten, der den Namen des Clusters enthält, fügt das Beispiel ResourceOverride auf Clustern in der Azure-Region fleet-clustername-eastus den Wert eastus hinzu.

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"}

Mehrere Außerkraftsetzungsregeln

Fügen Sie ein Vielfaches overrideRules zu einem policy Feld hinzu, um mehrere Änderungen auf die ausgewählten Ressourcen anzuwenden. Hier ist ein Beispiel für ResourceOverride.

In diesem Beispiel wird das Container-Image in der Deployment durch folgendes ersetzt:

  • Das nginx:1.20.0 Bild für Cluster mit der env: prod Beschriftung.
  • Das nginx:latest Bild für Cluster mit der env: test Beschriftung.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourceOverride
metadata:
  name: ro-1
  namespace: test
spec:
  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"

Verwendung mit Platzierung von Cluster-Ressourcen

  1. Erstellen Sie eine ClusterResourcePlacement, um die Platzierungsregeln für die Verteilung der Cluster-Ressourcenaußerkraftsetzungen über die Clusterinfrastruktur hinweg anzugeben. Hier ein Beispielcode: Achten Sie darauf, die entsprechende Ressource auszuwählen.

    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
    

    In diesem Beispiel werden Ressourcen auf alle Cluster verteilt, die mit env: prodeiner Bezeichnung versehen sind. Wenn die Änderungen implementiert werden, werden die entsprechenden ClusterResourceOverride Konfigurationen auf die angegebenen Cluster angewendet. Die Auswahl einer übereinstimmenden Cluster-Rolle-Ressource secret-reader löst die Anwendung der Konfigurationen auf die Cluster aus.

  2. Wenden Sie ClusterResourcePlacement mithilfe des Befehls kubectl apply an.

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Stellen Sie sicher, dass die ClusterResourceOverride Auf die ausgewählten Ressourcen angewendet wurde, indem Sie den Status der ClusterResourcePlacement Ressource über den kubectl describe Befehl überprüfen:

    kubectl describe clusterresourceplacement crp
    

    Ihre Ausgabe sollte dem folgenden Beispiel ähneln:

    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
         ...
    

    Die ClusterResourcePlacementOverridden Bedingung gibt an, ob die Außerkraftsetzung der Ressource erfolgreich auf die ausgewählten Ressourcen in den Clustern angewendet wurde. Jeder Cluster verwaltet eine eigene Applicable Cluster Resource Overrides Liste. Diese Liste enthält die Momentaufnahme der Außerkraftsetzung von Clusterressourcen, sofern relevant. Einzelne Statusmeldungen für jeden Cluster geben an, ob die Außerkraftsetzungsregeln erfolgreich angewendet wurden.

Verwendung mit Platzierung von Ressourcen

  1. Erstellen Sie eine ClusterResourcePlacement Ressource, um die Platzierungsregeln für die Verteilung der Ressourcenüberschreibungen über die Clusterinfrastruktur anzugeben. Hier ein Beispielcode: Achten Sie darauf, die entsprechenden Namespaces auszuwählen.

    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
    

    In diesem Beispiel werden Ressourcen innerhalb von test-namespace auf alle Cluster verteilt, die mit env:prod und env:test gekennzeichnet sind. Wenn die Änderungen implementiert werden, werden die entsprechenden ResourceOverride Konfigurationen auf die festgelegten Ressourcen angewendet. Die Auswahl einer übereinstimmenden Bereitstellungsressource my-deploymentlöst die Anwendung der Konfigurationen auf die vorgesehenen Ressourcen aus.

  2. Wenden Sie die ClusterResourcePlacement Ressource mithilfe des Befehls an kubectl apply :

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Stellen Sie sicher, dass die ResourceOverride Auf die ausgewählten Ressourcen angewendet wurde, indem Sie den Status der ClusterResourcePlacement Ressource über den kubectl describe Befehl überprüfen:

    kubectl describe clusterresourceplacement crp-example
    

    Ihre Ausgabe sollte dem folgenden Beispiel ähneln:

    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
         ...
    

    Die ClusterResourcePlacementOverridden Bedingung gibt an, ob die Außerkraftsetzung der Ressource erfolgreich auf die ausgewählten Ressourcen angewendet wurde. Jeder Cluster verwaltet eine eigene Applicable Resource Overrides Liste. Diese Liste enthält den Ressourcenüberschreibungs-Snapshot, falls relevant. Einzelne Statusmeldungen für jeden Cluster geben an, ob die Außerkraftsetzungsregeln erfolgreich angewendet wurden.