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

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 PowerShell. También implementará una aplicación de ejemplo de ASP.NET en un contenedor de Windows Server en el clúster.

En esta captura de pantalla, 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).

Prerrequisitos

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

Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador. Puede usar Bash o PowerShell con Cloud Shell para trabajar con los servicios de Azure. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.

Para iniciar Azure Cloud Shell:

Opción Ejemplo o vínculo
Seleccione Pruébelo en la esquina superior derecha de un bloque de código o de comandos. Solo con seleccionar Pruébelo no se copia automáticamente el código o comando en Cloud Shell. Captura de pantalla que muestra un ejemplo de la opción Pruébelo para Azure Cloud Shell.
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador. Captura de pantalla que muestra cómo iniciar Cloud Shell en una nueva ventana.
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal. Captura de pantalla que muestra el botón de Cloud Shell en Azure Portal

Para usar Azure Cloud Shell:

  1. Inicie Cloud Shell.

  2. Seleccione el botón Copiar en un bloque de código (o bloque de comandos) para copiar el código o comando.

  3. Pegue el código o comando en la sesión de Cloud Shell. Para ello, seleccione Ctrl+Mayús+V en Windows y Linux, o bien seleccione Cmd+Mayús+V en macOS.

  4. Seleccione Enter para ejecutar el código o comando.

Si tiene varias suscripciones a Azure, elija la suscripción adecuada en la que se debe facturar el recurso. Seleccione un identificador de suscripción específico con el cmdlet Set-AzContext.

Set-AzContext -SubscriptionId 00000000-0000-0000-0000-000000000000

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 cmdlet New-AzResourceGroup.

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 PowerShell 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 PowerShell.

New-AzResourceGroup -Name myResourceGroup -Location eastus

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

ResourceGroupName : myResourceGroup
Location          : eastus
ProvisioningState : Succeeded
Tags              :
ResourceId        : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup

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 cmdlet New-AzAksCluster siguiente para crear un clúster de AKS denominado myAKSCluster. En el ejemplo siguiente se crean los recursos de red necesarios en caso de que no existan.

Nota

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

$AdminCreds = Get-Credential -Message 'Please create the administrator credentials for your Windows Server containers'
New-AzAksCluster -ResourceGroupName myResourceGroup -Name myAKSCluster -NodeCount 2 -NetworkPlugin azure -NodeVmSetType VirtualMachineScaleSets -WindowsProfileAdminUserName $AdminCreds.UserName -WindowsProfileAdminUserPassword $AdminCreds.Password -GenerateSshKey

Nota

Si no puede crear el clúster de AKS porque la versión no se admite en esta región, puede usar el comando Get-AzAksVersion -Location eastus para encontrar la lista de versiones admitidas en esta región.

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.

Adición de un grupo de nodos de Windows Server

De forma predeterminada, se crea un clúster de AKS con un grupo de nodos que puede ejecutar contenedores de Linux. Utilice el cmdlet New-AzAksNodePool para agregar un grupo de nodos que pueda ejecutar contenedores de Windows Server en combinación con el grupo de nodos de Linux.

New-AzAksNodePool -ResourceGroupName myResourceGroup -ClusterName myAKSCluster -VmSetType VirtualMachineScaleSets -OsType Windows -Name npwin

El comando anterior crea un nuevo grupo de nodos denominado npwin y lo agrega a myAKSCluster. Al crear un grupo de nodos para ejecutar contenedores de Windows Server, el valor predeterminado para -VmSize es Standard_D2s_v3. Si decide establecer el parámetro -VmSize, compruebe la lista de tamaños de máquina virtual restringidos. El tamaño mínimo recomendado es Standard_D2s_v3. El comando anterior también usa la subred predeterminada en la red virtual predeterminada que se crea al ejecutar New-AzAksCluster.

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 cmdlet Install-AzAksKubectl:

Install-AzAksKubectl

Para configurar kubectl para conectarse al clúster de Kubernetes, use el cmdlet Import-AzAksCredential. Con este comando se descargan las credenciales y se configura la CLI de Kubernetes para usarlas.

Import-AzAksCredential -ResourceGroupName 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

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
aks-nodepool1-12345678-vmssfedcba   Ready    agent   13m    v1.16.7
aksnpwin987654                      Ready    agent   108s   v1.16.7

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 cmdlet Remove-AzResourceGroup para quitar el grupo de recursos, el servicio de contenedor y todos los recursos relacionados.

Remove-AzResourceGroup -Name myResourceGroup

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.