Partager via


Placement intelligent des ressources Kubernetes entre clusters à l’aide d’Azure Kubernetes Fleet Manager (préversion)

Les développeurs d’applications doivent souvent déployer des ressources Kubernetes dans plusieurs clusters. Les opérateurs de flotte doivent souvent choisir les meilleurs clusters pour placer les charges de travail en fonction d’heuristiques telles que le coût de calcul dans les clusters ou les ressources disponibles telles que 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 Azure Kubernetes Fleet Manager (Fleet) vous permet de résoudre ces scénarios à l’aide de la fonctionnalité intelligente de placement des ressources Kubernetes.

Vue d’ensemble

Fleet fournit une fonctionnalité de placement des ressources qui peut prendre des décisions de planification en fonction des propriétés suivantes :

  • Nombre de nœuds
  • Coût du calcul dans les clusters membres cibles
  • Disponibilité des ressources (processeur/mémoire) dans les clusters membres cibles

Important

Les fonctionnalités d’évaluation d’Azure Kubernetes Fleet Manager sont disponibles en libre-service et font l’objet d’un abonnement. Les préversions sont fournies « en l’état » et « en fonction des disponibilités », et sont exclues des contrats de niveau de service et de la garantie limitée. Les préversions d’Azure Kubernetes Fleet Manager sont, dans la mesure du possible, partiellement couvertes par le service clientèle. Telles quelles, ces fonctionnalités ne sont pas destinées à une utilisation en production.

Cet article aborde la création de placements de ressources de cluster, qui peuvent être effectués via l’interface de ligne de commande Azure ou le Portail Azure. Pour en savoir plus, consultez Propager les ressources d'un cluster Fleet Hub vers les clusters membres.

Prérequis

Filtrer les clusters au moment de la planification en fonction des propriétés du cluster membre

requiredDuringSchedulingIgnoredDuringExecution le type d’affinité permet de filtrer les clusters membres éligibles pour le placement à l’aide de sélecteurs de propriétés. Un sélecteur de propriétés est un tableau de conditions d’expression par rapport aux propriétés du cluster.

Dans chaque condition que vous spécifiez :

  • Nom: Nom de la propriété, qui doit être au format suivant :

    resources.kubernetes-fleet.io/<CAPACITY-TYPE>-<RESOURCE-NAME>
    

    <CAPACITY-TYPE> est l’un des total, allocatableou available, selon la capacité (informations d’utilisation) sur laquelle vous souhaitez effectuer une vérification, et <RESOURCE-NAME> est le nom de la ressource (processeur/mémoire).

    Par exemple, si vous souhaitez sélectionner des clusters en fonction de la capacité processeur disponible d’un cluster, le nom utilisé dans le sélecteur de propriétés doit être resources.kubernetes-fleet.io/available-cpu. Pour la capacité de mémoire allocatable, vous pouvez utiliser resources.kubernetes-fleet.io/allocatable-memory.

  • Liste des valeurs, qui sont des valeurs possibles de la propriété.

  • Opérateur utilisé pour exprimer la condition entre la valeur contrainte/souhaitée et la valeur observée sur le cluster. Les opérateurs suivants sont actuellement pris en charge :

    • Gt (Supérieur à) : la valeur observée d’un cluster de la propriété donnée doit être supérieure à la valeur de la condition avant de pouvoir être choisie pour le placement des ressources.
    • Ge (Supérieur ou égal à) : la valeur observée d’un cluster de la propriété donnée doit être supérieure ou égale à la valeur dans la condition avant de pouvoir être choisie pour le placement des ressources.
    • Lt (Inférieur à) : la valeur observée d’un cluster de la propriété donnée doit être inférieure à la valeur dans la condition avant de pouvoir être choisie pour le placement des ressources.
    • Le (Inférieur ou égal à) : la valeur observée d’un cluster de la propriété donnée doit être inférieure ou égale à la valeur dans la condition avant de pouvoir être choisie pour le placement des ressources.
    • Eq (Égal à) : la valeur observée d’un cluster de la propriété donnée doit être égale à la valeur dans la condition avant de pouvoir être choisie pour le placement des ressources.
    • Ne (Non égal à) : la valeur observée d’un cluster de la propriété donnée ne doit pas être égale à la valeur dans la condition avant de pouvoir être choisie pour le placement des ressources.

    Si vous utilisez l’opérateur Gt, Ge, Lt, Le, Eqou Ne, la liste des valeurs dans la condition doit avoir exactement une valeur.

Fleet évalue chaque cluster en fonction des propriétés spécifiées dans la condition. Le non-respect des conditions répertoriées dans requiredDuringSchedulingIgnoredDuringExecution exclut ce cluster membre du placement des ressources.

