Présentation de l'Azure Kubernetes Fleet Manager pour le placement intelligent des ressources

S’applique à ✔️ Gestionnaire de flotte avec un cluster central

La gestion des ressources Kubernetes sur plusieurs clusters présente des défis importants pour les administrateurs de plateforme et les développeurs d’applications. À mesure que les organisations mettent à l’échelle leur infrastructure Kubernetes au-delà d’un seul cluster, elles rencontrent souvent des complexités liées à la distribution des ressources, à la cohérence et à la surcharge de gestion manuelle. L’approche traditionnelle de la gestion de chaque cluster crée indépendamment des silos opérationnels qui deviennent de plus en plus difficiles à maintenir à mesure que la taille de la flotte augmente.

Les administrateurs de plateforme doivent souvent déployer des ressources Kubernetes sur plusieurs clusters pour différentes raisons, notamment :

  • Gestion du contrôle d’accès à l’aide de rôles et de liaisons de rôles sur plusieurs clusters.
  • Exécution d’applications d’infrastructure, telles que Prometheus ou Flux, qui doivent se trouver sur tous les clusters.

Les développeurs d’applications doivent souvent déployer des ressources Kubernetes dans plusieurs clusters pour plusieurs raisons, par exemple :

  • Déploiement d’une application de service vidéo dans plusieurs clusters de différentes régions, pour une expérience de visionnage avec une latence faible.
  • Déploiement d’une application de panier d’achat dans deux régions appairées pour que les clients puissent continuer leurs achats pendant une panne d’une région unique.
  • Déploiement d’une application de calcul par lots dans des clusters avec des pools de nœuds spot peu coûteux disponibles.

Il est fastidieux et potentiellement sujet à des erreurs de créer, de suivre et de mettre à jour manuellement les ressources Kubernetes sur plusieurs clusters.

Dans cet article, nous allons découvrir comment utiliser la fonctionnalité de placement des ressources intelligentes de Fleet Manager pour la gestion de la distribution des ressources Kubernetes à l'échelle des clusters et des espaces de noms entre les clusters membres d'une flotte.

La fonctionnalité de placement des ressources de Fleet Manager est basée sur le projet KUBeFleet CNCF.

Vue d’ensemble du processus de placement des ressources

Pour utiliser le placement intelligent des ressources de Fleet Manager, procédez comme suit :

  1. Mettre en scène des ressources sur un cluster hub : utilisez le déploiement continu, GitOps ou une méthode similaire pour appliquer les manifestes pour les distributions de ressources sur le cluster Hub Fleet Manager.
  2. Créez un placement de ressource : créez un manifeste de placement qui sélectionne la ressource et définit une stratégie pour choisir les clusters membres qui reçoivent la ressource.
  3. Appliquer le placement des ressources sur le cluster hub : appliquez le manifeste de placement au cluster hub pour commencer à distribuer la ressource.
  4. Fleet Manager planifie les ressources : Fleet Manager observe le placement des ressources et l’étendue sélectionnée, et effectue la distribution des ressources.
  5. Observez la distribution via le placement des ressources : interrogez l’emplacement des ressources sur le cluster hub pour vérifier l’état de la ressource au fur et à mesure qu’elle est déployée.

Fleet Manager a une expérience de portail Azure pour le placement des ressources qui fournit une représentation visuelle plus visuelle du déploiement.

Présentation du placement de ressources à l'échelle du cluster

Utilisez un ClusterResourcePlacement (CRP) pour distribuer un ensemble donné de ressources étendues au cluster ou d’espaces de noms entiers à partir du cluster Hub Fleet Manager sur un ou plusieurs clusters membres.

Principales caractéristiques :

  • À l'échelle du cluster : sélectionne les ressources ou les espaces de noms relevant du cluster.
  • Déclaratif : utilise les mêmes stratégies de placement que ResourcePlacement pour un comportement cohérent.

À l’aide de CRP, vous pouvez :

  • Sélectionnez les ressources Kubernetes à distribuer. Ces ressources peuvent être des ressources Kubernetes étendues au cluster définies à l’aide de références GVK (Group Version Kind) Kubernetes ou un espace de noms, qui distribue l’espace de noms et toutes ses ressources.
  • Spécifiez des stratégies de placement pour sélectionner des clusters membres. Ces stratégies peuvent sélectionner explicitement des clusters par noms ou sélectionner dynamiquement des clusters en fonction des étiquettes et des propriétés du cluster.
  • Spécifiez des stratégies de lancement pour déployer de façon sécurisée les mises à jour des ressources Kubernetes sélectionnées sur plusieurs clusters cibles.
  • Affichez la progression du déploiement pour chaque cluster cible.

