Gebruik Resource-overschrijvingen om resources aan te passen die zijn geïmplementeerd door Azure Kubernetes Fleet Manager resource plaatsing.

Van toepassing op: ✔️ Fleet Manager met hubcluster

De intelligente plaatsing van hulpbronnen in Azure Kubernetes Fleet Manager kan worden gebruikt om dezelfde hulpbron naar meerdere clusters binnen een vloot uit te rollen. Vaak is het nodig om de resourceconfiguratie te wijzigen om regels rond gedrag in verschillende omgevingen af te dwingen (dev, test, prod). Voor dit doel biedt Fleet Manager resourceoverschrijvingen, die een mogelijkheid bieden die conceptueel vergelijkbaar is met de manier waarop Helm-sjablonen en Kustomize-patches worden gebruikt.

Voorbeelden van situaties waarin het wijzigen van een resourceconfiguratie nuttig is, zijn onder andere:

  • Ik wil een ClusterRole genaamd secret-reader gebruiken op alle clusters, maar wil een kleinere set toegestane acties voor de rol in mijn productieclusters.
  • Ik wil hetzelfde Deployment gebruiken op alle clusters, maar een andere containerimage of poort gebruiken op mijn productieclusters.

In dit artikel wordt uitgelegd hoe u overschrijvingen maakt voor resources die door Fleet Manager resource-placement zijn geïmplementeerd.

Azure Kubernetes Fleet Manager ondersteunt twee bereiken voor overschrijvingen:

  • Clusterbereik: gebruik ClusterResourceOverride met ClusterResourcePlacement voor beheerders van vloten die wijzigingen op infrastructuurniveau beheren.
  • Specifieke naamruimte: gebruik ResourceOverride met ResourcePlacement voor applicatieteams die implementaties beheren binnen hun specifieke naamruimten.

U kunt het bereik selecteren dat het meest op u van toepassing is in de opties voor het bereiktype bovenaan het artikel.

Cluster-gebaseerde resource-overschrijvingen

A ClusterResourceOverride heeft de volgende eigenschappen:

  • clusterResourceSelectors: Hiermee geeft u de set clusterbronnen op die is geselecteerd voor het overschrijven.
  • policy: Hiermee geeft u de set regels op die moeten worden toegepast op de geselecteerde clusterbronnen.

Opmerking

Policy definities zijn hetzelfde voor zowel cluster- als naamruimtebronnen.

Laten we het volgende voorbeeld ClusterRole met de naam secret-reader gebruiken om te laten zien hoe ClusterResourceOverride het werkt.

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

Clusterbronnen selecteren

Een ClusterResourceOverride kan een of meer clusterResourceSelector bevatten om te kiezen welke resources u wilt overschrijven. Elk clusterResourceSelector ondersteunt de volgende velden.

  • group: De API-groep van de resource.
  • version: de API-versie van de resource.
  • kind: Het type bron.
  • name: De naam van de resource.

Opmerking

Als u een naamruimte in ClusterResourceSelector selecteert, is de overschrijving van toepassing op alle resources in de naamruimte.

Laten we met behulp van ons voorbeeld ClusterRolezien hoe we deze selecteren in een ClusterResourceOverride.

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

Overschrijvingen van resourcebereik in naamruimte (preview)

A ResourceOverride heeft de volgende eigenschappen:

  • resourceSelectors: Hiermee geeft u de set resources op die zijn geselecteerd voor het overschrijven.
  • policy: Hiermee geeft u de set regels op die moeten worden toegepast op de geselecteerde resources.

Opmerking

Policy definities zijn hetzelfde voor zowel cluster- als naamruimtebronnen.

Laten we het volgende voorbeeld Deployment met de naam nginx-sample gebruiken om te laten zien hoe ResourceOverride het werkt.

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

Naamruimtebronnen selecteren

Een ResourceOverride kan een of meer resourceSelector bevatten om te kiezen welke resources u wilt overschrijven. Elk resourceSelector ondersteunt de volgende velden.

  • group: De API-groep van de resource.
  • version: de API-versie van de resource.
  • kind: Het type bron.
  • name: De naam van de resource.

