Condividi tramite


Introduzione al posizionamento intelligente delle risorse di Azure Kubernetes Fleet Manager

Si applica a ✔️ Fleet Manager con cluster hub

La gestione delle risorse Kubernetes in più cluster presenta sfide significative sia per gli amministratori della piattaforma che per gli sviluppatori di applicazioni. Man mano che le organizzazioni ridimensionano l'infrastruttura Kubernetes oltre un singolo cluster, spesso riscontrano complessità correlate alla distribuzione, alla coerenza e al sovraccarico manuale della gestione delle risorse. L'approccio tradizionale di gestione di ogni cluster crea in modo indipendente i silo operativi che diventano sempre più difficili da mantenere man mano che le dimensioni della flotta aumentano.

Gli amministratori della piattaforma spesso devono distribuire risorse Kubernetes in più cluster per diversi motivi, tra cui:

  • Gestione del controllo di accesso tramite ruoli e associazioni di ruolo in più cluster.
  • Esecuzione di applicazioni di infrastruttura, ad esempio Prometheus o Flux, che devono trovarsi in tutti i cluster.

Gli sviluppatori di applicazioni spesso devono distribuire le risorse di Kubernetes in più cluster per diversi motivi, ad esempio:

  • Distribuzione di un'applicazione di gestione video in più cluster in aree diverse per un'esperienza di visione a bassa latenza.
  • Distribuzione di un'applicazione di carrello acquisti in due aree abbinate per consentire ai clienti di continuare a acquistare durante un'interruzione di un'area.
  • Distribuzione di un'applicazione di calcolo batch in cluster con pool di nodi spot economici disponibili.

È noioso e potenzialmente soggetto a errori per creare, aggiornare e tenere traccia manualmente delle risorse Kubernetes in più cluster.

In questo articolo viene illustrato come usare la funzionalità di posizionamento intelligente delle risorse di Fleet Manager per gestire la distribuzione delle risorse Kubernetes con ambito cluster e spazio dei nomi tra cluster membri in una flotta.

La funzionalità di posizionamento delle risorse di Fleet Manager si basa sul progetto KUBeFleet CNF.

Panoramica del processo di posizionamento delle risorse

L'uso del posizionamento intelligente delle risorse di Fleet Manager prevede questi passaggi:

  1. Gestione temporanea delle risorse nel cluster hub: usare distribuzione continua, GitOps o simile per applicare i manifesti per le risorse per le distribuzioni nel cluster hub di Fleet Manager.
  2. Creare un posizionamento delle risorse: creare un manifesto di posizionamento che selezioni la risorsa e definisca un criterio usato per selezionare i cluster membro che riceveranno la risorsa.
  3. Applicare il posizionamento delle risorse nel cluster hub: accettare il manifesto del posizionamento e applicarlo al cluster hub per avviare la distribuzione della risorsa.
  4. Fleet Manager pianifica le risorse: Fleet Manager osserva il posizionamento delle risorse e l'ambito selezionato ed esegue la distribuzione delle risorse.
  5. Osservare la distribuzione tramite il posizionamento delle risorse: eseguire una query sul posizionamento delle risorse nel cluster hub per osservare lo stato della risorsa durante la distribuzione.

Fleet Manager offre un'esperienza del portale di Azure per il posizionamento delle risorse che offre una rappresentazione più visiva dell'implementazione.

Introduzione al posizionamento delle risorse a livello di cluster

Usare un ClusterResourcePlacement (CRP) per distribuire un determinato set di risorse con ambito cluster o interi namespace dal cluster hub di Fleet Manager su uno o più cluster membro.

Caratteristiche chiave:

  • Ambito cluster: seleziona le risorse o gli spazi dei nomi con ambito cluster.
  • Dichiarativo: usa gli stessi criteri di posizionamento di ResourcePlacement per un comportamento coerente.

Con CRP è possibile:

  • Selezionare le risorse Kubernetes da distribuire. Possono trattarsi di risorse Kubernetes con ambito cluster definite usando riferimenti al Group Version Kind (GVK) di Kubernetes, oppure di uno spazio dei nomi, che distribuisce lo spazio dei nomi e tutte le relative risorse.
  • Specificare i criteri di posizionamento per selezionare i cluster membri. Questi criteri possono selezionare in modo esplicito i cluster in base ai nomi o selezionare dinamicamente i cluster in base alle etichette e alle proprietà del cluster.
  • Specificare le strategie di implementazione per implementare in modo sicuro tutti gli aggiornamenti delle risorse di Kubernetes selezionate in più cluster di destinazione.
  • Visualizzare lo stato di avanzamento dell'implementazione per ogni cluster di destinazione.

Per gli scenari che richiedono un controllo granulare sulle singole risorse con ambito spazio dei nomi all'interno di uno spazio dei nomi, vedere posizionamento delle risorse con ambito spazio dei nomi, che consente la distribuzione di risorse specifiche anziché interi spazi dei nomi.

