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. 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 Azure Kubernetes Fleet Manager (Fleet) permite abordar estos escenarios usando la característica de selección de ubicación de recursos de Kubernetes.

Información general

Fleet proporciona una funcionalidad de colocación de recursos que puede tomar decisiones de programación basadas en las siguientes propiedades de clúster:

  • Recuento 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

Lea la introducción conceptual de propagación de recursos para comprender los conceptos que se usan en estas instrucciones.

Requisitos previos

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

  • Debes tener un recurso Fleet con uno o varios clústeres miembro. Si no es así, siga el inicio rápido para crear un recurso de Fleet con un clúster de concentrador y combinar clústeres de Azure Kubernetes Service (AKS) como miembros.

    Recomendación: asegúrese de que los clústeres miembro de AKS están configurados para poder probar la colocación mediante las propiedades del clúster que le interesan (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 estas instrucciones. Para la instalación o la actualización, consulte Instalación de la CLI de Azure.

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

    az aks install-cli
    
  • También necesitarás la extensión de la CLI de Azure fleet, que se puede instalar 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 publicada:

    az extension update --name fleet
    
  • Autorice a kubectl para conectarse al clúster de concentrador de flotas:

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

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

Repita estos pasos para cada clúster miembro que agregue.

  • 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.

    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 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 nuestro clúster de concentrador para que se pueda colocar en clústeres miembros.

  • Cree un espacio de nombres para nuestra carga de trabajo en el clúster de concentrador.

    kubectl create namespace test-app 
    
  • 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.

    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
    

    Implemente la definición de carga de trabajo en el clúster de concentrador mediante el comando.

    kubectl apply -f sample-workload.yaml 
    

    Con la definición de carga de trabajo implementada, ahora es posible probar las funcionalidades de colocación inteligente de la flota.

Probar directivas de colocación de cargas de trabajo

Puede usar los ejemplos siguientes, junto con la documentación conceptual, como guías para escribir su propio ClusterResourcePlacement.

Nota:

Si desea probar cada directiva de ejemplo, asegúrese de eliminar el elemento ClusterResourcePlacement anterior.

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

En este ejemplo se muestra un clasificador de propiedades mediante el orden de Descending, lo que significa que la flota prefiere clústeres con mayores recuentos de nodos.

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

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:
                metricSorter:
                  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 recibiría un peso si tiene la etiqueta env=prod. Si satisface esa restricción de etiquetas, el clúster tiene un peso proporcional en función de la cantidad total de CPU 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 recibirá 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.

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
                metricSorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

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

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

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

Ver el estado de la colocación

Si desea ver el estado de una colocación, puede usar Azure Portal o el comando kubectl.

Puede encontrar detalles sobre cómo ver el progreso de una colocación en el inicio rápido de propagación de recursos.

Limpieza de recursos

Puede encontrar detalles sobre cómo quitar una colocación de recursos de clúster a través de Azure Portal o el comando kubectl en la sección de recursos de limpieza del inicio rápido de propagación de recursos.

Pasos siguientes

Para más información sobre la propagación de recursos, consulte los siguientes recursos: