Creación de un contenedor de Windows Server en un clúster de Azure Kubernetes Service (AKS) mediante la CLI de Azure

Azure Kubernetes Service (AKS) es un servicio de Kubernetes administrado que le permite implementar y administrar clústeres rápidamente. En este artículo, implementará un clúster de AKS que ejecuta contenedores de Windows Server 2019 mediante la CLI de Azure. También implementará una aplicación de ejemplo de ASP.NET en un contenedor de Windows Server en el clúster.

Captura de pantalla en la que se muestra cómo navegar hasta la aplicación de ejemplo de ASP.NET.

En este artículo se presupone un conocimiento básico de los conceptos de Kubernetes. Para más información, consulte Conceptos básicos de Kubernetes de Azure Kubernetes Service (AKS).

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Prerrequisitos

  • En este artículo se necesita la versión 2.0.64 de la CLI de Azure, o cualquier versión posterior. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.

  • La identidad que usa para crear el clúster tiene los permisos mínimos adecuados. Para más información sobre el acceso y la identidad en AKS, consulte Opciones de acceso e identidad en Azure Kubernetes Service (AKS).

  • Si tiene varias suscripciones de Azure, seleccione el id. de suscripción adecuado en el que se deben facturar los recursos con el comando az account.

  • Compruebe que los proveedores Microsoft.OperationsManagement y Microsoft.OperationalInsights están registrados en la suscripción. Estos son proveedores de recursos de Azure necesarios para admitir Container Insights. Ejecute los siguientes comandos para comprobar el estado del registro:

    az provider show -n Microsoft.OperationsManagement -o table
    az provider show -n Microsoft.OperationalInsights -o table
    

    Si no lo están, registre Microsoft. OperationsManagement y Microsoft. OperationalInsights mediante los comandos siguientes:

    az provider register --namespace Microsoft.OperationsManagement
    az provider register --namespace Microsoft.OperationalInsights
    

    Nota

    Si planea ejecutar los comandos de este inicio rápido localmente en lugar de en Azure Cloud Shell, hágalo con privilegios administrativos.

Limitaciones

Se aplican las siguientes limitaciones cuando crea y administra clústeres de AKS que admiten varios grupos de nodos:

  • No puede eliminar el primer grupo de nodos.

Se aplican las siguientes limitaciones adicionales a los grupos de nodos de Windows Server:

  • El clúster de AKS puede tener un máximo de 10 grupos de nodos.
  • El clúster de AKS puede tener un máximo de 100 nodos en cada grupo de nodos.
  • El nombre del grupo de nodos de Windows Server tiene un límite de 6 caracteres.

Crear un grupo de recursos

Un grupo de recursos de Azure es un grupo lógico en el que se implementan y administran recursos de Azure. Cuando se crea un grupo de recursos, se le pide que especifique una ubicación. Dicha ubicación es donde se almacenan los metadatos del grupo de recursos, así como el lugar en el que los recursos se ejecutan en Azure si no se especifica otra región al crear los recursos. Cree un grupo de recursos con el comando az group create.

En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación eastus.

Nota

En este artículo se utiliza sintaxis de Bash para los comandos del tutorial. Si usa Azure Cloud Shell, asegúrese de que la lista desplegable de la parte superior izquierda de la ventana de Cloud Shell está establecida en Bash.

az group create --name myResourceGroup --location eastus

En la siguiente salida de ejemplo se muestra que los recursos se crearon correctamente:

{
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
  "location": "eastus",
  "managedBy": null,
  "name": "myResourceGroup",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": null
}

Creación de un clúster de AKS

Para ejecutar un clúster de AKS que admita grupos de nodos para contenedores de Windows Server, el clúster debe utilizar una directiva de red que use el complemento de red (avanzado) de Azure CNI. Para más información que le ayude a planear los intervalos de subred necesarios y las consideraciones de red, vea Configuración de redes de Azure CNI. Use el comando az aks create para crear un clúster de AKS denominado myAKSCluster. Este comando creará los recursos de red necesarios en caso de que no existan.

  • El clúster se configura con dos nodos.
  • Los parámetros --windows-admin-password y --windows-admin-username establecen las credenciales de administrador para los nodos de Windows Server del clúster y deben satisfacer los requisitos de contraseña de Windows Server. Si no especifica el parámetro --windows-admin-password, se le pedirá que proporcione un valor.
  • El grupo de nodos usa VirtualMachineScaleSets.

Nota

Para asegurarse de que el clúster funcione de forma confiable, debe ejecutar al menos 2 (dos) nodos del grupo de nodos predeterminado.

Cree un nombre de usuario para usarlo como credenciales de administrador para los nodos de Windows Server en el clúster. Los comandos siguientes le solicitan un nombre de usuario y lo establecen en WINDOWS_USERNAME para su uso en un comando posterior (recuerde que los comandos de este artículo se especifican en un shell de BASH).