Remarque

Si un cluster membre ne possède pas la propriété exprimée dans la condition, elle échouera automatiquement.

Exemple de stratégie de placement pour sélectionner uniquement des clusters dont la taille est supérieure ou égale à cinq nœuds pour le placement des ressources :

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

Vous pouvez utiliser des sélecteurs d’étiquettes et de propriétés sous requiredDuringSchedulingIgnoredDuringExecution terme d’affinité pour filtrer les clusters membres éligibles sur ces deux contraintes.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      region: east
                  propertySelector:
                    matchExpressions:
                    - name: "kubernetes.azure.com/node-count"
                      operator: Ge
                      values:
                      - "5"

Dans cet exemple, Kubernetes Fleet considère uniquement un cluster pour le placement des ressources s’il a l’étiquette region=east et un nombre de nœuds supérieur ou égal à cinq.

Classement des clusters au moment de la planification en fonction des propriétés du cluster membre

Lorsque preferredDuringSchedulingIgnoredDuringExecution est utilisé, un trieur de propriétés classe tous les clusters de la flotte en fonction de leurs valeurs dans l’ordre croissant ou décroissant. Les pondérations sont calculées en fonction de la valeur de poids spécifiée sous preferredDuringSchedulingIgnoredDuringExecution.

Un trieur de propriétés se compose des éléments suivants :

  • Nom: nom de la propriété avec plus d’informations sur la mise en forme de la propriété couverte dans la section précédente.
  • Ordre de tri: l’ordre de tri peut être Ascending ou Descending. Lorsque l’ordreAscending est utilisé, Kubernetes Fleet préfère les clusters membres avec des valeurs observées inférieures. Lorsque l’ordre Descending est utilisé, les clusters membres avec une valeur observée plus élevée sont préférés.

Pour l’ordre de tri Descending, le poids proportionnel est calculé à l’aide de la formule :

((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight

Par exemple, supposons que vous souhaitez classer les clusters en fonction de la propriété de la capacité processeur disponible dans l’ordre décroissant et que vous disposez d’une flotte de trois clusters avec le processeur disponible suivant :

Cluster Capacité processeur disponible
bravelion 100
smartfish 20
jumpingcat 10

Dans ce cas, le trieur calcule les pondérations suivantes :

Cluster Capacité processeur disponible Poids
bravelion 100 (100 - 10) / (100 - 10) = 100 % du poids
smartfish 20 (20 - 10) / (100 - 10) = 11,11 % du poids
jumpingcat 10 (10 - 10) / (100 - 10) = 0 % du poids

Pour l’ordre de tri Ascending, le poids proportionnel est calculé à l’aide de la formule :

(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight

Par exemple, supposons que vous souhaitez classer les clusters en fonction de leur coût par cœur de processeur dans l’ordre croissant et que vous disposez d’une flotte de trois clusters avec les coûts de cœur de processeur suivants :

Cluster Coût de cœur par processeur
bravelion 1
smartfish 0.2
jumpingcat 0.1

Dans ce cas, le trieur calcule les pondérations suivantes :

Cluster Coût de cœur par processeur Poids
bravelion 1 1 - ((1 - 0.1) / (1 - 0.1)) = 0 % du poids
smartfish 0.2 1 - ((0.2 - 0.1) / (1 - 0.1)) = 88,89 % du poids
jumpingcat 0.1 1 - (0.1 - 0.1) / (1 - 0.1) = 100 % du poids

L’exemple ci-dessous présente un trieur de propriétés à l’aide de l’ordre de Descending :

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                metricSorter:
                  name: kubernetes.azure.com/node-count
                  sortOrder: Descending

Dans cet exemple, 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é recevrait un poids de 20, et le cluster avec le plus bas recevrait 0. D’autres clusters reçoivent des pondérations proportionnelles calculées à l’aide de la formule de calcul de poids.

Vous pouvez utiliser le sélecteur d’étiquette et le trieur de propriétés sous 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 trieur de propriétés.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  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

Dans cet exemple, un cluster ne reçoit qu’un poids supplémentaire s’il a l’étiquette env=prod. S’il satisfait à cette contrainte basée sur l’étiquette, le cluster reçoit un poids proportionnel en fonction de la quantité totale d’UC dans ce cluster membre.

Nettoyer les ressources

Si vous ne souhaitez plus utiliser l'objet ClusterResourcePlacement, vous pouvez le supprimer à l'aide de la commande kubectl delete. L'exemple suivant supprime l'objet ClusterResourcePlacement nommé crp :

kubectl delete clusterresourceplacement crp

Étapes suivantes

Pour en savoir plus sur la propagation des ressources, consultez les ressources suivantes :