Déployer une application Windows Server


Dans cette page, vous allez apprendre à déployer une application Windows Server sans état sur un cluster Google Kubernetes Engine (GKE), qui peut être public ouprivé. Vous pouvez également apprendre à déployer une application Windows avec état.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Artifact Registry et l'API Google Kubernetes Engine.
  • Activer les API
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.

Déployer une application Windows Server sur un cluster

Pour déployer une application Windows Server sur un cluster public GKE, vous devez effectuer les tâches suivantes :

  1. Créer un cluster.
  2. Créer un fichier manifeste de déploiement.
  3. Créer et exposer le déploiement.
  4. Vérifier que le pod est en cours d'exécution.

Créer un cluster

Si vous disposez déjà d'un cluster GKE qui utilise des pools de nœuds Windows Server, passez à l'étape suivante. Dans le cas contraire, créez un cluster à l'aide de pools de nœuds Windows Server.

Créer un fichier manifeste de déploiement

Les nœuds Windows Server sont rejetés par la paire clé-valeur suivante : node.kubernetes.io/os=windows:NoSchedule.

Ce rejet garantit que le programmeur GKE ne tente pas d'exécuter des conteneurs Linux sur des nœuds Windows Server. Pour programmer des conteneurs Windows Server sur des nœuds Windows Server, votre fichier manifeste doit inclure ce sélecteur de nœud :

nodeSelector:
 kubernetes.io/os: windows

Un webhook d'admission s'exécutant dans le cluster vérifie la présence de ce sélecteur de nœuds Windows dans les nouvelles charges de travail et applique la tolérance suivante à la charge de travail, afin qu'elle puisse s'exécuter sur les nœuds Windows Server rejetés :

tolerations:
- effect: NoSchedule
  key: node.kubernetes.io/os
  operator: Equal
  value: windows

Dans certains cas, vous devrez peut-être inclure explicitement cette tolérance dans votre fichier manifeste. Par exemple, si vous déployez un DaemonSet avec une image de conteneur multi-arch à exécuter sur tous les nœuds Linux et Windows Server du cluster, votre fichier manifeste n'inclut pas le sélecteur de nœuds Windows. Vous devez inclure explicitement la tolérance pour le rejet Windows.

Exemple de fichier manifeste

L'exemple de fichier de déploiement suivant (iis.yaml) déploie l'image IIS de Microsoft sur un seul 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

Ce fichier est destiné à un cluster où toutes les charges de travail utilisent le même type et la même version d'image de nœud Windows Server. Pour en savoir plus sur l'utilisation des images de nœuds mixtes, consultez la section Utiliser des images de nœuds mixtes.

Créer et exposer le déploiement

Créez et exposez le fichier de déploiement que vous avez créé à l'étape précédente en tant que service Kubernetes avec un déploiement d'équilibreur de charge externe.

  1. Pour créer la ressource de déploiement, exécutez la commande suivante :

    kubectl apply -f iis.yaml
    
  2. Pour exposer le déploiement en tant qu'équilibreur de charge externe, exécutez la commande suivante :

    kubectl expose deployment iis \
        --type=LoadBalancer \
        --name=iis
    

Vérifier que le pod est en cours d'exécution.

Assurez-vous que le pod fonctionne correctement en le validant.

  1. Vérifiez l'état du pod avec kubectl :

    kubectl get pods
    
  2. Attendez que le résultat renvoyé indique que l'état du pod est Running :

    NAME                   READY     STATUS    RESTARTS   AGE
    iis-5c997657fb-w95dl   1/1       Running   0          28s
    
  3. Obtenez l'état du service et attendez que le champ EXTERNAL-IP soit renseigné :

    kubectl get service iis
    

    Vous devriez obtenir le résultat suivant :

    NAME   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    iis    LoadBalancer   10.44.2.112   external-ip    80:32233/TCP   17s
    

Vous pouvez maintenant utiliser votre navigateur pour ouvrir http://EXTERNAL_IP et afficher la page Web IIS.

Déployer une application Windows Server sur un cluster privé

Cette section explique comment déployer une application de conteneur Windows Server sur un cluster privé.

Les images de conteneur Windows Server comportent plusieurs couches et les couches de base sont fournies par Microsoft. Les couches de base sont stockées en tant que couches étrangères au lieu d'être intégrées à l'image comme les couches d'images Docker Linux. Lorsqu'une image de conteneur Windows Server est extraite pour la première fois, les couches de base doivent généralement être téléchargées depuis des serveurs Microsoft. Étant donné que les nœuds de cluster privés ne sont pas connectés à Internet, les couches de conteneur de base de Windows Server ne peuvent pas être extraites directement des serveurs Microsoft.

Pour utiliser des clusters privés, vous pouvez configurer le daemon Docker pour autoriser le transfert des couches non distribuables vers des registres privés. Pour en savoir plus, consultez la section Autoriser le transfert d'artefacts non distribuables sur la page GitHub de Docker.

Pour déployer votre application Windows Server sur un cluster privé, vous allez suivre la procédure suivante :

  1. Créer un cluster privé avec des nœuds Windows Server.
  2. Créer l'image Docker de l'application Windows Server.
  3. Déployer l'application sur un cluster privé.
  4. Vérifier que le pod est en cours d'exécution.

Créer un cluster privé

Suivez les instructions des sections Créer un cluster avec des nœuds Windows Server et Créer un cluster privé pour créer et ajouter un pool de nœuds Windows à un cluster privé.

