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
- Lisez la présentation conceptuelle de la propagation des ressources pour comprendre les concepts et la terminologie utilisés dans ce démarrage rapide.
- Compte Azure avec un abonnement actif. Créez un compte gratuitement.
- Vous avez besoin d'une ressource Fleet avec un cluster hub et des clusters membres. Si vous n’en avez pas, consultez Créer une ressource Azure Kubernetes Fleet Manager et rejoindre des clusters membres à l’aide d’Azure CLI.
- Vous devez accéder à l'API Kubernetes du cluster hub. Si vous n’y avez pas accès, consultez Accéder à l’API Kubernetes de la ressource Fleet avec Azure Kubernetes Fleet Manager.
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 destotal
,allocatable
ouavailable
, 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 utiliserresources.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
,Eq
ouNe
, 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
ouDescending
. Lorsque l’ordreAscending
est utilisé, Kubernetes Fleet préfère les clusters membres avec des valeurs observées inférieures. Lorsque l’ordreDescending
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 :
Azure Kubernetes Service