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 situés dans des environnements cloud et locaux. 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 résoudre ces scénarios à l’aide de la fonctionnalité intelligente de placement des ressources Kubernetes dans Azure Kubernetes Fleet Manager.

Fleet Manager prend en charge le placement intelligent pour les ressources limitées à un cluster (ClusterResourcePlacement) et celles limitées à un espace de noms (ResourcePlacement). La fonctionnalité de placement des ressources 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 le placement des ressources limitées à un cluster et le placement des ressources limitées à un espace de noms.

Prérequis

  • Vous devez avoir un compte Azure avec un abonnement actif. Créez un compte gratuitement.

  • Vous devez disposer d’un Gestionnaire de flotte avec un cluster hub et un ou plusieurs clusters membres. Si vous n’en avez pas, suivez le guide de démarrage rapide pour créer un Fleet Manager avec un cluster hub. Ensuite, joignez vos clusters Kubernetes pris en charge en tant que membres.

    Conseil

    Vérifiez que vos clusters Kubernetes sont configurés afin que vous puissiez tester le positionnement à l’aide des propriétés du 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.

  • Si vous n'avez pas déjà le CLI Kubernetes (kubectl), vous pouvez l'installer à 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
    
  • Autoriser kubectl à se connecter au cluster Hub Fleet Manager :

    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 une charge de travail pour la sélection élective

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 Fleet Manager.

Tester les stratégies de placement d’une charge de travail

Vous pouvez utiliser les exemples suivants comme guides pour écrire vos propres objets de placement de ressources. Pour plus d’informations, consultez la documentation sur le placement des ressources à la portée d'un cluster et la documentation sur le placement des ressources à la portée d'un espace de noms.

Chaque exemple montre les variantes ClusterResourcePlacement (pour les ressources étendues au cluster et les espaces de noms entiers) et ResourcePlacement (pour les ressources délimitées à un espace de noms spécifique).

Remarque

Pour essayer chaque exemple de stratégie, supprimez l’exemple de stratégie précédent ClusterResourcePlacement ou ResourcePlacement avant d’appliquer le suivant.

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 Fleet Manager 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.

Exemple de placement des ressources de cluster

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:
                propertySorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

Exemple de ResourcePlacement

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                propertySorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

Sélection élective 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 satisfait à cette contrainte d’étiquette, Fleet Manager lui donne un poids proportionnel en fonction de la quantité totale du processeur 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 ne passe pas 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.

Exemple de placement des ressources de cluster

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
                propertySorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

Exemple de ResourcePlacement

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                propertySorter:
                  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é que le trieur dans cet exemple a une Ascending commande, Fleet Manager préfère les clusters avec des coûts de mémoire et de cœur de processeur inférieurs. 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.

Exemple de placement des ressources de cluster

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

Exemple de ResourcePlacement

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      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

Vous pouvez afficher l’état d’un placement à l’aide du portail Azure ou de la commande kubectl.

Pour plus d’informations sur la façon d’afficher la progression du placement :

Nettoyer les ressources

Pour supprimer un placement de ressource :

Étapes suivantes