Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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-cliVous avez besoin de l’extension Azure CLI
fleet. Vous pouvez l’installer en exécutant la commande suivante :az extension add --name fleetExécutez la commande
az extension updatepour effectuer une mise à jour vers la dernière version de l’extension :az extension update --name fleetAutoriser 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 :
Créez un espace de noms pour la charge de travail sur le cluster hub :
kubectl create namespace test-appL’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: 80Dé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 :
- Pour
ClusterResourcePlacementplus d’informations, consultez l’API ClusterResourcePlacement pour propager des ressources aux clusters membres. - Pour
ResourcePlacement, consultez Utiliser ResourcePlacement pour placer des ressources limitées à un espace de noms.
Nettoyer les ressources
Pour supprimer un placement de ressource :
- Pour
ClusterResourcePlacement, consultez Libération des ressources. - Pour
ResourcePlacement, consultez Libération des ressources.
Étapes suivantes
- Placement de ressources dans l’étendue du cluster à l’aide de ClusterResourcePlacement
- Placement des ressources délimitées à l’espace de noms à l’aide de ResourcePlacement
- Utiliser le placement des ressources de cluster pour déployer des charges de travail sur plusieurs clusters
- Utiliser le placement des ressources à l'échelle de l'espace de noms pour déployer des charges de travail sur plusieurs clusters
- Définir une stratégie de déploiement pour un placement de ressources