Aprovisionamiento automático de nodos (versión preliminar)
Al implementar cargas de trabajo en AKS, debe tomar una decisión sobre la configuración del grupo de nodos con respecto al tamaño de máquina virtual necesario. A medida que sus cargas de trabajo se vuelven más complejas y requieren diferentes CPU, memoria y capacidades para ejecutarse, la sobrecarga de tener que diseñar la configuración de su VM para numerosas solicitudes de recursos se vuelve difícil.
El aprovisionamiento automático de nodos (NAP) (versión preliminar) decide, en función de las necesidades de recursos de los pods pendientes, la configuración óptima de las máquinas virtuales para ejecutar esas cargas de trabajo de la forma más eficiente y rentable.
NAP se basa en el proyecto Karpenter de código abierto, y el proveedor AKS también es de código abierto. NAP implementa, configura y administra automáticamente Karpenter en sus clústeres AKS.
Importante
El aprovisionamiento automático de nodos (NAP) para AKS está actualmente en versión preliminar. Consulte Términos de uso complementarios para las versiones preliminares de Microsoft Azure para conocer los términos legales que se aplican a las características de Azure que se encuentran en la versión beta, en versión preliminar o que todavía no se han publicado para que estén disponibles con carácter general.
Antes de empezar
- Necesita una suscripción de Azure. Si no tiene una suscripción a Azure, puede crear una cuenta gratuita.
- Necesita tener instalada la CLI de Azure.
- Instale la extensión CLI de Azure
aks-preview
. Versión mínima 0.5.170. - Registrar la marca NodeAutoProvisioningPreviewfeature.
Instalación de la extensión aks-preview
de la CLI
Instale la extensión
aks-preview
de la CLI mediante el comandoaz extension add
.az extension add --name aks-preview
Actualice la extensión para asegurarse de que tiene instalada la última versión mediante el comando
az extension update
.az extension update --name aks-preview
Registro de la marca de característica NodeAutoProvisioningPreview
Registre la marca de características de
NodeAutoProvisioningPreview
mediante el comandoaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
Tarda unos minutos en que el estado muestre Registrado.
Comprobar el estado del registro mediante el comando
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeAutoProvisioningPreview"
Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando
az provider register
.az provider register --namespace Microsoft.ContainerService
Limitaciones
- La única configuración de red permitida es Superposición de Azure CNI con tecnología de Cilium.
- No se puede habilitar en un clúster en el que los grupos de nodos tengan habilitado el escalador automático de clústeres
Características no admitidas
- Grupos de nodos de Windows
- Aplicación de la configuración personalizada al nodo kubelet
- Clústeres IPv6
- Entidad de servicio
Nota:
Puede usar una identidad administrada asignada por el sistema o por el usuario.
- Conjuntos de cifrado de disco
- CustomCATrustCertificates
- Modo de arranque o parada
- Proxy HTTP
- Mutación OutboundType. Se admiten todos los OutboundTypes, pero no se pueden cambiar después de la creación.
Habilitar el aprovisionamiento automático de nodos
Habilitación del aprovisionamiento automático de nodos en un nuevo clúster
Habilite el aprovisionamiento automático de nodos en un nuevo clúster mediante el
az aks create
comando y establezca--node-provisioning-mode
enAuto
. También debe establecer--network-plugin
enazure
,--network-plugin-mode
enoverlay
y--network-dataplane
encilium
.az aks create \ --name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-provisioning-mode Auto \ --network-plugin azure \ --network-plugin-mode overlay \ --network-dataplane cilium \ --generate-ssh-keys
Habilitación del aprovisionamiento automático de nodos en un clúster existente
Habilitación del aprovisionamiento automático de nodos en un clúster existente mediante el
az aks update
comando y establezca--node-provisioning-mode
enAuto
. También debe establecer--network-plugin
enazure
,--network-plugin-mode
enoverlay
y--network-dataplane
encilium
.az aks update --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP_NAME --node-provisioning-mode Auto --network-plugin azure --network-plugin-mode overlay --network-dataplane cilium
Grupos de nodos
El aprovisionamiento automático de nodos utiliza una lista de SKU de máquinas virtuales como punto de partida para decidir cuál es la más adecuada para las cargas de trabajo que se encuentran en estado pendiente. Tener control sobre qué SKU desea en el grupo inicial le permite especificar familias de SKU específicas, o tipos de máquina virtual y la cantidad máxima de recursos que usa un aprovisionamiento.
Si tiene SKU de máquina virtual específicas que son instancias reservadas, por ejemplo, puede que solo desee usar esas máquinas virtuales como grupo de inicio.
Puede tener varias definiciones de grupo de nodos en un clúster, pero AKS implementa una definición de grupo de nodos predeterminada que puede modificar:
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
name: default
spec:
disruption:
consolidationPolicy: WhenUnderutilized
expireAfter: Never
template:
spec:
nodeClassRef:
name: default
# Requirements that constrain the parameters of provisioned nodes.
# These requirements are combined with pod.spec.affinity.nodeAffinity rules.
# Operators { In, NotIn, Exists, DoesNotExist, Gt, and Lt } are supported.
# https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#operators
requirements:
- key: kubernetes.io/arch
operator: In
values:
- amd64
- key: kubernetes.io/os
operator: In
values:
- linux
- key: karpenter.sh/capacity-type
operator: In
values:
- on-demand
- key: karpenter.azure.com/sku-family
operator: In
values:
- D
Requisitos de los proveedores de nodos compatibles
Selectores de SKU con etiquetas conocidas
Selector | Descripción | Ejemplo |
---|---|---|
karpenter.azure.com/sku-family | Familia de SKU de máquina virtual | D, F, L etc. |
karpenter.azure.com/sku-name | Nombre de SKU explícito | Standard_A1_v2 |
karpenter.azure.com/sku-version | Versión SKU (sin "v", puede utilizar 1) | 1 , 2 |
karpenter.sh/capacity-type | Tipo de asignación de máquina virtual (de acceso puntual o a petición) | de acceso puntual o a petición |
karpenter.azure.com/sku-cpu | Número de CPU en la máquina virtual | 16 |
karpenter.azure.com/sku-memory | Memoria en la máquina virtual en MiB | 131072 |
karpenter.azure.com/sku-gpu-name | Nombre de la GPU | A100 |
karpenter.azure.com/sku-gpu-manufacturer | Fabricante de la GPU | nvidia |
karpenter.azure.com/sku-gpu-count | Recuento de GPU por máquina virtual | 2 |
karpenter.azure.com/sku-networking-accelerated | Si la máquina virtual ha acelerado las redes | [true, false] |
karpenter.azure.com/sku-storage-premium-capable | Si la máquina virtual admite almacenamiento de E/S Premium | [true, false] |
karpenter.azure.com/sku-storage-ephemeralos-maxsize | Límite de tamaño para el disco efímero del SO en Gb | 92 |
topology.kubernetes.io/zone | Las zonas de disponibilidad | [uksouth-1,uksouth-2,uksouth-3] |
kubernetes.io/os | Sistema operativo (solo Linux durante la versión preliminar) | Linux |
kubernetes.io/arch | Arquitectura de CPU (AMD64 o ARM64) | [amd64, arm64] |
Para enumerar las capacidades y los valores permitidos de VM SKU, utilice el comando vm list-skus
de la CLI de Azure.
az vm list-skus --resource-type virtualMachines --location <location> --query '[].name' --output table
Límites del grupo de nodos
De forma predeterminada, NAP intenta programar las cargas de trabajo dentro de la cuota de Azure que tiene disponible. También puede especificar el límite superior de recursos que usa un grupo de nodos, especificando límites dentro de la especificación del grupo de nodos.
# Resource limits constrain the total size of the cluster.
# Limits prevent Karpenter from creating new instances once the limit is exceeded.
limits:
cpu: "1000"
memory: 1000Gi
Pesos del grupo de nodos
Cuando haya definido varios grupos de nodos, es posible establecer una preferencia de dónde se debe programar una carga de trabajo. Defina el peso relativo en las definiciones del grupo de nodos.
# Priority given to the node pool when the scheduler considers which to select. Higher weights indicate higher priority when comparing node pools.
# Specifying no weight is equivalent to specifying a weight of 0.
weight: 10
Kubernetes y actualizaciones de imágenes de nodos
AKS con NAP administra las actualizaciones de la versión de Kubernetes y las actualizaciones del disco del SO de la máquina virtual por usted de forma predeterminada.
Actualizaciones de Kubernetes
Las actualizaciones de Kubernetes para los grupos de nodos del NAP siguen la versión de Kubernetes del plano de control. Si realiza una actualización del clúster, sus nodos NAP se actualizan automáticamente para seguir el mismo versionado.
Actualizaciones de imágenes de nodo
De forma predeterminada, las máquinas virtuales del grupo de nodos NAP se actualizan automáticamente cuando hay una nueva imagen disponible. Si desea fijar un grupo de nodos a una determinada versión de imagen de nodo, puede establecer la imageVersion en la clase de nodo:
kubectl edit aksnodeclass default
En la definición de la clase de nodo, establezca imageVersion en una de las versiones publicadas que figuran en las notas de la versión de AKS. También puede ver la disponibilidad de las imágenes en las regiones consultando el rastreador de versiones de AKS
El imageVersion es la parte de la fecha en la imagen del nodo como sólo Ubuntu 22.04 es compatible, por ejemplo, "AKSUbuntu-2204-202311.07.0" sería "202311.07.0"
apiVersion: karpenter.azure.com/v1alpha2
kind: AKSNodeClass
metadata:
annotations:
kubernetes.io/description: General purpose AKSNodeClass for running Ubuntu2204
nodes
meta.helm.sh/release-name: aks-managed-karpenter-overlay
meta.helm.sh/release-namespace: kube-system
creationTimestamp: "2023-11-16T23:59:06Z"
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
helm.toolkit.fluxcd.io/name: karpenter-overlay-main-adapter-helmrelease
helm.toolkit.fluxcd.io/namespace: 6556abcb92c4ce0001202e78
name: default
resourceVersion: "1792"
uid: 929a5b07-558f-4649-b78b-eb25e9b97076
spec:
imageFamily: Ubuntu2204
imageVersion: 202311.07.0
osDiskSizeGB: 128
Si se elimina la especificación imageVersion, el conjunto de nodos se actualizará con la última versión de imagen de nodo.
Interrupción del nodo
Cuando las cargas de trabajo de los nodos se reducen verticalmente, NAP usa reglas de interrupción en la especificación del grupo de nodos para decidir cuándo y cómo quitar esos nodos y volver a programar las cargas de trabajo para que sean más eficaces.
Puede quitar un nodo manualmente mediante kubectl delete node
, pero NAP también puede controlar cuándo debe optimizar los nodos.
disruption:
# Describes which types of Nodes NAP should consider for consolidation
consolidationPolicy: WhenUnderutilized | WhenEmpty
# 'WhenUnderutilized', NAP will consider all nodes for consolidation and attempt to remove or replace Nodes when it discovers that the Node is underutilized and could be changed to reduce cost
# `WhenEmpty`, NAP will only consider nodes for consolidation that contain no workload pods
# The amount of time NAP should wait after discovering a consolidation decision
# This value can currently only be set when the consolidationPolicy is 'WhenEmpty'
# You can choose to disable consolidation entirely by setting the string value 'Never'
consolidateAfter: 30s
Supervisión de eventos de selección
El aprovisionamiento automático de nodos produce eventos de clúster que pueden utilizarse para supervisar las decisiones de implementación y programación que se están tomando. Puede ver los eventos a través del flujo de eventos de Kubernetes.
kubectl get events -A --field-selector source=karpenter -w
Azure Kubernetes Service