Uso de Nodos virtuales v2 en Azure Kubernetes Service (AKS) (versión preliminar)

Virtual Nodes v2 es una pila mejorada de Virtual Nodes que amplía AKS más allá de los nodos basados en máquinas virtuales mediante la ejecución de pods en recursos de proceso sin servidor en Azure Container Instances (ACI). Las cargas de trabajo se transfieren a ACI en segundos sin tener que esperar a que se aprovisionen nuevos nodos, y solo pagas por la capacidad de proceso que utilizas mientras los pods están en ejecución. Los nodos virtuales v2 se entregan como una extensión de clúster de AKS.

Importante

Las características en versión preliminar de AKS están disponibles en régimen de autoservicio y mediante adhesión voluntaria. 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 AKS cuentan con soporte parcial por parte del servicio 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. Para más información, consulte los siguientes artículos de soporte:

Soportado

  • Iniciar contenedores
  • Hospedaje de alias
  • Ganchos del ciclo de vida de los contenedores (postStart y preStop)
  • kubectl exec con argumentos
  • Volúmenes persistentes y PVC (solo Azure Files)
  • Emparejamiento de VNet
  • Salida controlada por NSG
  • NAT Gateway para salida
  • Contenedores confidenciales
  • Hasta 200 pods por nodo virtual

Limitations

No se admiten las siguientes características:

  • Contenedores de Windows
  • DaemonSets
  • Redirección de puertos
  • IPv6
  • Rangos de IP autorizados del servidor de API
  • Superposición de Azure CNI
  • Cilium o NPM como directiva de red
  • Red virtual propia (BYO)
  • Varias instancias de extensión por clúster
  • Grupos en espera

Disponibilidad de recursos y límites de cuota

Virtual Nodes v2 está disponible en todas las regiones de la nube pública de Azure en las que Azure Container Instances admite SKU de VNet. Para obtener más información, consulte Disponibilidad de recursos y límites de cuota para ACI.

Prerequisites

  • Azure CNI en modo node-subnet
  • Calico o ninguna como directiva de red
  • Identidad de carga de trabajo habilitada
  • Al menos un grupo de nodos con un tamaño de máquina virtual de 4 o más vCPUs y 16 o más GiB de memoria. Cada nodo virtual reserva aproximadamente 3 vCPUs y 12 GiB de memoria en un nodo de AKS de tu clúster, así que asegúrate de que tus nodos dispongan de recursos suficientes.
  • k8s-extension versión 1.8 o superior
  • kubectl 1.30 o posterior

Registra el proveedor de recursos ACI:

az provider register --namespace Microsoft.ContainerInstance

Note

Ejecuta el siguiente comando si se produce un error en cualquier fase del proceso de habilitación de la extensión.

az provider register --namespace Microsoft.KubernetesConfig

Habilitar nodos virtuales v2

Instale la extensión:

az k8s-extension create \
    --name <extension-name> \
    --extension-type Microsoft.virtualnodes \
    --cluster-name <cluster-name> \
    --resource-group <resource-group> \
    --cluster-type managedClusters \
    --configuration-settings replicaCount=1   # specifies number of virtual nodes - optional

Configurar los valores de la extensión

Las operaciones de creación y actualización admiten los siguientes parámetros de configuración.

Ajuste de configuración Description
replicaCount Número de nodos virtuales.
admissionControllerReplicaCount Número de pods del controlador de admisión.
podAnnotations Anotaciones añadidas a los pods de infraestructura como un mapa clave-valor.
nodeSelector Etiquetas que seleccionan los nodos de AKS que hospedan los pods de infraestructura y del controlador de admisión.
tolerations Tolerancias aplicadas a los pods de infraestructura y del controlador de admisión.
affinity Configuraciones de afinidad adicionales fusionadas con las reglas de afinidad requeridas de AKS.
zones Zonas de disponibilidad delimitadas por punto y coma donde se implementan los pods.
nodeLabels Etiquetas añadidas a los nodos virtuales como pares key=value separados por comas.