De naamruimte van de te overschrijven resource wordt bepaald door de namespace set op te geven in de metadata van de ResourceOverride.

Laten we met behulp van ons voorbeeld Deploymentzien hoe we deze selecteren in een ResourceOverride.

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

Belangrijk

  • Als u een naamruimte in resourceSelector (kind: Namespace) selecteert, is de overschrijving van toepassing op alle resources in de naamruimte.
  • De ResourceOverride moet zich in dezelfde naamruimte bevinden als de resource die moet worden overschreven.

Nu hebben we de resource geselecteerd. Laten we kijken hoe we de override configureren met behulp van een policy.

Policy

Een policy bestaat uit een set overrideRules die de wijzigingen opgeeft die moeten worden toegepast op de geselecteerde resources. Elk overrideRules ondersteunt de volgende velden:

  • clusterSelector: Hiermee specificeert u de set clusters waarop de overschrijvingsregel van toepassing is.
  • jsonPatchOverrides: Hiermee geeft u de wijzigingen op die moeten worden toegepast op de geselecteerde resources.

Clusterselector

U kunt het clusterSelector veld in het overrideRules veld gebruiken om de clusters op te geven waarop de regel van toepassing is. Het clusterSelector ondersteunt het volgende veld:

  • clusterSelectorTerms: Een lijst met termen die de criteria voor het selecteren van clusters opgeven. Elke term bevat een labelSelector veld dat een set labels definieert die overeenkomen.

Belangrijk

Alleen labelSelector wordt ondersteund in het clusterSelectorTerms veld.

JSON-patchoverschrijvingen

U kunt jsonPatchOverrides in overrideRules gebruiken om de wijzigingen op te geven die moeten worden toegepast op de geselecteerde resources. De JsonPatch eigenschap ondersteunt de volgende velden:

  • op: De bewerking die moet worden uitgevoerd. Ondersteunde bewerkingen zijn onder andere:

    • add: Voegt een nieuwe waarde toe aan het opgegeven pad.
    • remove: Hiermee verwijdert u de waarde op het opgegeven pad.
    • replace: vervangt de waarde op het opgegeven pad.
  • path: het pad naar het veld dat u wilt wijzigen. Richtlijnen voor het opgeven van paden zijn onder andere:

    • Moet beginnen met een slash (/) teken.
    • Kan niet leeg zijn of een lege tekst bevatten.
    • Kan geen TypeMeta veld (/kind of /apiVersion) zijn.
    • Kan geen Metadata veld (/metadata/name of /metadata/namespace), behalve de velden /metadata/labels en /metadata/annotations.
    • Er mag geen enkel veld in de status van de resource zijn.

    Voorbeelden van geldige paden zijn:

    • /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: de waarde die moet worden toegevoegd, verwijderd of vervangen. Als opremove is, kunt u value niet specificeren.

De jsonPatchOverrides velden passen een JSON-patch toe op de geselecteerde resources door RFC 6902 te volgen.

Als we ons voorbeeld uitbouwen, configureren we een policy om het list werkwoord te verwijderen uit de ClusterRole genaamd binnen secret-reader clusters met het env:prod label.

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

Bij het uitbreiden van ons voorbeeld, configureren we een policy om de containerimage in de Deployment te vervangen door de nginx:1.30.0 image voor clusters met het env: prod label.

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

Meerdere overschrijvingen definiëren

U kunt meerdere jsonPatchOverrides velden toevoegen om meerdere wijzigingen toe te overrideRules passen op geselecteerde clusterbronnen. Hier is een voorbeeld:

In dit voorbeeld worden de werkwoorden 'list' en 'watch' verwijderd in ons voorbeeld ClusterRole met de naam secret-reader op clusters met het label env: prod.

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 dit voorbeeld worden zowel de containerimage als de poort in de Deployment vervangen door 443 voor clusters met het label env: prod.

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

Gereserveerde variabelen in de JSON Patch Overschrijfwaarde