Pour les scénarios nécessitant un contrôle précis sur les ressources délimitées à l'espace de noms individuellement au sein d'un espace de noms, consultez le placement des ressources délimitées à l'espace de noms, qui permet la distribution de ressources spécifiques plutôt que d'espaces de noms entiers.

Présentation du placement des ressources au niveau de l'espace de noms

Utilisez un ResourcePlacement (RP) pour distribuer un ensemble donné de ressources au sein d’un espace de noms spécifique à partir du cluster hub Fleet Manager sur un ou plusieurs clusters membres. ResourcePlacement fournit un contrôle précis sur la façon dont des ressources spécifiques au sein d’un espace de noms sont distribuées entre les clusters membres.

Principales caractéristiques :

  • À l'échelle de l'espace de noms : ResourcePlacement et les ressources qu'il sélectionne se trouvent tous deux dans le même espace de noms.
  • Sélectif : sélectionne des ressources spécifiques dans l’espace de noms par type, nom ou étiquettes plutôt que des espaces de noms entiers.
  • Déclaratif : utilise les mêmes stratégies de placement que ClusterResourcePlacement pour un comportement cohérent.

Quand utiliser ResourcePlacement

ResourcePlacement est idéal pour les scénarios qui nécessitent un contrôle granulaire des ressources limitées à un espace de noms :

  • Distribution sélective des ressources : déployez des configMaps, des secrets ou des services spécifiques sans affecter l’espace de noms entier.
  • Environnements multilocataires : permettre à différentes équipes de gérer leurs ressources indépendamment dans les espaces de noms partagés.
  • Gestion de la configuration : distribuez des configurations spécifiques à l’environnement dans différents environnements de cluster.
  • Conformité et gouvernance : appliquez différentes stratégies à différents types de ressources dans le même espace de noms.
  • Déploiements progressifs : déployez en toute sécurité les mises à jour des ressources sur les clusters à l’aide de stratégies de temps d’arrêt zéro.

Dans les environnements multicluster, les charges de travail se composent souvent à la fois de ressources de portée cluster et de ressources de portée espace de noms que vous devez distribuer sur différents clusters. Bien que ClusterResourcePlacement (CRP) gère efficacement les ressources étendues au cluster, elle gère également l’ensemble des espaces de noms et leur contenu. Toutefois, certains scénarios nécessitent un contrôle plus précis sur les ressources délimitées à l’espace de noms dans les espaces de noms existants.

ResourcePlacement (RP) répond à cet écart en fournissant :

  • Gestion des ressources délimitées à l’espace de noms : ciblez des ressources spécifiques au sein d’un espace de noms sans affecter l’espace de noms entier.
  • Flexibilité opérationnelle : permettre aux équipes de gérer différentes ressources au sein du même espace de noms indépendamment.
  • Fonctionnalités complémentaires : collaborez avec CRP pour fournir une solution complète de gestion des ressources multicluster.

Note

Vous pouvez utiliser ResourcePlacement avec ClusterResourcePlacement en mode espace de noms uniquement. Par exemple, utilisez CRP pour déployer l’espace de noms et utilisez rp pour une gestion affinée de ressources spécifiques telles que ConfigMaps ou Secrets spécifiques à l’environnement dans cet espace de noms.

Composants de placement des ressources

Un placement de ressources, quelle que soit l’étendue (cluster ou espace de noms), se compose des composants suivants :

  • Sélecteurs de ressources : sélectionnez les ressources à inclure via resourceSelectors.
  • Stratégie de placement : définissez comment sélectionner des clusters via placementType en utilisant l’un des types PickAll, PickFixed ou PickN.
  • Stratégie de déploiement : contrôlez la façon dont les ressources sont déployées sur des clusters sélectionnés en incluant une option facultative strategy.

Cet exemple clusterResourcePlacement (CRP) place l’espace de noms my-app sur tous les clusters de la flotte. Comme vous n’avez pas défini de stratégie explicite, le processus utilise un RollingUpdate.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: namespace-only-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
  policy:
    placementType: PickAll   

Cet exemple de ResourcePlacement (RP) place la ConfigMap portant l'étiquette app=my-application dans l'espace de noms my-app dans l'espace de noms correspondant sur les deux clusters désignés. Comme vous n’avez pas défini de stratégie explicite, le processus utilise un RollingUpdate.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Sélecteurs de ressources

Sélectionnez des ressources à l’aide d’une ou plusieurs resourceSelectors dans un placement. Chaque sélecteur de ressources peut spécifier :

  • Groupe, version, type (GVK) : type de ressource Kubernetes à sélectionner.
  • Nom : nom d’une ressource spécifique.
  • Sélecteurs d’étiquettes : permet de faire correspondre les étiquettes à plusieurs ressources.