echo "Please enter the username to use as administrator credentials for Windows Server nodes on your cluster: " && read WINDOWS_USERNAME

Cree el clúster y asegúrese de especificar el parámetro --windows-admin-username. El siguiente comando de ejemplo crea un clúster con el valor de WINDOWS_USERNAME establecido en el comando anterior. También, puede proporcionar un nombre de usuario diferente directamente en el parámetro, en lugar de usar WINDOWS_USERNAME. El siguiente comando también le pedirá que cree una contraseña para las credenciales de administrador de los nodos de Windows Server en el clúster. Como alternativa, puede usar el parámetro --windows-admin-password y especificar aquí su propio valor.

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 2 \
    --enable-addons monitoring \
    --generate-ssh-keys \
    --windows-admin-username $WINDOWS_USERNAME \
    --vm-set-type VirtualMachineScaleSets \
    --network-plugin azure

Nota

Si recibe un error de validación de contraseña, compruebe que el parámetro establecido cumple los requisitos de contraseña de Windows Server. Si la contraseña cumple los requisitos, pruebe a crear el grupo de recursos en otra región. A continuación, intente crear el clúster con el nuevo grupo de recursos.

Si no especifica un nombre de usuario y una contraseña de administrador al establecer --vm-set-type VirtualMachineScaleSets y --network-plugin azure, el nombre de usuario se establece en azureuser y la contraseña se establece en un valor aleatorio.

No se puede cambiar el nombre de usuario del administrador, pero puede cambiar la contraseña de administrador que el clúster de AKS usa para los nodos de Windows Server mediante az aks update. Para más información, consulte Preguntas frecuentes sobre los grupos de nodos de Windows Server.

Transcurridos unos minutos, el comando se completa y devuelve información en formato JSON sobre el clúster. En ocasiones, el clúster puede tardar más de unos minutos en aprovisionarse. Espere hasta 10 minutos en estos casos.

Incorporación de un grupo de nodos de Windows

De forma predeterminada, se crea un clúster de AKS con un grupo de nodos que puede ejecutar contenedores de Linux. Utilice el comando az aks nodepool add para agregar un grupo de nodos adicional que pueda ejecutar contenedores de Windows Server en combinación con el grupo de nodos de Linux.

AKS admite grupos de nodos de Windows Server 2019 y Windows Server 2022. En el caso de las versiones de Kubernetes "1.25.0" y posteriores, Windows Server 2022 es el sistema operativo predeterminado. En versiones anteriores, el sistema operativo predeterminado será Windows Server 2019.

Use el comando az aks nodepool add para agregar un grupo de nodos de Windows:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --name npwin \
    --node-count 1

El comando anterior crea un nuevo grupo de nodos denominado npwin y lo agrega a myAKSCluster. El comando anterior también usa la subred predeterminada en la red virtual predeterminada que se crea al ejecutar az aks create. La SKU del sistema operativo no se especificó, por lo que el grupo de nodos se establecerá en el sistema operativo predeterminado en función de la versión de Kubernetes del clúster.

Adición de un grupo de nodos de Windows Server 2019

Al crear un grupo de nodos de Windows, el sistema operativo predeterminado será Windows Server 2019 para aquellas versiones de Kubernetes inferiores a la "1.25.0". Para usar nodos de Windows Server 2019, cuando no esté predeterminado, deberá especificar un tipo de SKU de sistema operativo Windows2019.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --os-sku Windows2019 \ 
    --name npwin \
    --node-count 1

El comando anterior crea un grupo de nodos de Windows Server 2019 denominado npwin y lo agrega a myAKSCluster. El comando anterior también usa la subred predeterminada en la red virtual predeterminada que se crea al ejecutar az aks create.

Adición de un grupo de nodos de Windows Server 2022

Al crear un grupo de nodos de Windows, el sistema operativo predeterminado será Windows Server 2022 para las versiones de Kubernetes "1.25.0" y posteriores. Para usar nodos de Windows Server 2022, cuando no esté predeterminado, deberá especificar un tipo de SKU de sistema operativo Windows2022.

Nota

Windows Server 2022 requiere la versión de Kubernetes "1.23.0" o posterior.

Use el comando az aks nodepool add para agregar un grupo de nodos de Windows Server 2022:

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --os-sku Windows2022 \ 
    --name npwin \
    --node-count 1

Opcional: Uso de containerd con grupos de nodos de Windows Server

A partir de la versión 1.20 de Kubernetes y versiones posteriores, puede especificar containerd como el entorno de ejecución del contenedor para los grupos de nodos de Windows Server 2019. Desde Kubernetes 1.23, containerd será el entorno de ejecución de contenedor predeterminado para Windows.