Introduzione al posizionamento delle risorse con ambito spazio dei nomi

Usare un oggetto ResourcePlacement (RP) per distribuire un determinato set di risorse all'interno di uno spazio dei nomi specifico dal cluster hub di Fleet Manager in uno o più cluster membro. ResourcePlacement fornisce un controllo granulare sul modo in cui le risorse specifiche all'interno di uno spazio dei nomi vengono distribuite tra cluster membri.

Importante

ResourcePlacement usa la versione dell'API placement.kubernetes-fleet.io/v1beta1 ed è attualmente in anteprima. Alcune funzionalità illustrate in questo articolo, ad esempio selectionScope in ClusterResourcePlacement, fanno anche parte dell'API v1beta1 e non sono disponibili nell'API v1.

Caratteristiche chiave:

  • Con ambito nello spazio dei nomi: sia ResourcePlacement che le risorse selezionate esistono nello stesso namespace.
  • Selettiva: seleziona risorse specifiche all'interno dello spazio dei nomi in base al tipo, al nome o alle etichette anziché all'intero spazio dei nomi.
  • Dichiarativo: usa gli stessi criteri di posizionamento di ClusterResourcePlacement per un comportamento coerente.

Quando usare ResourcePlacement

ResourcePlacement è ideale per gli scenari che richiedono un controllo granulare sulle risorse con ambito di spazio dei nomi:

  • Distribuzione selettiva delle risorse: Distribuire ConfigMaps, Secrets o Services specifici senza influire sull'intero namespace.
  • Ambienti multi-tenant: consente a team diversi di gestire le risorse in modo indipendente all'interno degli spazi dei nomi condivisi.
  • Gestione della configurazione: distribuire configurazioni specifiche dell'ambiente in ambienti cluster diversi.
  • Conformità e governance: applicare criteri diversi a tipi di risorse diversi all'interno dello stesso spazio dei nomi.
  • Implementazioni progressive: distribuire in modo sicuro gli aggiornamenti delle risorse tra cluster con strategie di tempo di inattività zero.

Nell'ambito degli ambienti multi-cluster, i carichi di lavoro spesso sono costituiti da risorse con ambito del cluster e con ambito dello spazio dei nomi che devono essere distribuite tra diversi cluster. Sebbene ClusterResourcePlacement (CRP) gestisca in modo efficace le risorse con ambito cluster, gli interi spazi dei nomi e il relativo contenuto, esistono scenari in cui è necessario un controllo più granulare sulle risorse con ambito spazio dei nomi all'interno degli spazi dei nomi esistenti.

ResourcePlacement (RP) è stato progettato per risolvere questo divario fornendo:

  • Gestione delle risorse con ambito spazio dei nomi: specificare come destinazione risorse specifiche all'interno di uno spazio dei nomi senza influire sull'intero spazio dei nomi.
  • Flessibilità operativa: consente ai team di gestire risorse diverse all'interno dello stesso spazio dei nomi in modo indipendente.
  • Funzionalità complementari: collaborare con CRP per offrire una soluzione completa di gestione delle risorse multi-cluster.

Annotazioni

ResourcePlacement può essere usato insieme a ClusterResourcePlacement in modalità namespace solo. Ad esempio, è possibile usare CRP per distribuire lo spazio dei nomi, usando RP per la gestione con granularità fine di risorse specifiche, ad esempio ConfigMaps o Segreti specifici dell'ambiente all'interno di tale spazio dei nomi.

Componenti di posizionamento delle risorse

Un posizionamento delle risorse, indipendentemente dall'ambito (cluster o spazio dei nomi) è costituito dai componenti seguenti:

  • Selettori di risorse: selezionare le risorse da includere tramite resourceSelectors.
  • Criteri di posizionamento: definisce come selezionare i cluster tramite placeType utilizzando uno dei tipi PickAll, PickFixed o PickN.
  • Strategia di implementazione: controllare la modalità di implementazione delle risorse nei cluster selezionati includendo un oggetto facoltativo strategy.

In questo esempio, il ClusterResourcePlacement (CRP) posiziona il namespace my-app su tutti i cluster della flotta. Poiché non viene definita alcuna strategia esplicita, viene usato un oggetto RollingUpdate .

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: namespace-only-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
  policy:
    placementType: PickAll   

Questo esempio ResourcePlacement (RP) inserisce l'oggetto ConfigMap etichettato app=my-application nello spazio dei nomi my-app corrispondente nei due cluster denominati. Poiché non viene definita alcuna strategia esplicita, viene usato un oggetto RollingUpdate .

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Selettori di risorse

Selezionare le risorse usando una o più resourceSelectors risorse in una posizione. Ogni selettore di risorse può specificare:

  • Gruppo, Versione, Tipo (GVK): tipo di risorsa Kubernetes da selezionare.
  • Nome: nome di una risorsa specifica.
  • Selettori di etichetta: le etichette corrispondono a più risorse.

Ambito di selezione dello spazio dei nomi (anteprima)