Étendue de sélection d’espace de noms

Lorsque vous utilisez un placement délimité par un cluster pour sélectionner un espace de noms entier, utilisez le selectionScope champ pour contrôler s’il faut inclure toutes les ressources enfants dans l’espace de noms ou simplement placer un espace de noms vide.

  • Comportement par défaut (quand selectionScope n’est pas spécifié) : distribue l’espace de noms et toutes les ressources qu’il contient.
  • NamespaceOnly: distribue uniquement la ressource d’espace de noms, sans aucune ressource dans l’espace de noms. Cette option est utile lorsque vous souhaitez établir des espaces de noms sur plusieurs clusters tout en gérant séparément les ressources individuelles à l’aide de ResourcePlacement.

Cet exemple montre comment distribuer uniquement l’espace de noms sans son contenu.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: namespace-only-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
      selectionScope: NamespaceOnly
  policy:
    placementType: PickAll

Cette approche permet aux administrateurs de plateforme d’utiliser ClusterResourcePlacement pour établir des espaces de noms, tandis que les équipes d’application utilisent ResourcePlacement pour un contrôle précis sur des ressources spécifiques au sein de ces espaces de noms.

Stratégie de placement

Le placement des ressources de Fleet Manager prend en charge les types de stratégies de placement suivants pour contrôler la manière dont il sélectionne les clusters :

  • PickFixed place les ressources sur des clusters membres à l’aide de leurs noms de cluster.
  • PickAll place des ressources sur tous les clusters membres ou tous les clusters membres qui répondent à des critères. Cette stratégie est utile pour placer des charges de travail d’infrastructure, telles que la supervision de cluster ou les applications de création de rapports.
  • PickN est l’option de placement la plus flexible. Il vous permet de sélectionner des clusters en fonction des contraintes d’affinité ou de topologie. Utilisez cette stratégie lors de la répartition des charges de travail sur plusieurs clusters similaires pour garantir la disponibilité.

Type de placement PickFixed

Permet PickFixed de sélectionner les clusters par nom. Fournissez des noms dans le clusterNames tableau.

Cet exemple montre comment distribuer l'espace de noms test-deployment sur les clusters cluster1 membres et cluster2.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-fixed
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-deployment
      version: v1
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Cet exemple de ResourcePlacement (RP) place la ConfigMap portant l'étiquette app: my-application dans l'espace de noms my-app dans l'espace de noms correspondant sur les deux clusters désignés.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Type de placement PickAll

Permet PickAll de distribuer des ressources sur tous les clusters membres ou tous les clusters qui correspondent à un critère que vous spécifiez.

Lorsque vous créez ce type de placement, spécifiez les types d’affinité de cluster suivants :

  • requiredDuringSchedulingIgnoredDuringExecution : cette stratégie étant requise lors de la planification, elle filtre les clusters en fonction des critères spécifiés.

Cet exemple montre comment distribuer le namespace prod-deployment et toutes ses ressources enfants sur tous les clusters membres portant l'étiquette environment: production.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickall
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production

Cet exemple de ResourcePlacement (RP) place la ConfigMap portant l'étiquette app: my-application dans l'espace de noms my-app dans l'espace de noms correspondant sur tous les clusters portant l'étiquette environment: production :

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production

Type de placement PickN

Permet PickN de distribuer des ressources sur un nombre configurable de clusters en fonction des affinités et des contraintes de répartition de topologie.

Lorsque vous créez ce type de placement, spécifiez les types d’affinité de cluster suivants :

  • requiredDuringSchedulingIgnoredDuringExecution : cette stratégie étant requise lors de la planification, elle filtre les clusters en fonction des critères spécifiés.
  • preferredDuringSchedulingIgnoredDuringExecution : cette stratégie étant préférable mais pas obligatoire lors de la planification, elle classe les clusters en fonction de critères spécifiés.

Vous pouvez définir à la fois des affinités requises et préférées. Les affinités requises empêchent le placement dans des clusters qui ne correspondent pas. Les affinités préférées fournissent l’ordre des clusters correspondants.

PickN avec affinités

L’utilisation des affinités avec une PickN politique de placement fonctionne comme pour l’utilisation des affinités avec la planification des pods dans un cluster Kubernetes unique.

L’exemple suivant montre comment déployer une ressource sur trois clusters. Seuls les clusters qui ont l’étiquette critical-allowed: "true" sont des cibles de sélection élective valides et la préférence est donnée aux clusters avec l’étiquette critical-level: 1 :

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-critical-preferences
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickn-critical-preferences
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"
PickN avec des contraintes de répartition topologique

Utilisez des contraintes de répartition de topologie pour forcer les placements entre les limites de topologie pour répondre aux exigences de disponibilité.