Importante

Cuando se utiliza containerd con grupos de nodos de Windows Server 2019:

  • Tanto el plano de control como los grupos de nodos de Windows Server 2019 deben usar la versión 1.20 o posterior de Kubernetes.
  • Al crear o actualizar un grupo de nodos para ejecutar contenedores de Windows Server, el valor predeterminado de --node-vm-size es Standard_D2s_v3, que era el tamaño mínimo recomendado para los grupos de nodos de Windows Server 2019 en las versiones anteriores a Kubernetes 1.20. El tamaño mínimo recomendado para grupos de nodos de Windows Server 2019 cuando se usa containerd es Standard_D4s_v3. Si establece el parámetro --node-vm-size, compruebe la lista de tamaños de máquina virtual restringidos.
  • Se recomienda encarecidamente usar valores taints o etiquetas con los grupos de nodos de Windows Server 2019 en ejecución containerd y tolerations o selectores de nodos con las implementaciones, para garantizar que las cargas de trabajo se programan correctamente.

Incorporación de un grupo de nodos de Windows Server con containerd

Use el comando az aks nodepool add para agregar un grupo de nodos que pueda ejecutar contenedores de Windows Server con el entorno de ejecución containerd.

Nota

Si no especifica el encabezado personalizado WindowsContainerRuntime=containerd, el grupo de nodos seguirá usando containerd como entorno de ejecución de contenedor de manera predeterminada.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --os-type Windows \
    --name npwcd \
    --node-vm-size Standard_D4s_v3 \
    --kubernetes-version 1.20.5 \
    --aks-custom-headers WindowsContainerRuntime=containerd \
    --node-count 1

El comando anterior crea un nuevo grupo de nodos de Windows Server que usa containerd como entorno de ejecución, llamado npwcd, y lo agrega a myAKSCluster. El comando anterior también usa la subred predeterminada en la red virtual predeterminada que se crea al ejecutar az aks create.

Actualización de un grupo de nodos de Windows Server existente a containerd

Use el comando az aks nodepool upgrade para actualizar un grupo de nodos específico de Docker a containerd.

az aks nodepool upgrade \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name npwd \
    --kubernetes-version 1.20.7 \
    --aks-custom-headers WindowsContainerRuntime=containerd

El comando anterior actualiza un grupo de nodos denominado npwd al entorno de ejecución containerd.

Para actualizar todos los grupos de nodos existentes de un clúster para usar el entorno de ejecución containerd para todos los grupos de nodos de Windows Server:

az aks upgrade \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --kubernetes-version 1.20.7 \
    --aks-custom-headers WindowsContainerRuntime=containerd

El comando anterior actualiza todos los grupos de nodos de Windows Server en myAKSCluster para usar el entorno de ejecución containerd.

Nota

Al ejecutar el comando de actualización, el --kubernetes-version especificado debe ser una versión superior a la versión actual del grupo de nodos.

Conectarse al clúster

Para administrar un clúster de Kubernetes, usará kubectl, el cliente de línea de comandos de Kubernetes. Si usa Azure Cloud Shell, kubectl ya está instalado. Para instalar kubectl localmente, use el comando az aks install-cli:

az aks install-cli

Para configurar kubectl para conectarse a su clúster de Kubernetes, use el comando az aks get-credentials. Con este comando se descargan las credenciales y se configura la CLI de Kubernetes para usarlas.

az aks get-credentials --resource-group myResourceGroup --name myAKSCluster

Para comprobar la conexión al clúster, use el comando kubectl get para devolver una lista de los nodos del clúster.

kubectl get nodes -o wide

La siguiente salida de ejemplo muestra todos los nodos del clúster. Asegúrese de que el estado de todos los nodos sea Listo:

NAME                                STATUS   ROLES   AGE    VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION     CONTAINER-RUNTIME
aks-nodepool1-12345678-vmss000000   Ready    agent   34m    v1.20.7   10.240.0.4    <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aks-nodepool1-12345678-vmss000001   Ready    agent   34m    v1.20.7   10.240.0.35   <none>        Ubuntu 18.04.5 LTS               5.4.0-1046-azure   containerd://1.4.4+azure
aksnpwcd123456                      Ready    agent   9m6s   v1.20.7   10.240.0.97   <none>        Windows Server 2019 Datacenter   10.0.17763.1879    containerd://1.4.4+unknown
aksnpwin987654                      Ready    agent   25m    v1.20.7   10.240.0.66   <none>        Windows Server 2019 Datacenter   10.0.17763.1879    docker://19.3.14

Nota

