Posizionamento intelligente delle risorse Kubernetes tra cluster con Azure Kubernetes Fleet Manager
Spesso gli sviluppatori di applicazioni devono distribuire le risorse Kubernetes in più cluster. Gli operatori fleet spesso devono scegliere i cluster migliori per i carichi di lavoro in base all'euristica, ad esempio i costi di calcolo o le risorse disponibili, ad esempio memoria e CPU. È noioso creare, aggiornare e tenere traccia manualmente di queste risorse Kubernetes in più cluster. Questo articolo illustra il modo in cui Azure Kubernetes Fleet Manager (Fleet) consente di gestire questi scenari usando la funzionalità di posizionamento intelligente delle risorse Kubernetes.
Panoramica
Fleet offre funzionalità di posizionamento delle risorse che possono prendere decisioni di pianificazione in base alle proprietà del cluster seguenti:
- Numero di nodi
- Costo di calcolo/memoria nei cluster membri di destinazione
- Disponibilità delle risorse (CPU/memoria) nei cluster membri di destinazione
Leggere la panoramica concettuale della propagazione delle risorse per comprendere i concetti usati in questa procedura.
Prerequisiti
Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
È necessario disporre di una risorsa Fleet con uno o più cluster membri. In caso contrario, seguire la guida introduttiva per creare una risorsa Fleet con un cluster hub e quindi aggiungere cluster servizio Azure Kubernetes (servizio Azure Kubernetes) come membri.
Raccomandazione: assicurarsi che i cluster membri del servizio Azure Kubernetes siano configurati in modo da poter testare il posizionamento usando le proprietà del cluster a cui si è interessati (posizione, numero di nodi, risorse o costi).
Impostare le seguenti variabili di ambiente:
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>
Per completare questa procedura, è necessaria l'interfaccia della riga di comando di Azure versione 2.58.0 o successiva. Per eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
Se non è già disponibile, è possibile installare l'interfaccia della riga di comando di Kubernetes (kubectl) usando questo comando:
az aks install-cli
È anche necessaria l'estensione
fleet
dell'interfaccia della riga di comando di Azure, che è possibile installare eseguendo il comando seguente:az extension add --name fleet
Eseguire il comando per eseguire l'aggiornamento
az extension update
alla versione più recente dell'estensione rilasciata:az extension update --name fleet
Autorizzare kubectl a connettersi al cluster dell'hub della flotta:
az fleet get-credentials --resource-group $GROUP --name $FLEET
Esaminare le proprietà del cluster membro
Ripetere questi passaggi per ogni cluster membro aggiunto.
Recuperare le etichette, le proprietà e le risorse per il cluster membro eseguendo una query sul cluster hub. Output come YAML per poter leggere i risultati.
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
Il file YAML risultante contiene dettagli (etichette e proprietà) che è possibile usare per creare criteri di posizionamento.
apiVersion: cluster.kubernetes-fleet.io/v1 kind: MemberCluster metadata: annotations: ... labels: fleet.azure.com/location: eastus2 fleet.azure.com/resource-group: resource-group fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8 name: cluster01 resourceVersion: "123456" uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4 spec: ... status: ... properties: kubernetes-fleet.io/node-count: observationTime: "2024-09-19T01:33:54Z" value: "2" kubernetes.azure.com/per-cpu-core-cost: observationTime: "2024-09-19T01:33:54Z" value: "0.073" kubernetes.azure.com/per-gb-memory-cost: observationTime: "2024-09-19T01:33:54Z" value: "0.022" resourceUsage: allocatable: cpu: 3800m memory: 10320392Ki available: cpu: 2740m memory: 8821256Ki capacity: cpu: "4" memory: 14195208Ki
Ripetere questo passaggio per ogni cluster membro in modo da identificare le etichette e le proprietà che è possibile usare nei criteri.
Preparare un carico di lavoro per il posizionamento
Pubblicare quindi un carico di lavoro nel cluster hub in modo che possa essere inserito nei cluster membri.
Creare uno spazio dei nomi per il carico di lavoro nel cluster hub.
kubectl create namespace test-app
Il carico di lavoro di esempio può essere distribuito nel nuovo spazio dei nomi nel cluster hub. Poiché questi tipi di risorse Kubernetes non richiedono l'incapsulamento , possono essere distribuiti senza modifiche.
Salvare il codice YAML seguente in un file denominato
sample-workload.yaml
.apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test-app spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test-app spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16.1 ports: - containerPort: 80
Distribuire la definizione del carico di lavoro nel cluster hub usando il comando .
kubectl apply -f sample-workload.yaml
Con la definizione del carico di lavoro distribuita è ora possibile testare le funzionalità di posizionamento intelligente della flotta.
Testare i criteri di posizionamento del carico di lavoro
È possibile usare gli esempi seguenti, insieme alla documentazione concettuale, come guide alla scrittura di clusterResourcePlacement.
Nota
Per provare ogni criterio di esempio, assicurarsi di eliminare il clusterResourcePlacement precedente.
Posizionamento basato sul numero di nodi del cluster
Questo esempio mostra un ordinamento di proprietà usando l'ordine che indica che la Descending
flotta preferisce i cluster con conteggi dei nodi più elevati.
Il cluster con il numero di nodi più alto riceve un peso pari a 20 e il cluster con il valore più basso riceverà 0. Altri cluster ricevono pesi proporzionali calcolati usando la formula di calcolo del peso.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
metricSorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
Posizionamento con selettore di etichette e ordinamento delle proprietà
In questo esempio un cluster riceverà un peso solo se ha l'etichetta env=prod
. Se soddisfa tale vincolo di etichetta, al cluster viene assegnato un peso proporzionale in base alla quantità di CPU totale in tale cluster membro.
In questo esempio viene illustrato come usare sia il selettore di etichette che l'ordinamento delle proprietà per preferredDuringSchedulingIgnoredDuringExecution
l'affinità. Un cluster membro che non supera il selettore di etichette non riceverà alcun peso. I cluster membro che soddisfano il selettore di etichette ricevono pesi proporzionali come specificato nell'ordinamento delle proprietà.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
labelSelector:
matchLabels:
env: prod
metricSorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
Posizionamento in base al costo core della memoria e della CPU
Poiché l'ordinamento in questo esempio ha un Ascending
ordine, la flotta preferisce i cluster con costi di memoria e core CPU inferiori. Il cluster con il costo minimo di memoria e core CPU riceve un peso pari a 20 e il cluster con il valore massimo riceverà 0. Altri cluster ricevono pesi proporzionali calcolati usando la formula di calcolo del peso.
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 2
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-gb-memory-core-cost
sortOrder: Ascending
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-cpu-core-cost
sortOrder: Ascending
Visualizzare lo stato del posizionamento
Se si vuole visualizzare lo stato di un posizionamento, è possibile usare il comando portale di Azure o kubectl.
Per informazioni dettagliate su come visualizzare lo stato di avanzamento di un posizionamento, vedere la guida introduttiva alla propagazione delle risorse.
Pulire le risorse
Per informazioni dettagliate su come rimuovere un posizionamento delle risorse cluster tramite il comando portale di Azure o kubectl, vedere la sezione relativa alle risorse di pulizia della guida introduttiva alla propagazione delle risorse.
Passaggi successivi
Per altre informazioni sulla propagazione delle risorse, vedere le risorse seguenti:
Azure Kubernetes Service