Quando si usa il posizionamento con ambito cluster per selezionare un intero spazio dei nomi, è possibile usare il selectionScope campo per controllare se includere tutte le risorse figlio nello spazio dei nomi o semplicemente inserire uno spazio dei nomi vuoto.

  • Comportamento predefinito (se selectionScope non specificato): distribuisce lo spazio dei nomi e tutte le risorse al suo interno.
  • NamespaceOnly: distribuisce solo la risorsa dello spazio dei nomi, senza risorse all'interno dello spazio dei nomi. Ciò è utile quando si desidera stabilire spazi dei nomi tra i cluster gestendo separatamente le singole risorse usando ResourcePlacement.

Importante

Il selectionScope campo è disponibile nella versione dell'API placement.kubernetes-fleet.io/v1beta1 come funzionalità di anteprima. Non è disponibile nell'API placement.kubernetes-fleet.io/v1 .

In questo esempio viene illustrato come distribuire solo lo spazio dei nomi senza il relativo contenuto.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: namespace-only-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
      selectionScope: NamespaceOnly
  policy:
    placementType: PickAll

Questo approccio consente un flusso di lavoro in cui gli amministratori della piattaforma usano ClusterResourcePlacement per stabilire spazi dei nomi, mentre i team delle applicazioni usano ResourcePlacement per un controllo granulare su risorse specifiche all'interno di tali spazi dei nomi.

Criteri di posizionamento

I tipi di criteri di posizionamento seguenti sono disponibili per controllare il modo in cui i cluster vengono selezionati dal posizionamento delle risorse di Fleet Manager:

  • PickFixed inserisce le risorse nei cluster membri usando il nome del cluster.
  • PickAll colloca le risorse su tutti i cluster membri, o su tutti i cluster membri che soddisfano un determinato criterio. Questi criteri sono utili per posizionare carichi di lavoro dell'infrastruttura, ad esempio il monitoraggio del cluster o le applicazioni di creazione report.
  • PickN è l'opzione di posizionamento più flessibile e consente di selezionare i cluster in base ai vincoli di diffusione di affinità o topologia ed è utile quando si distribuiscono carichi di lavoro in più cluster simili per garantire che la disponibilità venga mantenuta.

Tipo di posizionamento PickFixed

Usare PickFixed per selezionare i cluster in base al nome, specificando i nomi nella clusterNames matrice.

Questo esempio illustra come distribuire lo test-deployment spazio dei nomi nei cluster cluster1 membri e cluster2.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-fixed
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-deployment
      version: v1
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Questo esempio di ResourcePlacement (RP) inserisce l'oggetto ConfigMap etichettato app: my-application nello spazio dei nomi my-app corrispondente nei due cluster denominati.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Tipo di posizionamento PickAll

Usare PickAll per distribuire le risorse in tutti i cluster membri o in tutti i cluster corrispondenti a un criterio specificato.

Quando si crea questo tipo di posizionamento, è possibile specificare i tipi di affinità cluster seguenti:

  • requiredDuringSchedulingIgnoredDuringExecution: poiché questo criterio è necessario durante la pianificazione, filtra i cluster in base ai criteri specificati.

Questo esempio illustra come distribuire lo spazio dei nomi prod-deployment e tutte le sue risorse figlio nei cluster membri etichettati con environment: production.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickall
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production

Questo esempio di ResourcePlacement (RP) posiziona l'oggetto ConfigMap etichettato app: my-application nello spazio dei nomi my-app corrispondente in tutti i cluster etichettati con environment: production:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production

Tipo di posizionamento PickN

Usare PickN per distribuire le risorse in un numero configurabile di cluster in base alle affinità e ai vincoli di distribuzione della topologia.

Quando si crea questo tipo di posizionamento, è possibile specificare i tipi di affinità cluster seguenti:

  • requiredDuringSchedulingIgnoredDuringExecution: poiché questo criterio è necessario durante la pianificazione, filtra i cluster in base ai criteri specificati.
  • preferredDuringSchedulingIgnoredDuringExecution: poiché questo criterio è preferibile, ma non necessario durante la pianificazione, classifica i cluster in base ai criteri specificati.

È possibile impostare affinità obbligatorie e preferite. Le affinità obbligatorie impediscono il posizionamento ai cluster che non corrispondono. Le affinità preferite forniscono l'ordinamento dei cluster corrispondenti.

PickN con affinità

L'uso delle affinità con una politica di posizionamento PickN funziona in modo simile all'uso delle affinità con la schedulazione dei pod in un singolo cluster Kubernetes.

L'esempio seguente illustra come distribuire una risorsa in tre cluster. Solo i cluster con l'etichetta critical-allowed: "true" sono destinazioni di selezione host valide e la preferenza viene assegnata ai cluster con l'etichetta critical-level: 1:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-critical-preferences
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickn-critical-preferences
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"
PickN con vincoli di distribuzione della topologia