El entorno de ejecución de contenedor para cada grupo de nodos se muestra en CONTAINER-RUNTIME. Observe que aksnpwin987654 comienza por docker://, lo que significa que usa Docker para el entorno de ejecución de contenedor. Observe que aksnpwcd123456 comienza por containerd://, lo que significa que usa containerd para el entorno de ejecución de contenedor.

Implementación de la aplicación

Un archivo de manifiesto de Kubernetes define un estado deseado del clúster, por ejemplo, qué imágenes de contenedor se van a ejecutar. En este artículo, se utiliza un manifiesto para crear todos los objetos necesarios para ejecutar la aplicación de ejemplo de ASP.NET en un contenedor de Windows Server. Este manifiesto incluye una implementación de Kubernetes para la aplicación de ejemplo de ASP.NET y un servicio de Kubernetes externo para acceder a la aplicación desde Internet.

La aplicación de ejemplo de ASP.NET se proporciona como parte de los ejemplos de .NET Framework y se ejecuta en un contenedor de Windows Server. AKS requiere contenedores de Windows Server que se basen en las imágenes de Windows Server 2019 u otra versión posterior. El archivo de manifiesto de Kubernetes también debe definir un selector de nodos que le indique al clúster de AKS que ejecute el pod de la aplicación de ejemplo de ASP.NET en un nodo que pueda ejecutar contenedores de Windows Server.

Cree un archivo denominado sample.yaml y cópielo en la siguiente definición de código YAML. Si usa Azure Cloud Shell, este archivo se puede crear mediante code, vi o nano como si trabajara en un sistema físico o virtual:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample
  labels:
    app: sample
spec:
  replicas: 1
  template:
    metadata:
      name: sample
      labels:
        app: sample
    spec:
      nodeSelector:
        "kubernetes.io/os": windows
      containers:
      - name: sample
        image: mcr.microsoft.com/dotnet/framework/samples:aspnetapp
        resources:
          limits:
            cpu: 1
            memory: 800M
        ports:
          - containerPort: 80
  selector:
    matchLabels:
      app: sample
---
apiVersion: v1
kind: Service
metadata:
  name: sample
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: sample

Para obtener un desglose de los archivos de manifiesto de YAML, consulte Implementaciones y manifiestos de YAML.

Implemente la aplicación mediante el comando kubectl apply y especifique el nombre del manifiesto de YAML:

kubectl apply -f sample.yaml

En la salida de ejemplo siguiente se muestran las implementaciones y los servicios creados correctamente:

deployment.apps/sample created
service/sample created

Prueba de la aplicación

Cuando se ejecuta la aplicación, un servicio de Kubernetes expone el front-end de la aplicación a Internet. Este proceso puede tardar unos minutos en completarse. En ocasiones, el servicio puede tardar más de unos minutos en aprovisionarse. Espere hasta 10 minutos en estos casos.

Para supervisar el progreso, utilice el comando kubectl get service con el argumento --watch.

kubectl get service sample --watch

En un primer momento, el parámetro EXTERNAL-IP del servicio de ejemplo se muestra como pendiente.

NAME               TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
sample             LoadBalancer   10.0.37.27   <pending>     80:30572/TCP   6s

Cuando la dirección EXTERNAL-IP cambie de pendiente a una dirección IP pública real, use CTRL-C para detener el proceso de inspección de kubectl. En la salida del ejemplo siguiente se muestra una dirección IP pública válida asignada al servicio:

sample  LoadBalancer   10.0.37.27   52.179.23.131   80:30572/TCP   2m

Para ver la aplicación de ejemplo en acción, abra un explorador web en la dirección IP externa del servicio.

Captura de pantalla en la que se muestra cómo navegar hasta la aplicación de ejemplo de ASP.NET.

Nota

Si se agota el tiempo de espera de conexión al intentar cargar la página, debe comprobar que la aplicación de ejemplo esté lista con el siguiente comando [kubectl get pods --watch]. A veces, el contenedor Windows no se habrá iniciado en el momento en que la dirección IP externa esté disponible.

Eliminación de clúster

Para evitar cargos de Azure, si no tiene previsto seguir los tutoriales siguientes, use el comando az group delete para quitar el grupo de recursos, el servicio de contenedor y todos los recursos relacionados.

az group delete --name myResourceGroup --yes --no-wait

Nota

El clúster de AKS se ha creado con una identidad administrada asignada por el sistema (la opción de identidad predeterminada usada en este inicio rápido), la identidad se administra por la plataforma y no es necesaria su eliminación.

Pasos siguientes

En este artículo, ha implementado un clúster de Kubernetes y una aplicación de ejemplo de ASP.NET en un contenedor de Windows Server de este.

Para obtener más información sobre AKS y un ejemplo completo desde el código hasta la implementación, continúe con el tutorial del clúster de Kubernetes.