Vous pouvez configurer le comportement des contraintes de répartition de topologie à l’aide de la whenUnsatisfiable propriété :

  • DoNotSchedule : si la contrainte ne peut pas être satisfaite, rejetez la requête de placement.
  • ScheduleAnyway: si la contrainte ne peut pas être respectée, placez quand même les ressources.

L’exemple suivant montre comment répartir des ressources entre plusieurs régions Azure et tenter de planifier des clusters membres avec des jours de mise à jour différents à l’aide d’une étiquette updateDaypersonnalisée.

Lorsque la répartition entre les régions Azure ne peut pas être respectée, le placement échoue. Si la updateDay contrainte n’est pas remplie, le placement se produit toujours.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-locations-updates
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: fleet.azure.com/location
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickn-locations-updates
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: fleet.azure.com/location
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway

Pour plus d’informations, consultez la documentation KubeFleet sur les contraintes de répartition de topologie.

Sélectionner des clusters à l’aide d’étiquettes et de propriétés

Le placement intelligent des ressources de Fleet Manager fournit un ensemble de critères puissants que vous pouvez utiliser pour déterminer la manière de sélectionner des clusters lors de l’utilisation des types de placement PickN et PickAll. Dans cette section, vous allez apprendre à utiliser ces options pour créer des stratégies qui répondent à vos besoins.

Options des stratégies de placement

Le tableau suivant présente les champs de stratégie de planification disponibles pour chaque type de placement.

Champ Stratégie PickFixed PickAll PickN
placementType
affinity
clusterNames
numberOfClusters
topologySpreadConstraints

Étiquettes des clusters membres

Vous pouvez étiqueter la MemberCluster ressource sur le cluster hub comme n’importe quelle ressource Kubernetes.

En outre, Fleet Manager ajoute automatiquement les étiquettes en lecture seule suivantes à tous les clusters membres.

Étiquette Description
fleet.azure.com/location région Azure du cluster (westus)
fleet.azure.com/resource-group groupe de ressources Azure du cluster (rg_prodapps_01)
fleet.azure.com/subscription-id L'identificateur d'abonnement Azure dans lequel réside le cluster. Au format UUID/GUID.
fleet.azure.com/cluster-name Nom du cluster associé à la ressource de cluster du membre de la flotte.
fleet.azure.com/member-name Le nom du cluster membre de Fleet Manager correspondant au cluster.

Propriétés du cluster

Utilisez les propriétés suivantes dans le cadre des stratégies de placement.

Nom de la propriété Description
kubernetes-fleet.io/node-count Nœuds disponibles sur le cluster membre.
resources.kubernetes-fleet.io/total-cpu Nombre total d’unités de ressource de processeur du cluster.
resources.kubernetes-fleet.io/allocatable-cpu Unités de ressource de processeur allouables du cluster.
resources.kubernetes-fleet.io/available-cpu Unités de ressource de processeur disponibles du cluster.
resources.kubernetes-fleet.io/total-memory Nombre total d’unités de ressource de mémoire du cluster.
resources.kubernetes-fleet.io/allocatable-memory Unités de ressource de mémoire allouables du cluster.
resources.kubernetes-fleet.io/available-memory Unités de ressource de mémoire disponibles du cluster.
kubernetes.azure.com/per-cpu-core-cost Coût d’un cœur par processeur du cluster.
kubernetes.azure.com/per-gb-memory-cost Coût de la mémoire par Gio du cluster.
kubernetes.azure.com/vm-sizes/{vm-sku-name}/count Nombre disponible de nœuds existants de type vm-sku-name dans le cluster*.
Exemple de nom de référence SKU de machine virtuelle : NV16as_v4.
* En préversion via l’API v1beta1.
kubernetes.azure.com/vm-sizes/{vm-sku-name}/capacity Nombre de nouveaux nœuds potentiels de type vm-sku-name dans la région Azure du cluster*.
Exemple de nom de référence SKU de machine virtuelle : NV16as_v4.
* En préversion via l’API v1beta1.
  • Les unités de ressources Kubernetes représentent les propriétés processeur et mémoire. Pour plus d’informations, consultez Unités de ressources dans Kubernetes.

  • Les propriétés de coût sont des décimales qui représentent un coût par heure en dollars AMÉRICAINs pour le calcul Azure que les nœuds au sein du cluster utilisent. Le coût est basé sur les tarifs publics d’Azure.

Critères de correspondance de sélection

Lorsque vous utilisez des propriétés de cluster dans un critère de stratégie, spécifiez :

  • Nom : Nom de la propriété, qui est l’une des propriétés répertoriées dans les propriétés de cet article.

  • Opérateur : opérateur qui exprime la condition entre la contrainte ou la valeur 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.

  • Valeurs : une liste de valeurs, qui sont des valeurs possibles de la propriété.

