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.
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
Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Inicio rápido para Bash en Azure Cloud Shell.
Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure. Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un contenedor de Docker.
Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.
En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.
Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.
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 usacontainerd
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.
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.