Las etiquetas kubernetes.io permitidas son:

  • beta.kubernetes.io/arch
  • beta.kubernetes.io/instance-type
  • beta.kubernetes.io/os
  • failure-domain.beta.kubernetes.io/region
  • failure-domain.beta.kubernetes.io/zone
  • kubernetes.io/arch
  • kubernetes.io/hostname
  • kubernetes.io/os
  • node.kubernetes.io/instance-type
  • topology.kubernetes.io/region
  • topology.kubernetes.io/zone

Comprueba la extensión:

az k8s-extension show \
    --name <extension-name> \
    --cluster-type managedClusters \
    --cluster-name <cluster-name> \
    --resource-group <resource-group>

Confirma que provisioningState es Succeeded. Puede permanecer en Pending durante unos minutos.

Comprueba que los pods de la extensión se estén ejecutando en el espacio de nombres vn-system:

kubectl get pods --namespace vn-system

Actualización de una extensión

az k8s-extension update --name <extension-name> --cluster-name <aks-cluster-name> --resource-group <aks-resource-group> --cluster-type managedClusters

Note

El parámetro --auto-upgrade-mode admite none, patch o compatible. Para fijar una versión específica de la extensión utilizando --version, configura --auto-upgrade-mode en none.

Acceso a Azure Container Registry

Para descargar imágenes de un Azure Container Registry (ACR) privado, utiliza la identidad administrada de la extensión o un secreto de descarga de imágenes de Kubernetes.

Utilizar la identidad administrada de la extensión

Conceda el AcrPull rol a la identidad administrada generada para la extensión. Este rol concede a todos los pods que se ejecutan en los nodos virtuales de la extensión acceso para extraer imágenes del registro sin configuración adicional del pod. Debe tener permiso para crear asignaciones de roles en el Registro.

Obtenga el ID de entidad de la identidad administrada de la extensión:

$extensionPrincipalId = az k8s-extension show --name <extension-name> --cluster-name <aks-cluster-name> --resource-group <aks-resource-group> --cluster-type managedClusters --query aksAssignedIdentity.principalId --output tsv

Obtenga el identificador de recurso del registro de contenedor:

$acrId = az acr show --name <acr-name> --resource-group <acr-resource-group> --query id --output tsv

Asigne el AcrPull rol a la identidad administrada de extensión en el ámbito del Registro:

az role assignment create --assignee-object-id $extensionPrincipalId --assignee-principal-type ServicePrincipal --role AcrPull --scope $acrId

Espere varios minutos para que la asignación de roles se propague antes de implementar cargas de trabajo que extraen imágenes del registro.

Uso de un secreto de extracción de imágenes

Para obtener instrucciones, consulte Secreto de extracción de Kubernetes para la autenticación de ACR.

Implementar una carga de trabajo en Virtual Nodes v2

Programe pods en nodos virtuales utilizando el selector de nodos virtualization: virtualnode2 y la tolerancia virtual-kubelet.io/provider:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: hello
          image: mcr.microsoft.com/azuredocs/aci-helloworld
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: "1"
              memory: 1Gi
      nodeSelector:
        virtualization: virtualnode2
        kubernetes.io/os: linux
      tolerations:
        - key: virtual-kubelet.io/provider
          operator: Exists
          effect: NoSchedule

Guarde el manifiesto como demo.yaml y, a continuación, aplíquelo.

kubectl apply -f demo.yaml

Comprueba que los pods se estén ejecutando.

kubectl get pods -l app=demo -o wide

Desactivar Virtual Nodes v2

Warning

Cuando desactivas la extensión de nodos virtuales, el clúster de AKS se desconecta de los grupos de contenedores de Azure Container Instances subyacentes. Para evitar que queden instancias huérfanas que sigan ejecutándose y generen costes, elimina cualquier carga de trabajo que se esté ejecutando en el nodo virtual antes de desactivar la extensión.

Elimina la extensión y limpia los recursos de los nodos virtuales.

az k8s-extension delete \
    --name <extension-name> \
    --cluster-name <cluster-name> \
    --resource-group <resource-group> \
    --cluster-type managedClusters
kubectl delete node <virtual-node-name>

Pasos siguientes