Usare i vincoli di distribuzione della topologia per forzare il posizionamento tra i limiti della topologia per soddisfare i requisiti di disponibilità.

È possibile configurare il comportamento dei vincoli di distribuzione della topologia usando la whenUnsatisfiable proprietà :

  • DoNotSchedule: se il vincolo non può essere soddisfatto, non eseguire la richiesta di posizionamento.
  • ScheduleAnyway: se il vincolo non può essere soddisfatto, inserire le risorse in ogni modo.

L'esempio seguente illustra come distribuire le risorse in più aree di Azure e tenta di pianificare tra cluster membri con giorni di aggiornamento diversi usando un'etichetta updateDaypersonalizzata .

Quando non è possibile soddisfare lo spread dell'area di Azure, il posizionamento avrà esito negativo. Se il updateDay vincolo non viene soddisfatto, il posizionamento verrà comunque eseguito.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-locations-updates
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: fleet.azure.com/location
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickn-locations-updates
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: fleet.azure.com/location
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway

Per altre informazioni, vedere la documentazione di KubeFleet sui vincoli di distribuzione della topologia.

Selezionare i cluster usando etichette e proprietà

Il posizionamento intelligente delle risorse di Fleet Manager offre un set di criteri avanzati che è possibile usare per determinare la modalità di selezione dei cluster quando si usano i PickN tipi di posizionamento e PickAll . In questa sezione verrà illustrato come usare queste opzioni per creare criteri in base alle proprie esigenze.

Opzioni dei criteri di posizionamento

I campi dei criteri di pianificazione disponibili per ogni tipo di posizionamento sono visualizzati nella tabella.

Campo criteri PickFixed PickAll PickN
placementType
affinity
clusterNames
numberOfClusters
topologySpreadConstraints

Etichette dei membri del cluster

La MemberCluster risorsa nel cluster hub può essere etichettata come qualsiasi risorsa Kubernetes.

Inoltre, Fleet Manager aggiunge automaticamente le etichette di sola lettura seguenti a tutti i cluster membri.

Etichetta Descrizione
fleet.azure.com/location Area di Azure del cluster (westus)
fleet.azure.com/resource-group Gruppo di risorse di Azure del cluster (rg_prodapps_01)
fleet.azure.com/subscription-id Identificatore della sottoscrizione di Azure in cui risiede il cluster. Formattato come UUID/GUID.
fleet.azure.com/cluster-name Nome del cluster associato alla risorsa del cluster membro della flotta.
fleet.azure.com/member-name Nome del cluster membro Fleet Manager corrispondente al cluster

Proprietà del cluster

Le proprietà seguenti sono disponibili per l'uso come parte dei criteri di posizionamento.

Nome della proprietà Descrizione
kubernetes-fleet.io/node-count Nodi disponibili nel cluster membro.
resources.kubernetes-fleet.io/total-cpu Unità di risorse CPU totali del cluster.
resources.kubernetes-fleet.io/allocatable-cpu Unità di risorse CPU allocabili del cluster.
resources.kubernetes-fleet.io/available-cpu Unità di risorse CPU disponibili del cluster.
resources.kubernetes-fleet.io/total-memory Unità di risorse di memoria totali del cluster.
resources.kubernetes-fleet.io/allocatable-memory Unità di risorse di memoria allocabili del cluster.
resources.kubernetes-fleet.io/memoria-disponibile Unità di risorse di memoria disponibili del cluster.
kubernetes.azure.com/per-cpu-core-cost Costo core per CPU del cluster.
kubernetes.azure.com/per-gb-memory-cost Costo della memoria per GiB del cluster.
kubernetes.azure.com/vm-sizes/{vm-sku-name}/capacity Numero disponibile di nodi di tipo vm-sku-name nel cluster*.
Nome sku della macchina virtuale di esempio: NV16as_v4.
* In anteprima tramite l'API v1beta1.
  • Le proprietà della CPU e della memoria sono rappresentate come unità di risorse Kubernetes.

  • Le proprietà dei costi sono decimali, che rappresentano il costo orario in dollari USA per i servizi di calcolo di Azure usati per i nodi all'interno del cluster. Il costo è basato sui prezzi pubblici di Azure.

Criteri di corrispondenza per la selezione

