Compartir a través de


Colocación inteligente de recursos de Kubernetes entre clústeres mediante Azure Kubernetes Fleet Manager

A menudo, los desarrolladores de aplicaciones necesitan implementar recursos de Kubernetes en varios clústeres ubicados en entornos locales y en la nube. Los operadores de flota suelen necesitar elegir los mejores clústeres para colocar las cargas de trabajo en función de la heurística (como el costo de proceso en los clústeres) o los recursos disponibles (como la memoria y la CPU). Es tedioso crear, actualizar y realizar un seguimiento de estos recursos de Kubernetes en varios clústeres manualmente. En este artículo se explica cómo abordar estos escenarios mediante la funcionalidad inteligente de colocación de recursos de Kubernetes en Azure Kubernetes Fleet Manager.

Fleet Manager admite la selección de ubicación inteligente para los recursos con ámbito de clúster (ClusterResourcePlacement) y con ámbito de espacio de nombres (ResourcePlacement). La funcionalidad de selección de ubicación de recursos puede tomar decisiones de programación basadas en las siguientes propiedades del clúster:

  • Número de nodos
  • Costo del proceso/memoria en clústeres de miembros de destino
  • Disponibilidad de recursos (CPU/memoria) en clústeres de miembros de destino

Para obtener más información sobre los conceptos de este artículo, consulte la colocación de recursos con ámbito de clúster y la colocación de recursos con ámbito de espacio de nombres.

Requisitos previos

  • Necesita una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.

  • Debe tener un Administrador de flotas (Fleet Manager) con un clúster de concentrador y uno o más clústeres miembro. Si no tiene uno, siga el inicio rápido para crear un Gestor de Flotas con un clúster hub. A continuación, una los clústeres de Kubernetes compatibles como miembros.

    Sugerencia

    Asegúrese de que los clústeres de Kubernetes están configurados para que pueda probar la selección de ubicación mediante las propiedades del clúster que le interesen (ubicación, recuento de nodos, recursos o costo).

  • Establezca estas variables de entorno:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • Necesita la versión 2.58.0 de la CLI de Azure o una versión posterior instalada para completar este artículo. Para la instalación o la actualización, consulte Instalación de la CLI de Azure.

  • Si aún no la tiene instalada, puede instalar la CLI de Kubernetes (kubectl) mediante este comando:

    az aks install-cli
    
  • Necesita la extensión de la CLI de Azure fleet. Puede instalarlo ejecutando el siguiente comando:

    az extension add --name fleet
    

    Ejecute el comando az extension update para actualizar a la versión más reciente de la extensión:

    az extension update --name fleet
    
  • Autorice kubectl para conectarse al clúster del centro de Fleet Manager:

    az fleet get-credentials --resource-group $GROUP --name $FLEET
    

Inspección de las propiedades del clúster de miembros

Recupere las etiquetas, las propiedades y los recursos del clúster miembro consultando el clúster de concentrador. Genere la salida como YAML, para que pueda leer los resultados.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

El archivo YAML resultante contiene detalles (etiquetas y propiedades) que puede usar para crear directivas de colocación. Este es un ejemplo:

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

Repita este paso para cada clúster miembro que agregue, para identificar las etiquetas y propiedades que puede usar en la directiva.

Preparación de una carga de trabajo para la colocación

A continuación, publique una carga de trabajo en el clúster de concentrador para que se pueda colocar en clústeres miembros:

  1. Cree un espacio de nombres para la carga de trabajo en el clúster de concentrador:

    kubectl create namespace test-app 
    
  2. La carga de trabajo de ejemplo se puede implementar en el nuevo espacio de nombres del clúster de concentrador. Dado que estos tipos de recursos de Kubernetes no requieren encapsulación, se pueden implementar sin cambios.

    1. Guarde el siguiente YAML en un archivo denominado 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. Implemente la definición de carga de trabajo en el clúster de concentrador:

      kubectl apply -f sample-workload.yaml
      

Con la definición de carga de trabajo implementada, ahora es posible probar la funcionalidad de selección de ubicación inteligente de Fleet Manager.

Probar directivas de colocación de cargas de trabajo

Puede usar los ejemplos siguientes como guías para escribir sus propios objetos de colocación de recursos. Para obtener más información, consulte la documentación de colocación de recursos con ámbito de clúster y la documentación de colocación de recursos con ámbito de espacio de nombres.

En cada ejemplo se muestran tanto las variantes de ClusterResourcePlacement (para recursos con ámbito de clúster y espacios de nombres completos) como las de ResourcePlacement (para recursos con ámbito específico de espacio de nombres).

Nota:

Para probar cada directiva de ejemplo, elimine el anterior ClusterResourcePlacement o ResourcePlacement antes de aplicar el siguiente.

Colocación basada en el número de nodos del clúster

En este ejemplo se muestra un clasificador de propiedades que usa el orden Descending. Este orden significa que Fleet Manager prefiere clústeres con mayores recuentos de nodos.

El clúster con el número de nodos más alto recibe un peso de 20 y el clúster con el valor más bajo recibe un peso de 0. Otros clústeres reciben pesos proporcionales calculados mediante la fórmula de cálculo de peso.

Ejemplo de ClusterResourcePlacement

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

Ejemplo 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

Colocación con selector de etiquetas y clasificador de propiedades

En este ejemplo, un clúster solo recibe un peso si tiene la etiqueta env=prod. Si el clúster cumple esa restricción de etiqueta, Fleet Manager le proporciona un peso proporcional en función de la cantidad de CPU total en ese clúster miembro.

En este ejemplo se muestra cómo puede usar el selector de etiquetas y el clasificador de propiedades para la afinidad preferredDuringSchedulingIgnoredDuringExecution. Un clúster miembro que produce un error en el selector de etiquetas no recibe ningún peso. Los clústeres miembro que satisfacen el selector de etiquetas reciben pesos proporcionales según se especifica en el clasificador de propiedades.

Ejemplo de ClusterResourcePlacement

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

Ejemplo 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

Colocación basada en costo de memoria y núcleo de CPU

Dado que el clasificador de este ejemplo tiene un Ascending orden, Fleet Manager prefiere los clústeres con costos más bajos de memoria y de núcleos de CPU. El clúster con el menor costo de memoria y núcleo de CPU recibe un peso de 20 y el clúster con el valor más alto recibe un peso de 0. Otros clústeres reciben pesos proporcionales calculados mediante la fórmula de cálculo de peso.

Ejemplo de ClusterResourcePlacement

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

Ejemplo 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

Ver el estado de una colocación

Puede ver el estado de una ubicación mediante Azure Portal o el comando kubectl.

Para obtener más información sobre cómo ver el progreso de la colocación:

Limpieza de recursos

Para quitar una ubicación de recursos:

Pasos siguientes