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 il costo del calcolo) o alle risorse disponibili (ad esempio memoria e CPU). È noioso creare, aggiornare e tenere traccia manualmente di queste risorse Kubernetes in più cluster. Questo articolo illustra come gestire questi scenari usando la funzionalità di posizionamento intelligente delle risorse Kubernetes in Azure Kubernetes Fleet Manager (Kubernetes Fleet).
La funzionalità di posizionamento delle risorse di Kubernetes Fleet può 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
Per altre informazioni sui concetti di questo articolo, vedere Posizionamento delle risorse Kubernetes dal cluster hub ai cluster membri.
Prerequisiti
È necessario un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
È necessario avere una risorsa Kubernetes Fleet con uno o più cluster membri. Se non è disponibile, seguire la guida introduttiva per creare una risorsa Kubernetes Fleet con un cluster hub. Aggiungere quindi i cluster servizio Azure Kubernetes (servizio Azure Kubernetes) come membri.
Suggerimento
Assicurarsi che i cluster membri del servizio Azure Kubernetes siano configurati in modo da poter testare il posizionamento usando le proprietà del cluster che interessano (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 questo articolo, è 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 l'interfaccia della riga di comando di Kubernetes (kubectl) non è già disponibile, è possibile installarla usando questo comando:
az aks install-cli
È necessaria l'estensione dell'interfaccia della
fleet
riga di comando di Azure. È possibile installarlo 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:az extension update --name fleet
Autorizzare kubectl a connettersi al cluster hub kubernetes Fleet:
az fleet get-credentials --resource-group $GROUP --name $FLEET
Esaminare le proprietà del cluster membro
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. Ecco un esempio:
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 aggiunto per 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, è possibile distribuirli senza modifiche.
Salvare il file 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:
kubectl apply -f sample-workload.yaml
Con la definizione del carico di lavoro distribuita, è ora possibile testare la funzionalità di posizionamento intelligente di Kubernetes Fleet.
Testare i criteri di posizionamento del carico di lavoro
È possibile usare gli esempi seguenti, insieme alla documentazione concettuale, come guide alla scrittura di un oggetto personalizzato ClusterResourcePlacement
.
Nota
Per provare ogni criterio di esempio, assicurarsi di eliminare l'oggetto precedente ClusterResourcePlacement
.
Posizionamento basato sul numero di nodi del cluster
In questo esempio viene illustrato un ordinamento delle proprietà che usa l'ordine Descending
. Questo ordine indica che Kubernetes Fleet 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 riceve un peso pari a 0. Altri cluster ricevono pesi proporzionali calcolati tramite 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 riceve un peso solo se ha l'etichetta env=prod
. Se il cluster soddisfa tale vincolo di etichetta, 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 riesce il selettore di etichette non riceve 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, Kubernetes Fleet 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 più alto riceve un peso pari a 0. Altri cluster ricevono pesi proporzionali calcolati tramite 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 di un posizionamento
Se si vuole visualizzare lo stato di un posizionamento, è possibile usare il portale di Azure o il comando kubectl.
Per informazioni dettagliate su come visualizzare lo stato di avanzamento di un posizionamento, vedere Usare l'API ClusterResourcePlacement per propagare le risorse ai cluster membri.
Pulire le risorse
Per informazioni dettagliate su come rimuovere un posizionamento delle risorse cluster tramite il portale di Azure o il comando kubectl, vedere Pulire le risorse nell'articolo sulla propagazione delle risorse.
Contenuto correlato
- Per altre informazioni sulla propagazione delle risorse, vedere la documentazione di Kubernetes Fleet open source.
Azure Kubernetes Service