Quando si usano le proprietà del cluster nei criteri di un criterio, specificare:

  • Nome: nome della proprietà, che corrisponde a una delle proprietà elencate in questo articolo.

  • Operatore: operatore usato per esprimere la condizione tra il vincolo/valore desiderato e il valore osservato nel cluster. Attualmente sono supportati gli operatori seguenti:

    • Gt (Maggiore di): il valore osservato di un cluster della proprietà specificata deve essere maggiore del valore nella condizione prima che possa essere selezionato per il posizionamento delle risorse.
    • Ge (Maggiore o uguale a): il valore osservato di un cluster della proprietà specificata deve essere maggiore o uguale al valore nella condizione prima che possa essere selezionato per il posizionamento delle risorse.
    • Lt (Minore di): il valore osservato di un cluster della proprietà specificata deve essere minore del valore nella condizione prima che possa essere selezionato per il posizionamento delle risorse.
    • Le (Minore o uguale a): il valore osservato di un cluster della proprietà specificata deve essere minore o uguale al valore nella condizione prima che possa essere selezionato per il posizionamento delle risorse.
    • Eq (Uguale a): il valore osservato di un cluster della proprietà specificata deve essere uguale al valore nella condizione prima che possa essere selezionato per il posizionamento delle risorse.
    • Ne (Diverso da): il valore osservato di un cluster della proprietà specificata non deve essere uguale al valore nella condizione prima che possa essere selezionato per il posizionamento delle risorse.

    Se si usa l'operatore Gt, GeLt, Le, Eq o Ne, l'elenco di valori nella condizione deve avere un valore esatto.

  • Valori: elenco di valori possibili della proprietà.

Fleet valuta ogni cluster in base alle proprietà specificate nella condizione. Il mancato rispetto delle condizioni elencate in requiredDuringSchedulingIgnoredDuringExecution esclude un cluster membro dal posizionamento delle risorse.

Annotazioni

Se un cluster membro non possiede la proprietà espressa nella condizione, la condizione avrà automaticamente esito negativo.

Ecco un esempio di criteri di posizionamento che consente di selezionare solo cluster con cinque o più nodi.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickall-five-nodes
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes-fleet.io/node-count"
                      operator: Ge
                      values:
                      - "5"
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall-five-nodes
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes-fleet.io/node-count"
                      operator: Ge
                      values:
                      - "5"

Come funziona la classificazione delle proprietà

Quando viene usato preferredDuringSchedulingIgnoredDuringExecution, un ordinamento delle proprietà classifica tutti i cluster della flotta in base ai valori in ordine crescente o decrescente. I pesi usati per l'ordinamento vengono calcolati in base al valore specificato.

Un ordinamento delle proprietà è costituito da:

  • Nome: nome della proprietà del cluster.
  • Ordinamento: l'ordinamento può essere Ascending o Descending. Quando si usa l'ordine Ascending, è preferibile usare cluster membri con valori osservati inferiori. Quando si usa l'ordine Descending, è preferibile utilizzare cluster membri con un valore osservato superiore.

Per altre informazioni, vedere la documentazione di KubeFleet sulla pianificazione basata su proprietà.

Configurazione della strategia di distribuzione

Il posizionamento delle risorse di Fleet Manager usa una strategia predefinita RollingUpdate per controllare il modo in cui le risorse vengono distribuite ai cluster membri.

Nell'esempio seguente la distribuzione viene effettuata in sequenza a ogni cluster membro, in attesa almeno unavailablePeriodSeconds tra i cluster.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pick-all-rolling
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickAll
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall-rolling
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

Lo stato di implementazione viene considerato corretto se tutte le risorse sono state applicate correttamente al cluster. Questo stato non si verifica a catena dello stato delle risorse figlio, quindi, ad esempio, non conferma che i pod creati in un cluster membro da una distribuzione diventano pronti.

Per altre informazioni, vedere la documentazione sulle strategie di implementazione.

Utilizzo delle tollerazioni

I cluster membri possono essere marcati nello stesso modo in cui i nodi in un cluster possono essere marcati.

I posizionamenti delle risorse supportano l'uso di tolleranze in cui ogni tollerazione è costituita dai campi seguenti:

  • key: chiave della tolleranza.
  • value: valore della tolleranza.
  • effect: effetto della tolleranza, ad esempio NoSchedule.
  • operator: operatore della tolleranza, ad esempio Exists o Equal.

Ogni tolleranza viene utilizzata per tollerare una o più contaminazioni specifiche applicate su MemberCluster. Una volta tollerati tutti i taints, Fleet Manager può distribuire le risorse al cluster membro.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: test-ns
spec:
  policy:
    placementType: PickAll
    tolerations:
      - key: app-team-a
        operator: Exists
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-ns
      version: v1
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall-rolling
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
    tolerations:
      - key: app-team-a
        operator: Exists
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

Per altre informazioni, vedere la documentazione sulle tolerazioni.

Uso delle risorse envelope

È importante comprendere che il cluster hub Fleet Manager è anche un cluster Kubernetes. Qualsiasi risorsa da distribuire viene prima applicata al cluster hub, che può portare a:

  1. Effetti collaterali imprevisti: ValidatingWebhookConfigurations, MutatingWebhookConfigurations o Admission Controllers diventano attivi nel cluster hub, potenzialmente intercettando e influenzando le operazioni del cluster hub.

  2. Rischi per la sicurezza: le risorse RBAC (Ruoli, ClusterRoles, RoleBindings, ClusterRoleBindings) destinate ai cluster membri potrebbero concedere o limitare le autorizzazioni nel cluster hub.

  3. Limitazioni delle risorse: ResourceQuotas, FlowSchema o LimitRanges definiti per i cluster membri hanno effetto sul cluster hub.

