Använd resursåsidoläggningar för att anpassa resurser som distribueras av resursplaceringen i Azure Kubernetes Fleet Manager.

Gäller för: ✔️ Fleet Manager med hubbkluster

Azure Kubernetes Fleet Manager intelligent resursplacering kan användas för att distribuera samma resurs till flera kluster i en flotta. Det finns ofta ett behov av att ändra resurskonfigurationen för att framtvinga regler kring beteende i olika miljöer (dev, test, prod). För det här ändamålet tillhandahåller Fleet Manager resursålsidosättningar, som ger en funktionalitet som konceptuellt liknar hur Helm-mallar och Kustomize-korrigeringar används.

Exempel på situationer där det är användbart att ändra en resurskonfiguration är:

  • Jag vill använda ett ClusterRole namngivet secret-reader på alla kluster, men har en mindre uppsättning tillåtna åtgärder för rollen i mina produktionskluster.
  • Jag vill använda samma Deployment på alla kluster, men använda en annan containerbild eller port i mina produktionskluster.

Den här artikeln visar hur du skapar åsidosättningar för resurser som distribueras av Fleet Manager-resursplacering.

Azure Kubernetes Fleet Manager stöder två nivåer för åsidosättningar.

  • Klusteromfattande: Använd ClusterResourceOverride med ClusterResourcePlacement för flotthanteringsadministratörer som hanterar ändringar på infrastrukturnivå.
  • Namnområdesspecifik: Använd ResourceOverride med ResourcePlacement för programteam som hanterar distributioner inom sina specifika namnområden.

Du kan välja det omfång som är mest tillämpligt för dig från alternativen för omfångstyp överst i artikeln.

Åsidosättningar av klusterinriktade resurser

Ett ClusterResourceOverride har följande egenskaper:

  • clusterResourceSelectors: Anger den uppsättning klusterresurser som valts för åsidosättande.
  • policy: Anger vilken uppsättning regler som ska tillämpas på de valda klusterresurserna.

Anmärkning

Policy definitioner är desamma för både kluster- och namnområdesomfångsresurser.

Nu ska vi använda följande exempel ClusterRole med namnet secret-reader för att visa hur ClusterResourceOverride fungerar.

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

Välja klusterresurser

En ClusterResourceOverride kan innehålla en eller flera clusterResourceSelector för att välja vilka resurser som ska åsidosättas. Varje clusterResourceSelector stöder följande fält.

  • group: API-gruppen för resursen.
  • version: API-versionen av resursen.
  • kind: Resurstypen.
  • name: Resursens namn.

Anmärkning

Om du väljer ett namnområde i ClusterResourceSelectorgäller åsidosättningen för alla resurser i namnområdet.

Med vårt exempel ClusterRoleska vi se hur vi väljer det i en 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

Åsidosättningar av namnområdesomfångsresurser (förhandsversion)

Ett ResourceOverride har följande egenskaper:

  • resourceSelectors: Anger den uppsättning resurser som valts för åsidosättande.
  • policy: Anger den uppsättning regler som ska tillämpas på de valda resurserna.

Anmärkning

Policy definitioner är desamma för både kluster- och namnområdesomfångsresurser.

Nu ska vi använda följande exempel Deployment med namnet nginx-sample för att visa hur ResourceOverride fungerar.

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

Välja namnområdesresurser

En ResourceOverride kan innehålla en eller flera resourceSelector för att välja vilka resurser som ska åsidosättas. Varje resourceSelector stöder följande fält.

  • group: API-gruppen för resursen.
  • version: API-versionen av resursen.
  • kind: Resurstypen.
  • name: Resursens namn.

Namnområdet för resursen som ska åsidosättas bestäms genom att ange namespace uppsättningen i metadata i ResourceOverride.

Med vårt exempel Deploymentska vi se hur vi väljer det i en 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

Viktigt!

  • Om du väljer ett namnområde i resourceSelector (kind: Namespace) gäller åsidosättningen för alla resurser i namnområdet.
  • ResourceOverride Måste finnas i samma namnområde som resursen som ska åsidosättas.

Nu har vi valt resursen. Nu ska vi titta på hur vi konfigurerar åsidosättningen med hjälp av en policy.

Policy

A policy består av en uppsättning overrideRules som anger vilka ändringar som ska tillämpas på de valda resurserna. Varje overrideRules stöder följande fält:

  • clusterSelector: Anger den uppsättning kluster som åsidosättningsregeln gäller för.
  • jsonPatchOverrides: Anger de ändringar som ska tillämpas på de valda resurserna.

Klusterväljare

Du kan använda fältet clusterSelector i overrideRules för att ange de kluster som regeln gäller för. Stöder clusterSelector följande fält:

  • clusterSelectorTerms: En lista med termer som anger villkoren för att välja kluster. Varje term innehåller ett labelSelector fält som definierar en uppsättning etiketter som ska matchas.

Viktigt!

Endast labelSelector stöds i fältet clusterSelectorTerms .

Åsidosättningar av JSON-korrigering

