Intelligente plaatsing van Kubernetes-resources tussen clusters met behulp van Azure Kubernetes Fleet Manager
Toepassingsontwikkelaars moeten Kubernetes-resources vaak implementeren in meerdere clusters. Vlootoperators moeten vaak de beste clusters kiezen voor workloads op basis van heuristiek (zoals kosten van rekenkracht) of beschikbare resources (zoals geheugen en CPU). Het is vervelend om deze Kubernetes-resources handmatig te maken, bij te werken en bij te houden in meerdere clusters. In dit artikel wordt beschreven hoe u deze scenario's kunt aanpakken met behulp van de intelligente Plaatsingsmogelijkheid voor Kubernetes-resources in Azure Kubernetes Fleet Manager (Kubernetes Fleet).
De resourceplaatsingsmogelijkheid van Kubernetes Fleet kan planningsbeslissingen nemen op basis van de volgende clustereigenschappen:
- Aantal knooppunten
- Kosten van rekenkracht/geheugen in doellidclusters
- Beschikbaarheid van resources (CPU/geheugen) in doellidclusters
Zie Kubernetes-resourceplaatsing van hubcluster naar lidclusters voor meer informatie over de concepten in dit artikel.
Vereisten
U hebt een Azure-account met een actief abonnement nodig. Gratis een account maken
U moet een Kubernetes Fleet-resource hebben met een of meer lidclusters. Als u nog geen resource hebt, volgt u de quickstart om een Kubernetes Fleet-resource te maken met een hubcluster. Voeg vervolgens AKS-clusters (Azure Kubernetes Service) toe als leden.
Tip
Zorg ervoor dat uw AKS-lidclusters zo zijn geconfigureerd dat u plaatsing kunt testen met behulp van de clustereigenschappen die u interesseren (locatie, aantal knooppunten, resources of kosten).
Stel de volgende omgevingsvariabelen in:
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>
U moet Azure CLI versie 2.58.0 of hoger hebben geïnstalleerd om dit artikel te voltooien. Zie Azure CLI installeren als u CLI wilt installeren of upgraden.
Als u de Kubernetes CLI (kubectl) nog niet hebt, kunt u deze installeren met behulp van deze opdracht:
az aks install-cli
U hebt de
fleet
Azure CLI-extensie nodig. U kunt deze installeren door de volgende opdracht uit te voeren:az extension add --name fleet
Voer de
az extension update
opdracht uit om bij te werken naar de nieuwste versie van de extensie:az extension update --name fleet
Kubectl autoriseren om verbinding te maken met het Kubernetes Fleet-hubcluster:
az fleet get-credentials --resource-group $GROUP --name $FLEET
Eigenschappen van lidcluster controleren
Haal de labels, eigenschappen en resources voor uw lidcluster op door een query uit te voeren op het hubcluster. Uitvoer als YAML, zodat u de resultaten kunt lezen.
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
Het resulterende YAML-bestand bevat details (labels en eigenschappen) die u kunt gebruiken om plaatsingsbeleid te bouwen. Hier volgt een voorbeeld:
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
Herhaal deze stap voor elk lidcluster dat u toevoegt om de labels en eigenschappen te identificeren die u in uw beleid kunt gebruiken.
Een workload voorbereiden voor plaatsing
Publiceer vervolgens een workload naar het hubcluster, zodat deze op lidclusters kan worden geplaatst:
Maak een naamruimte voor de workload in het hubcluster:
kubectl create namespace test-app
De voorbeeldworkload kan worden geïmplementeerd in de nieuwe naamruimte op het hubcluster. Omdat voor deze Kubernetes-resourcetypen geen inkapselen is vereist, kunt u ze zonder wijzigingen implementeren.
Sla de volgende YAML op in een bestand met de naam
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
Implementeer de workloaddefinitie in uw hubcluster:
kubectl apply -f sample-workload.yaml
Nu de definitie van de workload is geïmplementeerd, is het nu mogelijk om de intelligente plaatsingsmogelijkheid van Kubernetes Fleet te testen.
Beleid voor plaatsing van workloads testen
U kunt de volgende voorbeelden gebruiken, samen met de conceptuele documentatie, als handleidingen voor het schrijven van uw eigen ClusterResourcePlacement
object.
Notitie
Als u elk voorbeeldbeleid wilt uitproberen, moet u het vorige ClusterResourcePlacement
object verwijderen.
Plaatsing op basis van aantal clusterknooppunten
In dit voorbeeld ziet u een eigenschapssorteerder die gebruikmaakt van de Descending
volgorde. Deze volgorde betekent dat Kubernetes Fleet de voorkeur geeft aan clusters met een hoger aantal knooppunten.
Het cluster met het hoogste aantal knooppunten ontvangt een gewicht van 20 en het cluster met het laagste aantal knooppunten ontvangt een gewicht van 0. Andere clusters ontvangen proportionele gewichten die worden berekend via de formule voor gewichtsberekening.
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
Plaatsing met labelkiezer en eigenschapssorteerder
In dit voorbeeld ontvangt een cluster alleen een gewicht als het label env=prod
bevat. Als het cluster voldoet aan die labelbeperking, krijgt het proportionele gewicht op basis van de totale CPU in dat lidcluster.
In dit voorbeeld ziet u hoe u zowel de labelkiezer als de eigenschapssor voor preferredDuringSchedulingIgnoredDuringExecution
affiniteit kunt gebruiken. Een lidcluster dat de labelkiezer mislukt, ontvangt geen gewicht. Lidclusters die voldoen aan de labelkiezer ontvangen proportionele gewichten, zoals opgegeven onder de eigenschapssorteerder.
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
Plaatsing op basis van geheugen- en CPU-kernkosten
Omdat de sorteerfunctie in dit voorbeeld een Ascending
volgorde heeft, geeft Kubernetes Fleet de voorkeur aan clusters met lagere geheugen- en CPU-kernkosten. Het cluster met de laagste geheugen- en CPU-kernkosten ontvangt een gewicht van 20 en het cluster met het hoogste gewicht 0. Andere clusters ontvangen proportionele gewichten die worden berekend via de formule voor gewichtsberekening.
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
De status van een plaatsing weergeven
Als u de status van een plaatsing wilt bekijken, kunt u de Azure-portal of de kubectl-opdracht gebruiken.
U vindt meer informatie over het weergeven van de voortgang van een plaatsing in De ClusterResourcePlacement-API gebruiken om resources door te geven aan lidclusters.
Resources opschonen
Zie Resources opschonen in het artikel over het doorgeven van resources voor meer informatie over het verwijderen van plaatsing van een clusterresource via Azure Portal of de kubectl-opdracht.
Gerelateerde inhoud
- Zie de opensource-documentatie van Kubernetes Fleet voor meer informatie over het doorgeven van resources.
Azure Kubernetes Service