Per evitare effetti collaterali non necessari, Fleet Manager fornisce risorse buste personalizzate (ClusterResourceEnvelope e ResourceEnvelope) per eseguire il wrapping degli oggetti per evitare questi potenziali problemi.

La risorsa envelope viene applicata al cluster hub, ma le risorse che contiene vengono estratte e applicate quando raggiungono i cluster membri.

Per altre informazioni, vedere la documentazione sugli oggetti envelope.

Determinare lo stato di posizionamento

Il posizionamento delle risorse di Fleet Manager offre due modi per visualizzare lo stato a seconda del livello di accesso e dei requisiti del cluster hub:

  • ClusterResourcePlacement status: visualizza lo stato di posizionamento direttamente sulla risorsa con ambito ClusterResourcePlacement cluster. Usare quando si dispone di autorizzazioni a livello di cluster ed è necessario visualizzare lo stato per qualsiasi posizionamento nella flotta.
  • Stato di distribuzione delle risorse: Visualizza direttamente lo stato di posizionamento sulla risorsa con ambito dello spazio dei nomi ResourcePlacement. Utilizzare quando si dispone di autorizzazioni a livello di spazio dei nomi ed è necessario verificare lo stato di un'allocazione a livello di spazio dei nomi nella flotta.

Visualizzazione dello stato di ClusterResourcePlacement

È possibile visualizzare queste informazioni tramite il comando kubectl describe resourceplacement <rp-name>.

kubectl describe resourceplacement place-cmap-1
  • ClusterResourcePlacementStatus (anteprima): visualizzare lo stato di posizionamento tramite una risorsa con ambito ClusterResourcePlacementStatus spazio dei nomi. Usare quando gli utenti con ambito spazio dei nomi devono visualizzare lo stato di posizionamento senza concedere autorizzazioni a livello di cluster. Per altre informazioni, vedere la sezione ClusterResourcePlacementStatus.

Entrambi gli approcci forniscono le informazioni seguenti:

  • Condizioni che attualmente si applicano alla selezione host, che includono se la selezione host è stata completata correttamente.
  • Sezione relativa allo stato di selezione host per ogni cluster membro, che mostra lo stato della distribuzione in tale cluster.

Utilizzare lo stato di ClusterResourcePlacement

Nell'esempio seguente viene illustrata la visualizzazione dello stato direttamente da un ClusterResourcePlacement che ha distribuito lo spazio dei nomi test e il ConfigMap test-1 in due cluster membri usando PickN. La selezione host è stata completata correttamente e le risorse sono state inserite nei cluster aks-member-1 e aks-member-2.

È possibile visualizzare queste informazioni tramite il comando kubectl describe clusterresourceplacement <crp-name>.

kubectl describe clusterresourceplacement crp-1
Name:         crp-1
Namespace:
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  ...
Spec:
  Policy:
    Number Of Clusters:  2
    Placement Type:      PickN
  Resource Selectors:
    Group:
    Kind:                  Namespace
    Name:                  test
    Version:               v1
  Revision History Limit:  10
Status:
  Conditions:
    Last Transition Time:  2023-11-10T08:14:52Z
    Message:               found all the clusters needed as specified by the scheduling policy
    Observed Generation:   5
    Reason:                SchedulingPolicyFulfilled
    Status:                True
    Type:                  ClusterResourcePlacementScheduled
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               All 2 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:   5
    Reason:                SynchronizeSucceeded
    Status:                True
    Type:                  ClusterResourcePlacementSynchronized
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               Successfully applied resources to 2 member clusters
    Observed Generation:   5
    Reason:                ApplySucceeded
    Status:                True
    Type:                  ClusterResourcePlacementApplied
  Placement Statuses:
    Cluster Name:  aks-member-1
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            aks-member-2
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:       Namespace
    Name:       test
    Version:    v1
    Kind:       ConfigMap
    Name:       test-1
    Namespace:  test
    Version:    v1
Events:
  Type    Reason                     Age                    From                                   Message
  ----    ------                     ----                   ----                                   -------
  Normal  PlacementScheduleSuccess   12m (x5 over 3d22h)    cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Resources have been applied to the selected clusters

Usare la risorsa ClusterResourcePlacementStatus (anteprima)

ClusterResourcePlacementStatus è una risorsa con ambito limitato al namespace che fornisce lo stato di posizionamento di un oggetto corrispondente con ambito cluster, consentendo agli utenti del namespace privi di diritti a livello di cluster di leggere lo stato.

Importante

Risorse ClusterResourcePlacementStatus e campi StatusReportingScope sono disponibili nella versione API placement.kubernetes-fleet.io/v1beta1 come funzionalità in anteprima. Non sono disponibili nell'API placement.kubernetes-fleet.io/v1 .

Per utilizzare questo approccio, ClusterResourcePlacement deve essere configurato con statusReportingScope: NamespaceAccessible utilizzando l'API v1beta1.

