Compartir vía


Ubicación inteligente de recursos de Kubernetes entre clústeres mediante Azure Kubernetes Fleet Manager (versión preliminar)

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

Información general

Kubernetes Fleet proporciona funcionalidad de selección de ubicación de recursos que puede tomar decisiones de programación basadas en las siguientes propiedades:

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

Importante

Las características en vista previa de Azure Kubernetes Fleet Manager están disponibles en autoservicio y de manera opcional. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y la garantía limitada. Las versiones preliminares de Azure Kubernetes Fleet Manager reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción.

Requisitos previos

Filtrado de clústeres en el momento de la programación en función de las propiedades del clúster miembro

El tipo de afinidad requiredDuringSchedulingIgnoredDuringExecution permite filtrar los clústeres miembros elegibles para su colocación mediante selectores de propiedades. Un selector de propiedades es una matriz de condiciones de expresión en las propiedades del clúster.

En cada condición que especifique:

  • Nombre: nombre de la propiedad, que debe tener el formato siguiente:

    resources.kubernetes-fleet.io/<CAPACITY-TYPE>-<RESOURCE-NAME>
    

    <CAPACITY-TYPE> es uno de total, allocatableo available, en función de la capacidad (información de uso) con la que desea comprobar y <RESOURCE-NAME> es el nombre del recurso (CPU/memoria).

    Por ejemplo, si desea seleccionar clústeres en función de la capacidad de CPU disponible de un clúster, el nombre usado en el selector de propiedades debe ser resources.kubernetes-fleet.io/available-cpu. Para la capacidad de memoria asignable, puede usar resources.kubernetes-fleet.io/allocatable-memory.

  • Lista de valores, que son valores posibles de la propiedad.

  • Operador que se usa para expresar la condición entre la restricción o el valor deseado y el valor observado en el clúster. Actualmente se admiten los operadores siguientes:

    • Gt (mayor que): el valor observado de un clúster de la propiedad especificada debe ser mayor que el valor de la condición antes de que se pueda seleccionar para la colocación de recursos.
    • Ge (mayor o igual que): el valor observado de un clúster de la propiedad dada debe ser mayor o igual que el valor de la condición antes de que se pueda seleccionar para la colocación de recursos.
    • Lt (menor que): el valor observado de un clúster de la propiedad especificada debe ser menor que el valor de la condición antes de que se pueda seleccionar para la colocación de recursos.
    • Le (menor o igual que): el valor observado de un clúster de la propiedad especificada debe ser menor o igual que el valor de la condición antes de que se pueda seleccionar para la selección de ubicación de recursos.
    • Eq (igual a): el valor observado de un clúster de la propiedad especificada debe ser igual al valor de la condición antes de que se pueda seleccionar para la colocación de recursos.
    • Ne (no es igual a): el valor observado de un clúster de la propiedad especificada no debe ser igual al valor de la condición antes de que se pueda seleccionar para la selección de ubicación de recursos.

    Si usa el operador Gt, Ge, Lt, Le, Eq o Ne, la lista de valores de la condición debe tener exactamente un valor.

Fleet evalúa cada clúster en función de las propiedades especificadas en la condición. Si no se cumplen las condiciones enumeradas en requiredDuringSchedulingIgnoredDuringExecution se excluye este clúster miembro de la selección de ubicación de los recursos.

Nota:

Si un clúster miembro no posee la propiedad expresada en la condición, se producirá un error automáticamente en la condición.

Directiva de selección de ubicación de ejemplo para seleccionar solo clústeres con más o igual que cinco nodos para la selección de ubicación de recursos:

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"

Puede utilizar tanto los selectores de etiquetas como los de propiedades bajo el término de afinidad requiredDuringSchedulingIgnoredDuringExecution para filtrar los clústeres de miembros elegibles en función de estas dos restricciones.

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"

En este ejemplo, Kubernetes Fleet solo tiene en cuenta un clúster para la selección de ubicación de recursos si tiene la etiqueta region=east y un recuento de nodos mayor o igual que cinco.

Clasificación de clústeres de orden en el momento de la programación en función de las propiedades del clúster miembro

Cuando se usa preferredDuringSchedulingIgnoredDuringExecution, un clasificador de propiedades clasifica todos los clústeres de la flota en función de sus valores en el orden ascendente o descendente. Los pesos se calculan en función del valor de peso especificado en preferredDuringSchedulingIgnoredDuringExecution.

Un clasificador de propiedades consta de:

  • Nombre: nombre de la propiedad con más información sobre el formato de la propiedad que se trata en la sección anterior.
  • Criterio de ordenación: el criterio de ordenación puede ser Ascending o Descending. Cuando se utiliza el orden Ascending, Kubernetes Fleet prefiere los clústeres miembros con valores observados más bajos. Cuando se usa el orden Descending, se prefieren los clústeres de miembros con un valor observado mayor.

Para el criterio de ordenación Descending, el peso proporcional se calcula con la fórmula :

((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight

Por ejemplo, supongamos que quiere clasificar los clústeres en función de la propiedad de la capacidad de CPU disponible en orden descendente y que tiene una flota de tres clústeres con la siguiente CPU disponible:

Clúster Capacidad de CPU disponible
bravelion 100
smartfish 20
jumpingcat 10

En este caso, el clasificador calcula los pesos siguientes:

Clúster Capacidad de CPU disponible Peso
bravelion 100 (100 - 10) / (100 - 10) = 100 % del peso
smartfish 20 (20 - 10) / (100 - 10) = 11,11 % del peso
jumpingcat 10 (10 - 10) / (100 - 10) = 0 % del peso

Para el criterio de ordenación Ascending, el peso proporcional se calcula con la fórmula:

(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight

Por ejemplo, supongamos que quiere clasificar los clústeres en función de su costo por CPU y núcleo en orden ascendente y que tiene una flota de tres clústeres con los siguientes costos principales de CPU:

Clúster Costo de núcleo por CPU
bravelion 1
smartfish 0,2
jumpingcat 0,1

En este caso, el clasificador calcula los pesos siguientes:

Clúster Costo de núcleo por CPU Peso
bravelion 1 1 - ((1 - 0,1) / (1 - 0,1)) = 0 % del peso
smartfish 0,2 1 - ((0,2 - 0,1) / (1 - 0,1)) = 88,89 % del peso
jumpingcat 0,1 1 - (0,1 - 0,1) / (1 - 0,1) = 100 % del peso

En el ejemplo siguiente se muestra un clasificador de propiedades mediante el orden 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

En este ejemplo, Fleet preferirá los 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.

Puede utilizar tanto el selector de etiquetas como el clasificador de propiedades bajo 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/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

En este ejemplo, un clúster solo recibiría un peso adicional si tiene la etiqueta env=prod. Si satisface esa restricción basada en etiquetas, el clúster tiene un peso proporcional en función de la cantidad total de CPU en ese clúster miembro.

Limpieza de recursos

Si ya no desea usar los objetos ClusterResourcePlacement creados en este artículo, puede eliminarlos mediante el comando kubectl delete. Por ejemplo:

kubectl delete clusterresourceplacement <name-of-the-crp-resource>

Pasos siguientes

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