Gereserveerde variabelen worden vervangen bij plaatsing door de value regel voor het overschrijven van de JSON-patch. Momenteel ondersteunde gereserveerde variabelen:

  • ${MEMBER-CLUSTER-NAME}: vervangen door de naam van de memberCluster.

Als u bijvoorbeeld een Azure DNS-hostnaam wilt maken die de naam van het cluster bevat, voegt het voorbeeld ResourceOverride een waarde toe van fleet-clustername-eastus clusters in de eastus Azure-regio.

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

Meerdere onderdrukkingsregels

U kunt meerdere overrideRules aan een policy-veld toevoegen om meerdere wijzigingen toe te passen op de geselecteerde resources. Hier volgt een voorbeeld voor ResourceOverride.

In dit voorbeeld vervangt de containerafbeelding in de Deployment door:

  • De nginx:1.20.0 afbeelding voor clusters met het env: prod label.
  • De nginx:latest afbeelding voor clusters met het env: test label.
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"

Gebruik met resourceplaatsing in een cluster

  1. Maak een ClusterResourcePlacement om de plaatsingsregels op te geven voor het distribueren van de overschrijvingen van clusterresources over de clusterinfrastructuur. De volgende code is een voorbeeld. Zorg ervoor dat u de juiste resource selecteert.

    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 dit voorbeeld worden resources verdeeld over alle clusters die gelabeld zijn met env: prod. Wanneer de wijzigingen worden geïmplementeerd, worden de bijbehorende ClusterResourceOverride configuraties toegepast op de aangewezen clusters. De selectie van een overeenkomende clusterrolresource activeert secret-readerde toepassing van de configuraties naar de clusters.

  2. Pas de ClusterResourcePlacement opdracht toe met behulp van de kubectl apply opdracht:

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Controleer of de ClusterResourceOverride resource is toegepast op de geselecteerde resources door de status van de ClusterResourcePlacement resource te controleren via de kubectl describe opdracht:

    kubectl describe clusterresourceplacement crp
    

    De uitvoer moet er ongeveer uitzien als in het volgende voorbeeld:

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

    De ClusterResourcePlacementOverridden conditie geeft aan of de resource-overschrijving succesvol is toegepast op de geselecteerde resources binnen de clusters. Elk cluster onderhoudt een eigen Applicable Cluster Resource Overrides lijst. Deze lijst bevat de momentopname van de overschrijding van de clusterbron, indien relevant. Afzonderlijke statusberichten voor elk cluster geven aan of de override-regels succesvol zijn toegepast.

Gebruik bij het plaatsen van middelen

  1. Maak een ClusterResourcePlacement resource om de plaatsingsregels op te geven voor de verdeling van de resource-overrides in de clusterinfrastructuur. De volgende code is een voorbeeld. Zorg ervoor dat u de juiste naamruimten selecteert.

    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 dit voorbeeld worden resources binnen test-namespace gedistribueerd over alle clusters die zijn gelabeld met env:prod en env:test. Wanneer de wijzigingen worden geïmplementeerd, worden de bijbehorende ResourceOverride configuraties toegepast op de aangewezen resources. De selectie van een overeenkomende implementatieresource activeert my-deploymentde toepassing van de configuraties naar de aangewezen resources.

  2. Pas de ClusterResourcePlacement resource toe met behulp van de kubectl apply opdracht:

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Controleer of de ResourceOverride resource is toegepast op de geselecteerde resources door de status van de ClusterResourcePlacement resource te controleren via de kubectl describe opdracht:

    kubectl describe clusterresourceplacement crp-example
    

    De uitvoer moet er ongeveer uitzien als het volgende voorbeeld:

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

    De ClusterResourcePlacementOverridden conditie geeft aan of de resource-override succesvol is toegepast op de geselecteerde resources. Elk cluster onderhoudt een eigen Applicable Resource Overrides lijst. Deze lijst bevat de momentopname van het overschrijven van resources, indien relevant. Afzonderlijke statusberichten voor elk cluster geven aan of de override-regels succesvol zijn toegepast.