En esta página, aprenderás a desplegar una aplicación de Windows Server sin estado en un clúster de Google Kubernetes Engine (GKE). También puedes consultar cómo desplegar una aplicación de Windows con reconocimiento del estado.
Antes de empezar
Antes de empezar, asegúrate de que has realizado las siguientes tareas:
- Habilita la API de Artifact Registry y la API de Google Kubernetes Engine. Habilitar APIs
- Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando
gcloud components update
.
Desplegar una aplicación de Windows Server en un clúster con nodos públicos
Para desplegar una aplicación de Windows Server en un clúster de GKE con solo nodos públicos, debes realizar las siguientes tareas:
- Crea un clúster con nodos públicos.
- Crea un archivo de manifiesto de Deployment.
- Crea y expón el Deployment.
- Comprueba que el pod se esté ejecutando.
Crear un clúster con nodos públicos
Si ya tienes un clúster de GKE que usa grupos de nodos de Windows Server, ve al siguiente paso. De lo contrario, crea un clúster mediante grupos de nodos de Windows Server.
Para aprovisionar nodos con direcciones IP externas (nodos públicos), usa la marca --no-enable-private-nodes
al crear el clúster.
Crear un archivo de manifiesto de Deployment
Los nodos de Windows Server están contaminados con el siguiente par clave-valor: node.kubernetes.io/os=windows:NoSchedule
.
Esta marca asegura que el programador de GKE no intente ejecutar contenedores de Linux en nodos de Windows Server. Para programar contenedores de Windows Server en nodos de Windows Server, tu archivo de manifiesto debe incluir este selector de nodos:
nodeSelector:
kubernetes.io/os: windows
Un webhook de admisión que se ejecuta en el clúster comprueba si hay cargas de trabajo nuevas que incluyan este selector de nodos de Windows y, si lo encuentra, aplica la siguiente tolerancia a la carga de trabajo, lo que le permite ejecutarse en los nodos de Windows Server contaminados:
tolerations:
- effect: NoSchedule
key: node.kubernetes.io/os
operator: Equal
value: windows
En algunos casos, es posible que tengas que incluir esta tolerancia explícitamente en tu archivo de manifiesto. Por ejemplo, si vas a implementar un DaemonSet con una imagen de contenedor multiarquitectura para que se ejecute en todos los nodos de Linux y Windows Server del clúster, tu archivo de manifiesto no incluirá el selector de nodos de Windows. Debes incluir explícitamente la tolerancia para el taint de Windows.
Archivo de manifiesto de ejemplo
En el siguiente ejemplo de archivo de implementación (iis.yaml
) se implementa la imagen de IIS de Microsoft
en un solo pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: iis
labels:
app: iis
spec:
replicas: 1
selector:
matchLabels:
app: iis
template:
metadata:
labels:
app: iis
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: iis-server
image: mcr.microsoft.com/windows/servercore/iis
ports:
- containerPort: 80
Este archivo es para un clúster en el que todas las cargas de trabajo usan el mismo tipo y versión de imagen de nodo de Windows Server. Para obtener información sobre cómo trabajar con imágenes de nodos mixtos, consulta la sección Usar imágenes de nodos mixtos.
Crear y exponer el Deployment
Crea y expón el archivo de Deployment que has creado en el paso anterior como un servicio de Kubernetes con un Deployment de balanceador de carga externo.
Para crear el recurso Deployment, ejecuta el siguiente comando:
kubectl apply -f iis.yaml
Para exponer el Deployment como un balanceador de carga externo, ejecuta el siguiente comando:
kubectl expose deployment iis \ --type=LoadBalancer \ --name=iis
Verificar que el pod se está ejecutando
Asegúrate de que el pod funciona validándolo.
Comprueba el estado del Pod con
kubectl
:kubectl get pods
Espera hasta que el resultado devuelto muestre que el pod tiene el estado
Running
:NAME READY STATUS RESTARTS AGE iis-5c997657fb-w95dl 1/1 Running 0 28s
Obtén el estado del servicio y espera hasta que se rellene el campo
EXTERNAL-IP
:kubectl get service iis
Deberías ver este resultado:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE iis LoadBalancer 10.44.2.112 external-ip 80:32233/TCP 17s
Ahora puedes usar tu navegador para abrir http://EXTERNAL_IP
para ver la página web de IIS.
Desplegar una aplicación de Windows Server en un clúster con nodos privados
En esta sección se explica cómo desplegar una aplicación de contenedor de Windows Server en un clúster de GKE que solo tenga nodos privados habilitados.
Las imágenes de contenedor de Windows Server tienen varias capas y Microsoft proporciona las capas base. Las capas base se almacenan como una capa externa en lugar de insertarse en la imagen como las capas de imagen de Docker de Linux. Cuando se extrae por primera vez una imagen de contenedor de Windows Server, las capas base normalmente se deben descargar de los servidores de Microsoft. Como los nodos privados no tienen conectividad a Internet, las capas del contenedor base de Windows Server no se pueden extraer directamente de los servidores de Microsoft.
Para usar clústeres con nodos privados habilitados, puedes configurar el daemon de Docker para permitir que se inserten capas no distribuibles en registros privados. Para obtener más información, consulta Allow push of non-distributable artifacts (Permitir el envío de artefactos no distribuibles) en la página de GitHub de Docker.
Para desplegar tu aplicación de Windows Server en un clúster con nodos privados habilitados, sigue estos pasos:
- Crea un clúster con nodos de Windows Server y habilita los nodos privados.
- Crea la imagen de Docker de la aplicación de Windows Server.
- Despliega la aplicación en un clúster con nodos privados habilitados.
- Comprueba que el pod se esté ejecutando.
Crear un clúster con nodos privados
Sigue las instrucciones que se indican en el artículo Crear un clúster con nodos de Windows Server. Para aprovisionar nodos que solo tengan direcciones IP internas (nodos privados), usa la marca --enable-private-nodes
al crear el clúster.
Crear la imagen de Docker de la aplicación Windows Server
Para compilar la imagen de Docker, inicia una instancia de Compute Engine con la versión de Windows Server en la que quieras ejecutar los contenedores de tu aplicación, como Windows Server 2019 o Windows Server versión 20H2. Además, asegúrate de que tienes conexión a Internet.
En la instancia de Compute Engine, ve a la configuración del daemon de Docker:
cat C:\ProgramData\docker\config\daemon.json
Configura el archivo
daemon.json
de Docker para permitir que se inserten capas externas en tu registro privado añadiendo estas líneas:{ "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"] }
En este ejemplo,
REGISTRY_REGION-docker.pkg.dev
hace referencia a Artifact Registry, donde se alojará la imagen.Reinicia el daemon de Docker:
Restart-Service docker
Compila y etiqueta la imagen Docker de tu aplicación:
cd C:\my-app
docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
Este comando indica a Docker que cree la imagen usando el Dockerfile del directorio actual y que la etiquete con un nombre, como
us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2
.Introduce la imagen Docker de la aplicación en el repositorio de Artifact Registry de tu proyecto. El conjunto de configuración
allow-nondistributable-artifacts
hace que las capas base de Windows se inserten en tu registro privado.docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
Crear un archivo de manifiesto de Deployment
A continuación, se muestra un ejemplo de archivo de manifiesto de implementación llamado my-app.yaml
. La imagen de este ejemplo es la que has subido en el paso anterior (REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
labels:
app: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: my-server
image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
Usa el comando
get-credentials
para habilitarkubectl
y que funcione con el clúster que has creado:gcloud container clusters get-credentials CLUSTER_NAME
Sustituye
CLUSTER_NAME
por el nombre del clúster que has creado.Despliega la aplicación especificada en el archivo
my-app.yaml
en tu clúster:kubectl apply -f my-app.yaml
Verificar que el pod se está ejecutando
Lista todos los pods para asegurarte de que la aplicación se está ejecutando correctamente:
kubectl get pods
Debería ver el pod con el estado Running
, como en el siguiente resultado:
NAME READY STATUS RESTARTS AGE
my-app-c95fc5596-c9zcb 1/1 Running 0 5m
Usar imágenes de nodo mixtas
Los clústeres pueden contener grupos de nodos con varios tipos y versiones de Windows Server. También pueden combinar cargas de trabajo de Windows Server y Linux. En las siguientes secciones se explica cómo configurar tus cargas de trabajo para que usen estos tipos de clústeres.
Usar cargas de trabajo con diferentes tipos de imágenes de nodo de Windows Server
Puedes añadir grupos de nodos a tu clúster con diferentes tipos de imágenes de Windows Server. En un clúster con tipos de Windows Server mixtos, debes asegurarte de que tus contenedores de Windows Server no se programen en un nodo de Windows Server incompatible.
Si tienes un grupo de nodos de Windows Server LTSC y otro de Windows Server SAC, añade la etiqueta de nodo gke-os-distribution
a ambas cargas de trabajo.
Incluya el siguiente nodeSelector en el archivo de manifiesto de sus cargas de trabajo de Windows Server LTSC:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
Incluye el siguiente nodeSelector en el archivo de manifiesto de tus cargas de trabajo de Windows Server SAC.
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_sac
Si añade esta etiqueta, se asegurará de que sus imágenes de contenedor LTSC no se programen en nodos SAC incompatibles y viceversa.
Usar cargas de trabajo con diferentes versiones del SO Windows Server LTSC
Los nodos de Windows Server admiten imágenes de SO LTSC2022 y LTSC2019. Puedes especificar la versión del SO Windows que quieres usar (LTSC2022) con el siguiente par clave-valor en nodeSelector: cloud.google.com/gke-windows-os-version=2022
.
Esta etiqueta de nodo asegura que el programador de GKE elija los nodos de Windows Server correctos para ejecutar cargas de trabajo de LTSC2022 o LTSC2019. Ambos nodos de Windows Server pertenecen al tipo de imagen windows_ltsc_containerd
. El valor de la etiqueta del nodo puede ser 2022
o 2019
. Si no se especifica la etiqueta del nodo, se pueden usar nodos LTSC2019 o LTSC2022 para programar contenedores. Para programar contenedores de Windows Server solo en nodos de Windows Server LTSC2022, tu archivo de manifiesto debe incluir este selector de nodos:
nodeSelector:
kubernetes.io/os: windows
cloud.google.com/gke-os-distribution: windows_ltsc
cloud.google.com/gke-windows-os-version: 2022
Usar cargas de trabajo con diferentes versiones de Windows Server
Si necesitas ejecutar grupos de nodos de Windows Server con varias versiones diferentes de LTSC o SAC, te recomendamos que crees tus imágenes de contenedor como imágenes de varios arcos que puedan ejecutarse en todas las versiones de Windows Server que se usen en tu clúster.
La etiqueta de nodo gke-os-distribution
no es suficiente para evitar que tus cargas de trabajo se programen en nodos incompatibles.
Usar cargas de trabajo de Linux y Windows Server en un clúster
Añade el siguiente selector de nodos a tus cargas de trabajo de Linux para asegurarte de que siempre se programen en nodos de Linux:
nodeSelector:
kubernetes.io/os: linux
De esta forma, se proporciona protección adicional para evitar que las cargas de trabajo de Linux se programen en nodos de Windows Server en caso de que se elimine accidentalmente el NoSchedule
taint de los nodos de Windows Server.