Se statusReportingScope è impostato su NamespaceAccessible, è consentito un solo selettore di risorse dello spazio dei nomi e non può essere modificato dopo la creazione.

Configurazione di ClusterResourcePlacementStatus

Per usare questa funzionalità, specificare la versione dell'API v1beta1 in ClusterResourcePlacement:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-with-status-reporting
spec:
  statusReportingScope: NamespaceAccessible
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
  policy:
    placementType: PickAll

Visualizzazione di ClusterResourcePlacementStatus

È possibile visualizzare lo stato usando il kubectl describe comando :

kubectl describe clusterresourceplacementstatuses.v1beta1.placement.kubernetes-fleet.io crp-with-status-reporting -n my-app

L'output contiene le stesse informazioni sullo stato di ClusterResourcePlacement ma è accessibile agli utenti con solo autorizzazioni a livello di spazio dei nomi.

Per altre informazioni, vedere la documentazione su come interpretare il risultato del posizionamento.

Trigger di modifica del posizionamento

L'utilità di pianificazione di Fleet Manager assegna priorità alla stabilità dei posizionamenti delle risorse esistenti, che possono limitare il numero di modifiche che causano la rimozione e la riprogrammazione di una risorsa.

Gli scenari seguenti possono attivare modifiche di selezione host:

  • Le modifiche ai criteri di posizionamento nel posizionamento delle risorse (ClusterResourcePlacement o ResourcePlacement) possono attivare la rimozione e la riprogrammazione di una risorsa.
    • Le operazioni di aumento (incrementando numberOfClusters senza altre modifiche) collocano i carichi di lavoro solo nei nuovi cluster e non influiscono sui posizionamenti esistenti.
  • Modifiche del cluster membro, tra cui:
    • Un nuovo cluster membro diventa idoneo e soddisfa la politica di posizionamento, ad esempio una politica PickAll.
    • Un cluster membro viene rimosso dalla flotta. A seconda della politica, lo scheduler tenta di collocare tutte le risorse interessate nei cluster rimanenti senza influire sulle allocazioni esistenti.

L'aggiornamento delle risorse selezionate (ad esempio la modifica di un Deployment) o l'aggiornamento resourceSelector in un posizionamento delle risorse fa sì che Fleet Manager implementi gradualmente i posizionamenti esistenti, ma non attiva la riprogrammazione (ad esempio la modifica dei cluster selezionati) della risorsa.

Uso di ResourcePlacement e ClusterResourcePlacement insieme

Anche se ClusterResourcePlacement si presuppone che gli spazi dei nomi rappresentino i limiti dell'applicazione, i modelli di utilizzo reali sono spesso più complessi. Le organizzazioni usano spesso i namespace come limiti del team anziché i limiti dell'applicazione, causando diversi problemi che ResourcePlacement affronta direttamente.

Spazi dei nomi multi-applicazione: in molte organizzazioni, un singolo spazio dei nomi contiene più applicazioni indipendenti di proprietà dello stesso team. Queste applicazioni potrebbero avere:

  • Requisiti del ciclo di vita diversi (un'applicazione potrebbe richiedere aggiornamenti frequenti, mentre un'altra rimane stabile).
  • Esigenze di posizionamento dei cluster diverse (sviluppo e applicazioni di produzione).
  • Requisiti di scalabilità e risorse indipendenti.
  • Requisiti di conformità o governance separati.

Decisioni di pianificazione individuali: molti carichi di lavoro, in particolare i processi di intelligenza artificiale/Machine Learning, richiedono decisioni di pianificazione individuali:

  • Processi di intelligenza artificiale: i carichi di lavoro di Machine Learning spesso sono costituiti da processi a elevato utilizzo di risorse di breve durata che devono essere pianificati in base alla disponibilità delle risorse del cluster, alla disponibilità gpu o alla località dei dati.
  • Carichi di lavoro batch: processi batch diversi all'interno dello stesso spazio dei nomi possono essere destinati a tipi di cluster diversi in base ai requisiti di calcolo.

Completare il controllo del team dell'applicazione: ResourcePlacement fornisce ai team delle applicazioni il controllo diretto sul posizionamento delle risorse senza richiedere l'intervento del team della piattaforma:

  • Operazioni self-service: I team possono gestire le proprie strategie di distribuzione delle risorse.
  • Cicli di distribuzione indipendenti: applicazioni diverse all'interno di uno spazio dei nomi possono avere pianificazioni di implementazione indipendenti.
  • Funzionalità di override granulari: Teams può personalizzare le configurazioni delle risorse per ogni cluster senza influire sulle altre applicazioni nello spazio dei nomi.

Questo approccio granulare garantisce che ResourcePlacement possa adattarsi a diverse strutture organizzative e modelli di carico di lavoro mantenendo al tempo stesso la semplicità e la potenza del framework di pianificazione fleet.

Differenze principali tra ResourcePlacement e ClusterResourcePlacement

