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 puede abordar estos escenarios mediante el uso de la característica inteligente de selección de ubicación de recursos de Kubernetes en Azure Kubernetes Fleet Manager (Kubernetes Fleet).
La funcionalidad de colocación de recursos de Kubernetes Fleet 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
Para obtener más información sobre los conceptos de este artículo, consulte Ubicación de recursos de Kubernetes desde el clúster de concentrador a los clústeres miembros.
Requisitos previos
Necesita una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Debe tener un recurso de Kubernetes Fleet con uno o varios clústeres miembro. Si no tiene uno, siga el inicio rápido para crear un recurso de Kubernetes Fleet con un clúster de concentrador. Posteriormente, realice la unión de los clústeres de Azure Kubernetes Service (AKS) como miembros.
Sugerencia
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 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 a kubectl para conectarse al clúster de concentrador de Kubernetes Fleet:
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:
Cree un espacio de nombres para la 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:
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 Kubernetes Fleet.
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 objeto ClusterResourcePlacement
.
Nota:
Si desea probar cada directiva de ejemplo, asegúrese de eliminar el objeto ClusterResourcePlacement
anterior.
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 Kubernetes Fleet 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.
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 recibe un peso si tiene la etiqueta env=prod
. Si el clúster satisface esa restricción de etiquetas, 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 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.
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
, Kubernetes Fleet 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 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.
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 una 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 ubicación en la información para Usar la API de ClusterResourcePlacement para propagar recursos a los clústeres de miembros.
Limpieza de recursos
Para obtener detalles sobre cómo quitar una colocación de recursos de clúster a través de Azure Portal o el comando kubectl consulte la sección de recursos de limpieza del artículo de propagación de recursos.
Contenido relacionado
- Para obtener más información sobre la propagación de recursos, consulte la documentación de Kubernetes Fleet de código abierto.
Azure Kubernetes Service