Fleet évalue chaque cluster en fonction des propriétés que vous spécifiez dans la condition. Si un cluster ne répond pas aux conditions répertoriées ci-dessous requiredDuringSchedulingIgnoredDuringExecution, Fleet exclut le cluster du placement des ressources.

Note

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

Voici un exemple de stratégie de placement pour sélectionner seulement des clusters avec cinq nœuds ou plus.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickall-five-nodes
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes-fleet.io/node-count"
                      operator: Ge
                      values:
                      - "5"
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall-five-nodes
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes-fleet.io/node-count"
                      operator: Ge
                      values:
                      - "5"

Fonctionnement du classement des propriétés

Lorsque vous utilisez preferredDuringSchedulingIgnoredDuringExecution, un trieur de propriétés classe tous les clusters de la flotte en fonction de leurs valeurs dans un ordre croissant ou décroissant. Les pondérations utilisées pour l’ordre sont calculées en fonction de la valeur que vous spécifiez.

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

  • Nom : nom de la propriété du cluster.
  • Ordre de tri: l’ordre de tri peut être Ascending ou Descending. Lorsque vous utilisez l’ordre Ascending, les clusters membres présentant des valeurs observées plus faibles sont privilégiés. Lorsque vous utilisez l’ordre Descending, les clusters de membres avec une valeur observée plus élevée sont privilégiés.

Pour plus d’informations, consultez la documentation KubeFleet sur la planification basée sur les propriétés.

Configuration de la stratégie de déploiement

Le placement des ressources Fleet Manager utilise une stratégie par défaut RollingUpdate pour contrôler la façon dont les ressources sont distribuées aux clusters membres.

Dans l'exemple suivant, le placement est déployé séquentiellement sur chaque cluster membre, avec un délai d'attente d'au moins unavailablePeriodSeconds entre chaque cluster.

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pick-all-rolling
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1
  policy:
    placementType: PickAll
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall-rolling
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

L’état de déploiement est considéré comme réussi si toutes les ressources sont correctement appliquées au cluster. Cet état n’est pas un état de ressource enfant en cascade. Par conséquent, il ne vérifie pas que les pods créés sur un cluster membre par un déploiement sont prêts.

Pour plus d’informations, consultez la documentation sur les stratégies de déploiement.

Utilisation de tolérances

Vous pouvez appliquer des taints aux clusters membres, tout comme vous le faites aux nœuds d’un cluster.

Les placements de ressources prennent en charge l'utilisation de tolérances, chacune d'entre elles comprenant les champs suivants :

  • key : la clé de la tolérance.
  • value : la valeur de la tolérance.
  • effect : l’effet de la tolérance, par exemple NoSchedule.
  • operator : l’opérateur de la tolérance, tel que Exists ou Equal.

Chaque tolérance sert à tolérer un ou plusieurs marqueurs spécifiques appliqués à un MemberCluster. Une fois tous les marqueurs tolérés, Fleet Manager peut distribuer les ressources au cluster membre.

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: test-ns
spec:
  policy:
    placementType: PickAll
    tolerations:
      - key: app-team-a
        operator: Exists
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-ns
      version: v1
  revisionHistoryLimit: 10
  strategy:
    type: RollingUpdate
apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp-pickall-rolling
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickAll
    tolerations:
      - key: app-team-a
        operator: Exists
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

Pour plus d’informations, consultez la documentation sur les tolérances.

Utilisation des ressources d’enveloppe

Le cluster Hub Fleet Manager est également un cluster Kubernetes. Vous appliquez d’abord toute ressource que vous souhaitez distribuer au cluster hub. Cette approche peut conduire à :

  1. Effets secondaires indésirables : les contrôleurs ValidatingWebhookConfigurations, MutatingWebhookConfigurations ou Admission Controllers s'activent sur le cluster hub, ce qui peut entraîner l'interception et l'altération des opérations de ce dernier.

  2. Risques de sécurité : les ressources RBAC (Roles, ClusterRoles, RoleBindings, ClusterRoleBindings) destinées aux clusters membres peuvent accorder ou restreindre des autorisations sur le cluster central.

  3. Limitations des ressources : ResourceQuotas, FlowSchema ou LimitRanges définis pour les clusters membres prennent effet sur le cluster hub.

Pour éviter les effets secondaires inutiles, Fleet Manager fournit des ressources d’enveloppe personnalisées (ClusterResourceEnvelope et ResourceEnvelope) pour encapsuler les objets et éviter ces problèmes potentiels.