Créer l'image Docker de l'application Windows Server

  1. Pour créer l'image Docker, démarrez une instance Compute Engine avec la version de Windows Server sur laquelle vous souhaitez exécuter vos conteneurs d'applications, telle que Windows Server 2019 ou Windows Server 20H2. Vérifiez également que vous disposez d'une connexion Internet.

  2. Dans l'instance Compute Engine, accédez à la configuration du daemon Docker :

    cat C:\ProgramData\docker\config\daemon.json
    
  3. Configurez le fichier Docker daemon.json pour autoriser le transfert de couches étrangères vers votre registre privé en ajoutant les lignes suivantes :

    {
      "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"]
    }
    

    Dans cet exemple, REGISTRY_REGION-docker.pkg.dev fait référence à Artifact Registry, où l'image sera hébergée.

  4. Redémarrez le daemon Docker :

    Restart-Service docker
    
  5. Créez un dépôt Docker dans Artifact Registry.

  6. Créez l'image Docker de votre application et ajoutez un tag comme suit :

    cd C:\my-app
    
    docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
    

    Cette commande demande à Docker de créer l'image à l'aide du fichier Dockerfile dans le répertoire actuel et de lui attribuer un tag, tel que us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2.

  7. Transférez l'image Docker de l'application vers le dépôt Artifact Registry de votre projet. Avec la configuration allow-nondistributable-artifacts définie, les couches de base Windows doivent être transférées vers votre registre privé.

    docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
    

Créer un fichier manifeste de déploiement

Voici un exemple de fichier manifeste de déploiement nommé my-app.yaml. L'image de cet exemple est celle que vous avez envoyée à l'étape précédente (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
  1. Utilisez la commande get-credentials pour activer kubectl afin de pouvoir l'utiliser avec le cluster que vous venez de créer.

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Remplacez CLUSTER_NAME par le nom du cluster privé que vous avez créé.

  2. Déployez l'application spécifiée dans le fichier my-app.yaml sur votre cluster privé :

    kubectl apply -f my-app.yaml
    

Vérifier que le pod est en cours d'exécution

Répertoriez tous les pods pour vous assurer que l'application s'exécute correctement :

kubectl get pods

Le pod devrait s'afficher avec l'état Running, comme dans le résultat suivant :

NAME                     READY   STATUS    RESTARTS   AGE
my-app-c95fc5596-c9zcb   1/1     Running   0          5m

Utiliser des images de nœuds mixtes

Vos clusters peuvent contenir des pools de nœuds avec plusieurs types et versions de Windows Server. Ils peuvent également combiner des charges de travail Windows Server et Linux. Les sections suivantes expliquent comment configurer vos charges de travail pour utiliser ces types de clusters.

Utiliser des charges de travail avec différents types d'images de nœuds Windows Server

Vous pouvez ajouter des pools de nœuds à votre cluster à l'aide de différents types d'images Windows Server. Dans un cluster avec des types Windows Server mixtes, vous devez vous assurer que vos conteneurs Windows Server ne sont pas programmés sur un nœud Windows Server incompatible.

Si vous disposez d'un pool de nœuds LTSC Windows Server et d'un pool de nœud SAC Windows Server, ajoutez le libellé de nœud gke-os-distribution à vos deux charges de travail.

Incluez le sélecteur de nœuds suivant dans le fichier manifeste de vos charges de travail LTSC Windows Server :

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc

Incluez le sélecteur de nœuds suivant dans le fichier manifeste de vos charges de travail SAC Windows Server :

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_sac

L'ajout de ce libellé garantit que vos images de conteneur LTSC ne sont pas programmées sur des nœuds SAC incompatibles, et inversement.

Utiliser des charges de travail avec différentes versions d'OS LTSC Windows Server

Les nœuds Windows Server sont compatibles avec les images d'OS LTSC2022 et LTSC2019. Vous pouvez spécifier la version d'OS Windows à utiliser (LTSC2022) avec la paire clé/valeur suivante dans nodeSelector : cloud.google.com/gke-windows-os-version=2022.

Ce libellé de nœud garantit que le programmeur GKE choisira les nœuds Windows Server appropriés pour exécuter les charges de travail LTSC2022 ou LTSC2019. Les nœuds Windows Server appartiennent tous deux au type d'image windows_ltsc_containerd. La valeur du libellé de nœud peut être 2022 ou 2019. Si le libellé de nœud n'est pas spécifié, vous pouvez utiliser les nœuds LTSC2019 ou LTSC2022 pour programmer des conteneurs. Pour programmer des conteneurs Windows Server uniquement sur des nœuds Windows Server LTSC2022, votre fichier manifeste doit inclure ce sélecteur de nœud :

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc
   cloud.google.com/gke-windows-os-version: 2022

Utiliser des charges de travail avec différentes versions de Windows Server

Si vous devez exécuter des pools de nœuds Windows Server avec plusieurs versions LTSC ou SAC différentes, nous vous recommandons de créer vos images de conteneurs en tant qu'images multi-arch pouvant s'exécuter sur toutes les versions de Windows Server utilisées dans votre cluster. Le libellé de nœud gke-os-distribution n'est pas suffisant pour empêcher la programmation potentielle de vos charges de travail sur des nœuds incompatibles.

Utiliser des charges de travail Linux et Windows Server dans un cluster

Ajoutez le sélecteur de nœuds suivant à vos charges de travail Linux pour vous assurer qu'elles sont toujours programmées sur les nœuds Linux :

nodeSelector:
   kubernetes.io/os: linux

Vous disposez ainsi d'une protection supplémentaire pour éviter que les charges de travail Linux ne soient programmées sur des nœuds Windows Server au cas où le rejet NoSchedule serait accidentellement supprimé des nœuds Windows Server.