Nella tabella seguente sono evidenziate le differenze principali tra ResourcePlacement e ClusterResourcePlacement:

Aspetto ResourcePlacement (RP) ClusterResourcePlacement (CRP)
Scope Solo risorse con ambito spazio dei nomi Risorse con ambito cluster (in particolare gli spazi dei nomi e il relativo contenuto)
risorsa Oggetto API con ambito namespace Oggetto API con ambito cluster
Limite di selezione Limitato alle risorse all'interno dello stesso namespace del Provider di Risorse È possibile selezionare qualsiasi risorsa con ambito a livello di cluster
Casi d'uso tipici Processi di IA/ML, singoli carichi di lavoro, ConfigMaps/Secrets specifici che necessitano di decisioni di posizionamento indipendenti Bundle di applicazioni, interi spazi dei nomi, criteri a livello di cluster
Proprietà del team Può essere gestito da proprietari/sviluppatori dello spazio dei nomi In genere gestito dagli operatori della piattaforma

Entrambe ResourcePlacement e ClusterResourcePlacement condividono le stesse funzionalità di base per tutti gli altri aspetti non elencati nella tabella delle differenze.

Scenario di esempio con ResourcePlacement e ClusterResourcePlacement

ResourcePlacement è progettato per funzionare in coordinamento con ClusterResourcePlacement (CRP) per fornire una soluzione completa di gestione delle risorse multi-cluster. Comprendere questa relazione è fondamentale per una gestione efficace della flotta.

Importante

ResourcePlacement può posizionare solo le risorse con ambito namespace nei cluster che dispongono già del namespace obiettivo. È consigliabile usare ClusterResourcePlacement per la definizione dello spazio dei nomi.

Flusso di lavoro tipico:

  1. Amministratori della piattaforma: usare ClusterResourcePlacement per distribuire namespace nella rete.
  2. Application Teams: Utilizza ResourcePlacement per gestire risorse specifiche all'interno di tali spazi dei nomi stabiliti.

Gli esempi seguenti illustrano come coordinare CRP e RP:

Annotazioni

Gli esempi seguenti usano la versione dell'API placement.kubernetes-fleet.io/v1beta1 . Il selectionScope: NamespaceOnly campo è una funzionalità di anteprima disponibile nella versione 1beta1 e non è disponibile nell'API v1.

Amministratore della piattaforma: creare lo spazio dei nomi usando ClusterResourcePlacement:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: app-namespace-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
      selectionScope: NamespaceOnly # only namespace itself is placed, no resources within the namespace
  policy:
    placementType: PickAll # If placement type is not PickAll, the application teams needs to know what are the clusters they can place their applications.

Team delle applicazioni: gestiona risorse specifiche all'interno dello spazio dei nomi usando ResourcePlacement:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: app-configs-rp
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Procedure consigliate per ResourcePlacement e ClusterResourcePlacement

Quando si usa ResourcePlacement con ClusterResourcePlacement, seguire queste procedure consigliate:

  • Definire prima gli spazi dei nomi: assicurarsi sempre che gli spazi dei nomi vengano implementati tramite CRP prima di creare ResourcePlacement oggetti.
  • Monitorare le dipendenze: usare il monitoraggio della flotta per assicurarsi che i CRP a livello di spazio dei nomi siano integri prima di distribuire RPs dipendenti.
  • Politiche coordinate: allineare le politiche di posizionamento CRP e RP per evitare conflitti, ad esempio se CRP posiziona lo spazio dei nomi nei cluster A, B, C, RP può puntare a qualsiasi sottoinsieme di tali cluster.
  • Limiti del team: usare CRP per le risorse gestite dalla piattaforma (namespace, RBAC) e RP per le risorse gestite dall'applicazione (configurazioni app, segreti).

Questo approccio coordinato garantisce che ResourcePlacement fornisca la flessibilità di cui i team hanno bisogno mentre viene mantenuta l'infrastruttura di base gestita dagli operatori della piattaforma.

Selezione, posizionamento e implementazione delle risorse

ResourcePlacement usa gli stessi modelli di posizionamento di ClusterResourcePlacement:

  • Criteri di posizionamento: PickAll, PickFixede PickN i criteri funzionano in modo identico per entrambe le API.
  • Strategia di implementazione: controllare la propagazione degli aggiornamenti tra cluster con gli stessi meccanismi di aggiornamento in sequenza.
  • Stato e osservabilità: monitorare lo stato della distribuzione usando kubectl describe resourceplacement <name> -n <namespace>.
  • Funzionalità avanzate: usare tolerazioni, override delle risorse, vincoli di diffusione della topologia e regole di affinità.

La differenza principale è nell'ambito di selezione delle risorse . Anche se ClusterResourcePlacement in genere seleziona interi spazi dei nomi e il relativo contenuto, ResourcePlacement fornisce un controllo granulare sulle singole risorse con ambito spazio dei nomi.

:::zone-end

Passaggi successivi