Vous appliquez la ressource d’enveloppe au cluster hub, mais les ressources qu’elle contient sont extraites et appliquées lorsqu’elles atteignent des clusters membres.

Pour plus d’informations, consultez la documentation sur les objets d’enveloppe.

Déterminer l’état du placement

Le placement des ressources dans Fleet Manager offre deux manières de visualiser l'état selon le niveau d’accès et les besoins de votre cluster hub.

  • ClusterResourcePlacement status : consultez l'état de placement directement sur la ressource associée à l'échelle du cluster. Utilisez quand vous disposez d’autorisations au niveau du cluster et que vous devez afficher l’état de tout placement dans la flotte.
  • ResourcePlacement status : Affichez l’état de placement directement sur la ressource à l’échelle de l’espace de noms ResourcePlacement. Utilisez cette option lorsque vous disposez d’autorisations au niveau de l’espace de noms et que vous devez afficher l’état d’un emplacement délimité à l’espace de noms dans la flotte.

Affichage de l’état du placement des ressources dans le cluster

Vous pouvez afficher ces informations à l’aide de la kubectl describe resourceplacement <rp-name> commande.

kubectl describe resourceplacement place-cmap-1
  • ClusterResourcePlacementStatus (préversion) : affichez l’état de placement via une ressource définie par un espace de noms ClusterResourcePlacementStatus. Utilisez cette ressource lorsque les utilisateurs délimités à l’espace de noms doivent afficher l’état de placement sans accorder d’autorisations au niveau du cluster. Pour plus d’informations, consultez la section ClusterResourcePlacementStatus.

Les deux approches fournissent les informations suivantes :

  • Conditions qui s’appliquent actuellement à la sélection élective, y compris si la sélection élective a été correctement effectuée.
  • Une section sur l’état de la sélection élective pour chaque cluster membre, qui indique l’état du déploiement sur ce cluster.

Utiliser l’état ClusterResourcePlacement

L’exemple suivant montre comment consulter l’état directement depuis un ClusterResourcePlacement qui a déployé l’espace de noms test et la ConfigMap test-1 dans deux clusters membres à l’aide de PickN. Le placement a été effectué avec succès, et les ressources ont été placées dans les clusters aks-member-1 et aks-member-2.

Vous pouvez afficher ces informations à l’aide de la kubectl describe clusterresourceplacement <crp-name> commande.

kubectl describe clusterresourceplacement crp-1
Name:         crp-1
Namespace:
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  ...
Spec:
  Policy:
    Number Of Clusters:  2
    Placement Type:      PickN
  Resource Selectors:
    Group:
    Kind:                  Namespace
    Name:                  test
    Version:               v1
  Revision History Limit:  10
Status:
  Conditions:
    Last Transition Time:  2023-11-10T08:14:52Z
    Message:               found all the clusters needed as specified by the scheduling policy
    Observed Generation:   5
    Reason:                SchedulingPolicyFulfilled
    Status:                True
    Type:                  ClusterResourcePlacementScheduled
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               All 2 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:   5
    Reason:                SynchronizeSucceeded
    Status:                True
    Type:                  ClusterResourcePlacementSynchronized
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               Successfully applied resources to 2 member clusters
    Observed Generation:   5
    Reason:                ApplySucceeded
    Status:                True
    Type:                  ClusterResourcePlacementApplied
  Placement Statuses:
    Cluster Name:  aks-member-1
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            aks-member-2
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:       Namespace
    Name:       test
    Version:    v1
    Kind:       ConfigMap
    Name:       test-1
    Namespace:  test
    Version:    v1
Events:
  Type    Reason                     Age                    From                                   Message
  ----    ------                     ----                   ----                                   -------
  Normal  PlacementScheduleSuccess   12m (x5 over 3d22h)    cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Resources have been applied to the selected clusters

Utiliser la ressource ClusterResourcePlacementStatus (préversion)

La ressource ClusterResourcePlacementStatus a une portée d’espace de noms et fournit l’état de placement de l’objet ClusterResourcePlacement correspondant, dont la portée est celle du cluster. Cette ressource permet aux utilisateurs d’espace de noms sans droits au niveau du cluster de lire l’état.

Important

La ressource ClusterResourcePlacementStatus et le champ StatusReportingScope sont disponibles dans la version placement.kubernetes-fleet.io/v1beta1 de l’API sous forme de pré-version. Ils ne sont pas disponibles dans l’API placement.kubernetes-fleet.io/v1 .

Pour utiliser cette approche, configurez ClusterResourcePlacement avec statusReportingScope: NamespaceAccessible à l’aide de l’API v1beta1.

Lorsque vous définissez statusReportingScope sur NamespaceAccessible, vous ne pouvez spécifier qu’un seul sélecteur de ressources d’espace de noms, et vous ne pouvez pas le modifier après sa création.