Du kan använda jsonPatchOverrides i overrideRules för att ange vilka ändringar som ska tillämpas på de valda resurserna. Egenskapen JsonPatch stöder följande fält:

  • op: Den åtgärd som ska utföras. Bland de åtgärder som stöds finns:

    • add: Lägger till ett nytt värde i den angivna sökvägen.
    • remove: Tar bort värdet på den angivna sökvägen.
    • replace: Ersätter värdet på den angivna stigen.
  • path: Sökvägen till fältet som ska ändras. Vägledning för att ange sökvägar omfattar:

    • Måste börja med snedstreckstecknet (/).
    • Får inte vara tom eller innehålla en tom sträng.
    • Det kan inte vara ett TypeMeta fält (/kind eller /apiVersion).
    • Det kan inte vara ett Metadata fält (/metadata/name eller /metadata/namespace), förutom fälten /metadata/labels och /metadata/annotations.
    • Det kan inte vara något fält i resursens status.

    Exempel på giltiga sökvägar är:

    • /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: Värdet som ska läggas till, ta bort eller ersätta. Om op är removekan du inte ange value.

Fälten jsonPatchOverrides tillämpar en JSON-korrigering på de valda resurserna genom att följa RFC 6902.

När vi utökar vårt exempel konfigurerar vi en policy för att ta bort verbet list från det ClusterRole namngivna secret-reader på kluster som är märkta med env:prod.

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

För att utöka vårt exempel konfigurerar vi en policy för att ersätta containeravbildningen i Deployment med avbildningen nginx:1.30.0 för kluster med etiketten 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"

Definiera flera åsidosättningar

Du kan lägga till flera jsonPatchOverrides fält för overrideRules att tillämpa flera ändringar på valda klusterresurser. Här är ett exempel:

Det här exemplet tar bort verben "list" och "watch" i vårt exempel ClusterRole med namnet secret-reader på kluster med etiketten 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

Det här exemplet ersätter både containeravbildningen Deployment och porten i med 443 för kluster med env: prod etiketten .

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"

Reserverade variabler i JSON Patch-åsidosättningsvärde

Reserverade variabler ersätts vid placering av value i enlighet med åsidosättningsregeln för JSON-korrigering. Reserverade variabler som stöds för närvarande:

  • ${MEMBER-CLUSTER-NAME}: ersätts med namnet på memberCluster.

Om du till exempel vill skapa ett Azure DNS-värdnamn som innehåller namnet på klustret lägger exemplet ResourceOverride till ett värde fleet-clustername-eastus för på kluster i eastus Azure-regionen.

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

Flera åsidosättningsregler

Du kan lägga till flera overrideRules i ett policy fält för att tillämpa flera ändringar på de valda resurserna. Här är ett exempel på ResourceOverride.

Det här exemplet ersätter containeravbildningen i Deployment med:

  • Bild nginx:1.20.0 för kluster med etiketten env: prod.
  • Avbildningen nginx:latest för kluster med etikett env: test.
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"

Använd med klusterresursplacering

  1. Skapa en ClusterResourcePlacement för att ange placeringsregler för distribution av klusterresursens åsidosättningar i klusterinfrastrukturen. Följande kod är ett exempel. Se till att välja lämplig resurs.

    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
    

    Det här exemplet distribuerar resurser över alla kluster som är märkta med env: prod. När ändringarna implementeras tillämpas motsvarande ClusterResourceOverride konfigurationer på de avsedda klustren. Valet av en matchande klusterrollresurs secret-reader utlöser tillämpningen av konfigurationerna till klustren.

  2. Använd ClusterResourcePlacement med kommandot kubectl apply.

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Kontrollera att ClusterResourceOverride har tillämpats på de valda resurserna genom att kontrollera resursens ClusterResourcePlacement status via kubectl describe kommandot :

    kubectl describe clusterresourceplacement crp
    

    Dina utdata bör likna följande exempel:

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

    Villkoret ClusterResourcePlacementOverridden anger om resursens åsidosättning har tillämpats på de valda resurserna i klustren. Varje kluster har en egen Applicable Cluster Resource Overrides lista. Den här listan innehåller ögonblicksbilden av åsidosättningen av klusterresursen, om det är relevant. Enskilda statusmeddelanden för varje kluster anger om åsidosättningsreglerna har tillämpats.

Använd med resursplacering

  1. Skapa en ClusterResourcePlacement resurs för att ange placeringsregler för distribution av resursens åsidosättningar i klusterinfrastrukturen. Följande kod är ett exempel. Se till att välja lämpliga namnområden.

    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
    

    Det här exemplet distribuerar resurser inom test-namespace alla kluster som är märkta med env:prod och env:test. När ändringarna implementeras tillämpas motsvarande ResourceOverride konfigurationer på de avsedda resurserna. Valet av en matchande distributionsresurs, my-deployment, utlöser tillämpningen av konfigurationerna på de avsedda resurserna.

  2. Använd ClusterResourcePlacement-resursen genom kommandot kubectl apply.

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Kontrollera att ResourceOverride har tillämpats på de valda resurserna genom att kontrollera resursens ClusterResourcePlacement status via kubectl describe kommandot :

    kubectl describe clusterresourceplacement crp-example
    

    Dina utdata bör likna följande exempel:

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

    Villkoret ClusterResourcePlacementOverridden anger om resursens åsidosättning har tillämpats på de valda resurserna. Varje kluster har en egen Applicable Resource Overrides lista. Den här listan innehåller ögonblicksbilden av resursens åsidosättning, om det är relevant. Enskilda statusmeddelanden för varje kluster anger om åsidosättningsreglerna har tillämpats.