Placement intelligent des ressources Kubernetes entre clusters à l’aide d’Azure Kubernetes Fleet Manager
Les développeurs d’applications doivent souvent déployer des ressources Kubernetes dans plusieurs clusters. Les opérateurs Fleet doivent souvent choisir les meilleurs clusters pour les charges de travail en fonction d’informations heuristiques (telles que le coût du calcul) ou la disponibilité des ressources (par exemple, la mémoire et le processeur). Il est fastidieux de créer, de mettre à jour, puis de suivre manuellement ces ressources Kubernetes sur plusieurs clusters. Cet article explique comment vous pouvez résoudre ces scénarios à l’aide de la fonctionnalité intelligente de placement des ressources Kubernetes dans Azure Kubernetes Fleet Manager (Kubernetes Fleet).
La fonctionnalité de placement des ressources de Kubernetes Fleet peut prendre des décisions de planification en fonction des propriétés de cluster suivantes :
- Nombre de nœuds
- Coût du calcul/de la mémoire dans les clusters membres cibles
- Disponibilité des ressources (processeur/mémoire) dans les clusters membres cibles
Pour plus d’informations sur les concepts de cet article, consultez Placement des ressources Kubernetes d’un cluster hub vers des clusters membres.
Prérequis
Vous devez avoir un compte Azure avec un abonnement actif. Créez un compte gratuitement.
Vous devez avoir une ressource Kubernetes Fleet avec un ou plusieurs clusters membres. Si vous n’en avez pas, suivez le guide de démarrage rapide pour créer une ressource Kubernetes Fleet avec un cluster hub. Ensuite, rejoignez des clusters Azure Kubernetes Service (AKS) en tant que membres.
Conseil
Vérifiez que vos clusters membres AKS sont configurés pour vous permettre de tester le placement à l’aide des propriétés de cluster qui vous intéressent (emplacement, nombre de nœuds, ressources ou coût).
Définissez les variables d’environnement suivantes :
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>
Azure CLI version 2.58.0 ou une version ultérieure doit être installé pour vous permettre de suivre cet article. Pour installer ou mettre à niveau Azure CLI, consultez Installer l’interface de ligne de commande Microsoft Azure.
Le cas échéant, vous pouvez installer l’interface CLI de Kubernetes (kubectl) à l’aide de cette commande :
az aks install-cli
Vous avez besoin de l’extension Azure CLI
fleet
. Vous pouvez l’installer en exécutant la commande suivante :az extension add --name fleet
Exécutez la commande
az extension update
pour effectuer une mise à jour vers la dernière version de l’extension :az extension update --name fleet
Autorisez kubectl à se connecter au cluster de hub Kubernetes Fleet :
az fleet get-credentials --resource-group $GROUP --name $FLEET
Inspecter les propriétés des clusters membres
Récupérez les étiquettes, les propriétés et les ressources de votre cluster membre en interrogeant le cluster hub. Générez la sortie au format YAML pour pouvoir lire les résultats.
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
Le fichier YAML résultant contient des détails (étiquettes et propriétés) qui vous permettent de créer des stratégies de placement. Voici un exemple :
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
Répétez cette étape pour chaque cluster membre que vous ajoutez, afin d’identifier les étiquettes et les propriétés utilisables dans votre stratégie.
Préparer le placement d’une charge de travail
Publiez ensuite une charge de travail sur le cluster hub pour qu’elle puisse être placée sur les clusters membres :
Créez un espace de noms pour la charge de travail sur le cluster hub :
kubectl create namespace test-app
L’exemple de charge de travail peut être déployé sur le nouvel espace de noms du cluster hub. Étant donné que ces types de ressources Kubernetes ne nécessitent pas d’encapsulation, vous pouvez les déployer sans modification.
Enregistrez le contenu YAML suivant dans un fichier nommé
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
Déployez la définition de la charge de travail sur votre cluster hub :
kubectl apply -f sample-workload.yaml
Avec la définition de charge de travail déployée, il est désormais possible de tester la fonctionnalité de placement intelligente de Kubernetes Fleet.
Tester les stratégies de placement d’une charge de travail
Vous pouvez utiliser les exemples suivants ainsi que la documentation conceptuelle en tant que guides pour l’écriture de votre propre objet ClusterResourcePlacement
.
Remarque
Si vous souhaitez essayer chaque exemple de stratégie, veillez à supprimer l’objet ClusterResourcePlacement
précédent.
Placement en fonction du nombre de nœuds de cluster
Cet exemple montre un trieur de propriétés qui utilise l’ordre Descending
. Cet ordre signifie que Kubernetes Fleet préfère les clusters avec des nombres de nœuds plus élevés.
Le cluster avec le nombre de nœuds le plus élevé reçoit un poids de 20, et le cluster avec le plus bas reçoit un poids de 0. Les autres clusters reçoivent des poids proportionnels calculés à l’aide de la formule de calcul de poids.
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
Placement avec le sélecteur d’étiquette et le trieur de propriétés
Dans cet exemple, un cluster reçoit un poids uniquement s’il a l’étiquette env=prod
. Si le cluster répond à cette contrainte d’étiquette, il se voit affecter un poids proportionnel en fonction du nombre total de processeurs dans ce cluster membre.
Cet exemple montre comment utiliser le sélecteur d’étiquette et le trieur de propriétés pour l’affinité preferredDuringSchedulingIgnoredDuringExecution
. Un cluster membre qui échoue le sélecteur d’étiquette ne reçoit aucun poids. Les clusters membres qui répondent au sélecteur d’étiquette reçoivent des pondérations proportionnelles, comme spécifié sous le trieur de propriétés.
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
Placement en fonction du coût de la mémoire et des cœurs de processeur
Étant donnée que le trieur de cet exemple a un ordre Ascending
, Kubernetes Fleet préfère les clusters ayant des coûts de mémoire et de cœur de processeur plus faibles. Le cluster ayant les coûts de mémoire et de cœur de processeur les plus faibles reçoit un poids de 20, alors que le cluster le plus élevé reçoit un poids de 0. Les autres clusters reçoivent des poids proportionnels calculés à l’aide de la formule de calcul de poids.
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
Afficher l’état d’un placement
Si vous souhaitez afficher l’état d’un placement, vous pouvez utiliser le portail Microsoft Azure ou la commande kubectl.
Vous trouverez des détails sur la façon d’afficher la progression d’un placement dans Utiliser l’API ClusterResourcePlacement pour propager des ressources aux clusters membres.
Nettoyer les ressources
Pour plus d’informations sur la suppression d’un placement de ressources de cluster via le portail Microsoft Azure ou la commande kubectl, consultez Nettoyer des ressources dans l’article sur la propagation des ressources.
Contenu connexe
- Pour en savoir plus sur la propagation des ressources, consultez la documentation Kubernetes Fleet open source.
Azure Kubernetes Service