Configuration de ClusterResourcePlacementStatus

Pour utiliser cette fonctionnalité, spécifiez la version de l’API v1beta1 dans votre ClusterResourcePlacement:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-with-status-reporting
spec:
  statusReportingScope: NamespaceAccessible
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
  policy:
    placementType: PickAll

Affichage de ClusterResourcePlacementStatus

Vous pouvez afficher l’état à l’aide de la kubectl describe commande :

kubectl describe clusterresourceplacementstatuses.v1beta1.placement.kubernetes-fleet.io crp-with-status-reporting -n my-app

La sortie contient les mêmes informations d’état que celles ClusterResourcePlacement qui sont accessibles aux utilisateurs disposant uniquement d’autorisations au niveau de l’espace de noms.

Pour plus d’informations, consultez la documentation sur la façon de comprendre le résultat de placement.

Déclencheurs de modification du placement

Le planificateur Fleet Manager hiérarchise la stabilité des placements de ressources existants. Cette priorité limite le nombre de modifications qui suppriment et replanifient une ressource.

Les scénarios suivants peuvent déclencher des modifications de sélection élective :

  • Les modifications de stratégie de placement dans le placement des ressources (ClusterResourcePlacement ou ResourcePlacement) peuvent déclencher la suppression et la réécriture d’une ressource.
    • Les opérations de scale-out (augmentant numberOfClusters sans aucune autre modification) placent uniquement les charges de travail sur de nouveaux clusters et n’affectent pas les placements existants.
  • Modifications du cluster de membres, notamment :
    • Un nouveau cluster membre devenant éligible et respectant la stratégie de placement, par exemple, une stratégie PickAll.
    • Suppression d’un cluster membre de la flotte. Selon la stratégie, le planificateur tente de placer toutes les ressources affectées sur les clusters restants sans affecter les placements existants.

La mise à jour des ressources sélectionnées (par exemple, la modification d’un Deployment) ou la mise à jour de resourceSelector dans un placement de ressource amène Fleet Manager à déployer progressivement les placements existants, mais ne déclenche pas la replanification de la ressource (c’est-à-dire le changement des clusters sélectionnés).

Utilisation de ResourcePlacement et clusterResourcePlacement ensemble

Bien que ClusterResourcePlacement suppose que les espaces de noms représentent des limites d'application, les modèles d'utilisation dans le monde réel sont souvent plus complexes. Les organisations utilisent fréquemment des espaces de noms en tant que limites d’équipe plutôt que des limites d’application, ce qui entraîne plusieurs défis qui ResourcePlacement traitent directement :

Espaces de noms multi-applications : dans de nombreuses organisations, un espace de noms unique contient plusieurs applications indépendantes appartenant à la même équipe. Ces applications peuvent avoir :

  • Différentes exigences de cycle de vie (une application peut nécessiter des mises à jour fréquentes alors qu’une autre reste stable).
  • Différents besoins de placement de cluster (développement et applications de production).
  • Exigences de mise à l’échelle et de ressources indépendantes.
  • Exigences de conformité ou de gouvernance distinctes.

Décisions de planification individuelles : de nombreuses charges de travail, en particulier les travaux IA/ML, nécessitent des décisions de planification individuelles :

  • Travaux IA : les charges de travail Machine Learning se composent souvent de travaux à courte durée de vie et nécessitant beaucoup de ressources qui doivent être planifiés en fonction de la disponibilité des ressources de cluster, de la disponibilité gpu ou de la localité des données.
  • Charges de travail batch : différents travaux de traitement par lots dans le même espace de noms peuvent cibler différents types de cluster en fonction des exigences de calcul.

Contrôle complet de l’équipe d’application : ResourcePlacement fournit aux équipes d’application un contrôle direct sur leur positionnement des ressources sans nécessiter d’intervention de l’équipe de plateforme :

  • Opérations en libre-service : Teams peut gérer ses propres stratégies de distribution des ressources.
  • Cycles de déploiement indépendants : différentes applications au sein d’un espace de noms peuvent avoir des planifications de déploiement indépendantes.
  • Fonctionnalités de remplacement granulaires : Teams peut personnaliser les configurations de ressources par cluster sans affecter d’autres applications dans l’espace de noms.

Cette approche granulaire garantit qu’elle ResourcePlacement peut s’adapter à diverses structures organisationnelles et modèles de charge de travail tout en conservant la simplicité et la puissance de l’infrastructure de planification de la flotte.

Principales différences entre ResourcePlacement et ClusterResourcePlacement

Le tableau suivant met en évidence les principales différences entre ResourcePlacement et ClusterResourcePlacement:

Aspect ResourcePlacement (RP) ClusterResourcePlacement (CRP)
Étendue Ressources limitées à un espace de noms uniquement Ressources à l'échelle du cluster (en particulier les namespaces et leur contenu)
Ressource Objet API limité à un espace de noms Objet d’API délimitée par un cluster
Limite de sélection Limité aux ressources dans le même espace de noms que le RP Peut sélectionner n’importe quelle ressource délimitée au cluster
Cas d’usage classiques Travaux IA/ML, charges de travail individuelles, ConfigMaps/Secrets spécifiques qui nécessitent des décisions de placement indépendantes Ensembles d’applications, espaces de noms entiers, stratégies à l’échelle du cluster
Propriété de l’équipe Propriétaires et développeurs d’espaces de noms Opérateurs de plateforme

Les deux ResourcePlacement et ClusterResourcePlacement partagent les mêmes fonctionnalités principales pour tous les autres aspects non répertoriés dans le tableau des différences.

Exemple de scénario utilisant ResourcePlacement et ClusterResourcePlacement

ResourcePlacement fonctionne avec ClusterResourcePlacement (CRP) pour fournir une solution complète de gestion des ressources multicluster. Comprendre cette relation est cruciale pour une gestion efficace de la flotte.

Important

ResourcePlacement ne peut placer des ressources limitées à un espace de noms que sur des clusters dont l’espace de noms cible existe déjà. Utilisez ClusterResourcePlacement pour définir l’espace de noms.

Flux de travail classique :

  1. Administrateurs de plateforme : utilisez ClusterResourcePlacement pour déployer des espaces de noms sur l’ensemble de la flotte.
  2. Équipes d’application : utilisez ResourcePlacement pour gérer des ressources spécifiques au sein de ces espaces de noms définis.

Les exemples suivants montrent comment coordonner la CRP et la RP.

Administrateur de la plateforme : Créez l’espace de noms à l’aide de ClusterResourcePlacement:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: app-namespace-crp
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: my-app
      version: v1
      selectionScope: NamespaceOnly # only namespace itself is placed, no resources within the namespace
  policy:
    placementType: PickAll # If placement type is not PickAll, the application teams needs to know what are the clusters they can place their applications.

Équipe d’application : Gérer des ressources spécifiques dans l’espace de noms à l’aide de ResourcePlacement:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ResourcePlacement
metadata:
  name: app-configs-rp
  namespace: my-app
spec:
  resourceSelectors:
    - group: ""
      kind: ConfigMap
      version: v1
      labelSelector:
        matchLabels:
          app: my-application
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2

Meilleures pratiques pour ResourcePlacement et ClusterResourcePlacement

Lorsque vous utilisez ResourcePlacementClusterResourcePlacement, suivez les bonnes pratiques suivantes :

  • Établissez d’abord des espaces de noms : déployez toujours des espaces de noms via CRP avant de créer des ResourcePlacement objets.
  • Surveiller les dépendances : utilisez la surveillance de la flotte pour vous assurer que les CRPs de niveau espace de noms sont en bon état avant de déployer les RPs dépendants.
  • Coordonner les stratégies : alignez les stratégies de placement de CRP et de RP pour éviter les conflits. Par exemple, si CRP place l’espace de noms sur les clusters A, B et C, RP peut cibler n’importe quel sous-ensemble de ces clusters.
  • Limites de l’équipe : Utilisez CRP pour les ressources gérées par la plateforme (espaces de noms, RBAC) et rp pour les ressources gérées par l’application (configurations d’application, secrets).

Cette approche coordonnée garantit qu'ResourcePlacement offre la flexibilité dont les équipes ont besoin tout en maintenant l'infrastructure de base gérée par les opérateurs de plateforme.

Sélection, placement et déploiement des ressources

ResourcePlacement utilise les mêmes modèles de placement que ClusterResourcePlacement:

  • Stratégie de placement : PickAll, PickFixedet les PickN stratégies fonctionnent de manière identique pour les deux API.
  • Stratégie de déploiement : contrôlez la propagation des mises à jour entre les clusters avec les mêmes mécanismes de mise à jour propagée.
  • État et observabilité : surveillez la progression du déploiement à l’aide kubectl describe resourceplacement <name> -n <namespace>de .
  • Fonctionnalités avancées : utilisez des tolérances, des remplacements de ressources, des contraintes de répartition de topologie et des règles d’affinité.

La principale différence réside dans l’étendue de la sélection des ressources . Bien que ClusterResourcePlacement sélectionne généralement des espaces de noms entiers avec leur contenu, ResourcePlacement fournit un contrôle précis sur des ressources limitées à un espace de noms.

:::zone-end

Étapes suivantes