Partager via


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 :

  1. Créez un espace de noms pour la charge de travail sur le cluster hub :

    kubectl create namespace test-app 
    
  2. 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.

    1. 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
      
    2. 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.