Usa Override risorse per personalizzare le risorse distribuite tramite il posizionamento delle risorse di Gestione flotta Kubernetes di Azure

Si applica a: ✔️ Gestione flotta con un cluster hub

Il posizionamento intelligente delle risorse di Azure Kubernetes Fleet Manager può distribuire la stessa risorsa in più cluster all’interno di una flotta. Spesso è necessario modificare la configurazione delle risorse per applicare regole relative al comportamento in ambienti diversi (sviluppo, test, produzione). A questo scopo, Gestione flotta fornisce override delle risorse, che offrono una funzionalità concettualmente simile al modo in cui vengono usati i modelli Helm e le patch Kustomize.

La modifica di una configurazione delle risorse è utile in situazioni come:

  • Si desidera usare un ClusterRole denominato secret-reader in tutti i cluster, ma con un set di azioni consentite più limitato per il ruolo nei cluster di produzione.
  • Si desidera usare lo stesso Deployment in tutti i cluster, ma usare un'immagine del container o una porta diversa nei cluster di produzione.

Questo articolo mostra come creare override per le risorse distribuite dal posizionamento delle risorse di Gestione flotta.

Azure Kubernetes Fleet Manager supporta due ambiti per gli override:

  • Ambito cluster: usare ClusterResourceOverride con ClusterResourcePlacement per gli amministratori della flotta che gestiscono le modifiche a livello di infrastruttura.
  • Con ambito spazio dei nomi: usare ResourceOverride con ResourcePlacement per i team delle applicazioni che gestiscono le distribuzioni negli spazi dei nomi specifici.

Selezionare l'ambito più applicabile dalle scelte relative al tipo di ambito nella parte superiore dell'articolo.

Override delle risorse con ambito cluster

Un oggetto ClusterResourceOverride ha le proprietà seguenti:

  • clusterResourceSelectors: specifica il set di risorse del cluster selezionato per l'override.
  • policy: specifica il set di regole da applicare alle risorse cluster selezionate.

Annotazioni

Policy le definizioni sono le stesse per le risorse a livello di cluster e di spazio dei nomi.

L'esempio ClusterRole seguente denominato secret-reader illustra come ClusterResourceOverride funziona.

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

Selezione delle risorse del cluster

Un ClusterResourceOverride può includere uno o più clusterResourceSelector per scegliere di quali risorse eseguire l'override. Ognuno clusterResourceSelector supporta i campi seguenti.

  • group: gruppo API della risorsa.
  • version: versione API della risorsa.
  • kind: tipo di risorsa.
  • name: nome della risorsa.

Annotazioni

Se si seleziona un namespace in ClusterResourceSelector, l'override si applica a tutte le risorse nel namespace.

Usando l'esempio ClusterRoleviene illustrato come selezionarlo in un oggetto 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

Sovrascrittura delle risorse con ambito namespace

Un oggetto ResourceOverride ha le proprietà seguenti:

  • resourceSelectors: specifica il set di risorse selezionate per l'override.
  • policy: specifica il set di regole da applicare alle risorse selezionate.

Annotazioni

Policy le definizioni sono le stesse per le risorse a livello di cluster e di spazio dei nomi.

Per illustrare il funzionamento ResourceOverride , usare l'esempio Deployment seguente denominato 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

Selezione delle risorse dello spazio dei nomi

Un ResourceOverride può includere uno o più resourceSelector per scegliere di quali risorse eseguire l'override. Ognuno resourceSelector supporta i campi seguenti:

  • group: gruppo API della risorsa.
  • version: versione API della risorsa.
  • kind: tipo di risorsa.
  • name: nome della risorsa.

Si determina il namespace della risorsa da sovrascrivere specificando il set namespace nel metadata del ResourceOverride.

Usando l'esempio Deployment, è possibile vedere come selezionarlo in un oggetto 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

Importante

  • Se si seleziona un namespace in resourceSelector (kind: Namespace), l'override si applica a tutte le risorse nel namespace.
  • Il ResourceOverride deve trovarsi nello stesso spazio dei nomi della risorsa da sovrascrivere.

Ora che è stata selezionata la risorsa, si esaminerà come configurare l'override usando un oggetto policy.

Policy

Un policy oggetto è costituito da un set di overrideRules che specificano le modifiche da applicare alle risorse selezionate. Ognuno overrideRules supporta i campi seguenti:

  • clusterSelector: specifica il set di cluster a cui si applica la regola di override.
  • jsonPatchOverrides: specifica le modifiche da applicare alle risorse selezionate.

Selettore cluster

Usare il clusterSelector campo in overrideRules per specificare i cluster a cui si applica la regola. clusterSelector Supporta il campo seguente:

  • clusterSelectorTerms: elenco di termini che specificano i criteri per la selezione dei cluster. Ogni termine include un campo labelSelector che definisce un set di etichette da corrispondere.

Importante

Solo labelSelector è supportato nel campo clusterSelectorTerms.

Override di patch JSON

Usare jsonPatchOverrides in overrideRules per specificare le modifiche da applicare alle risorse selezionate. La JsonPatch proprietà supporta i campi seguenti:

  • op: operazione da eseguire. Le operazioni supportate includono:

    • add: aggiunge un nuovo valore al percorso specificato.
    • remove: rimuove il valore nel percorso specificato.
    • replace: sostituisce il valore in corrispondenza del percorso specificato.
  • path: percorso del campo da modificare. Le linee guida per specificare i percorsi includono:

    • Deve iniziare con un carattere barra (/).
    • Non può essere vuoto o contenere una stringa vuota.
    • Non può essere un TypeMeta campo (/kind o /apiVersion).
    • Non può essere un Metadata campo (/metadata/name o /metadata/namespace), ad eccezione dei campi /metadata/labels e /metadata/annotations.
    • Non può essere alcun campo nel stato della risorsa.

    Esempi di percorsi validi includono:

    • /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: valore da aggiungere, rimuovere o sostituire. Se op è remove, non è possibile specificare value.

I jsonPatchOverrides campi applicano una patch JSON alle risorse selezionate seguendo RFC 6902.

Estendendo l'esempio, si configura un oggetto policy per rimuovere il list verbo dal ClusterRole denominato secret-reader nei cluster etichettati con 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

Estendendo l'esempio, si configura un oggetto policy per sostituire l'immagine del contenitore in Deployment con l'immagine nginx:1.30.0 per i cluster con l'etichetta env: prod .

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"

Definire più sostituzioni

Aggiungi più campi jsonPatchOverrides a overrideRules per applicare più modifiche alle risorse del cluster selezionate. Ecco un esempio:

In questo esempio vengono rimossi i verbi list e watch nell'esempio ClusterRole denominato secret-reader nei cluster con l'etichetta 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

Questo esempio sostituisce sia l'immagine del container che la porta in Deployment con 443 per i cluster con etichetta env: prod.

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"

Variabili riservate nel valore di override della patch JSON

Il value della regola di override della patch JSON sostituisce le variabili riservate durante il posizionamento. Variabili riservate attualmente supportate:

  • ${MEMBER-CLUSTER-NAME}: sostituito dal nome dell'oggetto memberCluster.

Ad esempio, per creare un nome host DNS di Azure che contiene il nome del cluster, nell'esempio ResourceOverride viene aggiunto un valore di fleet-clustername-eastus nei cluster nell'area eastus Azure.

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

Più regole di override

Aggiungi più overrideRules a un campo policy per applicare più modifiche alle risorse selezionate. Ecco un esempio per ResourceOverride.

Questo esempio sostituisce l'immagine del contenitore nel Deployment con:

  • L'immagine nginx:1.20.0 per i cluster con l'etichetta env: prod .
  • L'immagine nginx:latest per i cluster con l'etichetta 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"

Usare con il posizionamento delle risorse del cluster

  1. Creare un ClusterResourcePlacement per specificare le regole di posizionamento per la distribuzione degli override delle risorse del cluster nell'infrastruttura del cluster. Il codice seguente è un esempio. Assicurarsi di selezionare la risorsa appropriata.

    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
    

    Questo esempio distribuisce le risorse in tutti i cluster etichettati con env: prod. Man mano che vengono implementate le modifiche, le configurazioni corrispondenti ClusterResourceOverride vengono applicate ai cluster designati. La selezione di una risorsa del ruolo del cluster corrispondente, secret-reader, attiva l'applicazione delle configurazioni nei cluster.

  2. Applicare il comando ClusterResourcePlacement usando kubectl apply.

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Verificare che sia ClusterResourceOverride stato applicato alle risorse selezionate controllando lo stato della ClusterResourcePlacement risorsa tramite il kubectl describe comando :

    kubectl describe clusterresourceplacement crp
    

    L'output dovrebbe essere simile all'esempio seguente:

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

    La ClusterResourcePlacementOverridden condizione indica se l'override della risorsa è stato applicato correttamente alle risorse selezionate nei cluster. Ogni cluster mantiene un proprio Applicable Cluster Resource Overrides elenco. Questo elenco contiene lo snapshot dell'override delle risorse del cluster, se rilevante. I singoli messaggi di stato per ogni cluster indicano se le regole di override sono state applicate correttamente.

Usare con il posizionamento delle risorse

  1. Creare una risorsa ClusterResourcePlacement per specificare le regole di posizionamento per la distribuzione degli override delle risorse nell'infrastruttura del cluster. Il codice seguente è un esempio. Assicurarsi di selezionare i namespace appropriati.

    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
    

    Questo esempio distribuisce le risorse all'interno test-namespace di tutti i cluster etichettati con env:prod e env:test. Man mano che vengono implementate le modifiche, le configurazioni corrispondenti ResourceOverride vengono applicate alle risorse designate. La selezione di una risorsa di distribuzione corrispondente, my-deployment, attiva l'applicazione delle configurazioni alle risorse designate.

  2. Applicare la ClusterResourcePlacement risorsa usando il kubectl apply comando :

    kubectl apply -f cluster-resource-placement.yaml
    
  3. Verificare che sia ResourceOverride stato applicato alle risorse selezionate controllando lo stato della ClusterResourcePlacement risorsa tramite il kubectl describe comando :

    kubectl describe clusterresourceplacement crp-example
    

    L'output dovrebbe essere simile all'esempio seguente:

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

    La ClusterResourcePlacementOverridden condizione indica se l'override della risorsa è stato applicato correttamente alle risorse selezionate. Ogni cluster mantiene un proprio Applicable Resource Overrides elenco. Questo elenco contiene lo snapshot dell'override delle risorse, se pertinente. I singoli messaggi di stato per ogni cluster indicano se le regole di override sono state applicate correttamente.