Créer des images multi-arch Windows Server


Ce tutoriel explique comment gérer la complexité de la gestion des versions pour créer des images qui ciblent plusieurs versions de Windows Server. Les conteneurs Windows Server ont des exigences de compatibilité des versions qui empêchent l'exécution des conteneurs sur plus d'une version d'hôte Windows Server. Toutefois, Docker sous Windows Server est compatible avec les images de conteneurs multi-arch (ou multiplates-formes) qui peuvent être exécutées sur plusieurs versions de Windows Server.

Avec les images multi-arch, vous pouvez mettre à niveau vos pools de nœuds Windows Server de Google Kubernetes Engine (GKE) vers votre version Windows Server préférée sans recréer l'image et modifier les spécifications du pod. Exemple :

  • GKE version 1.15 est compatible avec Windows Server 1809
  • GKE version 1.16 est compatible avec Windows Server 1909

Pour passer automatiquement d'une version GKE à une version ultérieure, vous devez créer des images multi-arch pour vos charges de travail Windows. La création d'une image multi-arch implique la création d'une image pour chaque version de Windows Server, puis la création d'un fichier manifeste faisant référence à ces images pour chaque version de Windows Server. Vous pouvez créer les images manuellement si vous souhaitez contrôler entièrement le processus de création et de génération d'images. Vous pouvez également utiliser Cloud Build pour créer automatiquement les images multi-arch Windows Server.

Objectifs

Dans ce tutoriel, vous allez apprendre à créer des images multi-arch Windows Server manuellement ou à l'aide de Cloud Build.

  • Créer les images manuellement :

    • Créer deux images Docker avec des versions ou des types différents de Windows Server, par exemple le canal de maintenance à long terme (LTSC, Long-Term Servicing Channel) et le canal semi-annuel (SAC, Semi-Annual Channel)
    • Créer une VM Windows Server
    • Créer un fichier manifeste et le transférer dans le registre
  • Créer les images à l'aide de Cloud Build :

    • Préparer l'environnement en créant un projet, en activant des API et en accordant des autorisations
    • Créer une application, des Dockerfile et des fichiers
    • Exécuter une commande pour créer l'image

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud, dont :

  • Compute Engine
  • Cloud Build

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  1. Installez le SDK Cloud pour exécuter des commandes gcloud.
  2. Installez Docker pour créer des conteneurs.
  3. Installez Go pour créer des binaires Windows Server.
  4. Si vous utilisez Container Registry (gcr.io) pour stocker des images, assurez-vous que vous avez configuré le transfert et l'extraction des images.

Créer des images multi-arch manuellement

La création manuelle d'images multi-arch vous permet de créer une image incluant toutes les versions de Windows Server dont vous avez besoin. Pour créer une image multi-arch manuellement, procédez comme suit :

  1. Créez une image single-arch Docker LTSC 2019. Pour en savoir plus sur la création d'images Docker, consultez la page Déployer une application Windows Server. Exemple :gcr.io/my-project/foo:1.0-2019
  2. Créez une image single-arch Docker SAC 1909. Par exemple, gcr.io/my-project/foo:1.0-1909.
  3. Créez une VM Windows Server, par exemple la version 1909. Consultez le guide de démarrage rapide avec une VM Windows Server.
  4. Utilisez le protocole RDP pour vous connecter à la VM.
  5. Ouvrez une fenêtre PowerShell pour exécuter les commandes des étapes suivantes.
  6. Activez la fonctionnalité expérimentale docker manifest. Un fichier manifeste Docker est une liste d'images à transférer vers un registre :

    PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
    
  7. Créez le fichier manifeste multi-arch :

    docker manifest create gcr.io/my-project/foo:1.0 gcr.io/my-project/foo:1.0-2019 gcr.io/my-project/foo:1.0-1909
    
  8. Transférez le fichier manifeste d'image multi-arch que vous venez de créer dans votre registre de conteneurs :

     docker manifest push gcr.io/my-project/foo:1.0
    
  9. Pour vous assurer que votre image multi-arch a été créée et transférée, accédez à gcr.io/my-project/foo et cliquez sur cette image. Les trois images suivantes s'affichent :

    • foo:1.0-2019
    • foo:1.0-1909
    • foo:1.0

Vous pouvez maintenant faire référence à l'image multi-arch gcr.io/my-project/foo:1.0 dans les spécifications de votre pod. Cela vous permettra d'utiliser la mise à niveau automatique en toute sécurité pour vos pools de nœuds Windows GKE.

Créer des images multi-arch à l'aide de Cloud Build gke-windows-builder

Pour faciliter les étapes de compilation manuelle, vous pouvez utiliser gke-windows-builder, basé sur OSS windows-builder. Vous pouvez utiliser gke-windows-builder avec Cloud Build pour créer automatiquement les images multi-arch Windows Server. GKE met à jour le compilateur afin d'inclure les nouvelles versions de SAC et de LTSC compatibles lorsqu'elles sont disponibles. Un autre avantage de l'utilisation du compilateur est que vous n'avez pas besoin de créer votre propre VM Windows avec Powershell pour créer les images. La VM Windows est remplacée par un conteneur Docker qui exécute les commandes à votre place dans Cloud Build.

Pour vous aider à comprendre le fonctionnement du compilateur, suivez cet exemple pour créer une image multi-arch "Hello World". Ces étapes peuvent être effectuées sur des serveurs Linux ou Windows.

Préparer l'environnement

Pour préparer votre environnement, procédez comme suit :

  1. Créez un répertoire d'espace de travail sur votre ordinateur de travail, par exemple : ~/gke-windows-builder/hello-world.
  2. Créez ou sélectionnez un projet pour ce tutoriel.
  3. Assurez-vous que la facturation est activée pour votre projet.
  4. Assurez-vous que l'API Cloud Build est activée pour votre projet.

    Activer l'API Cloud Build

  5. Attribuez les rôles IAM (Identity and Access Management) suivants à votre compte de service Cloud Build à l'aide de l'outil de ligne de commande gcloud :

    1. Activez l'API pour autoriser gke-windows-builder à créer et gérer des VM Windows Server :

      gcloud services enable compute.googleapis.com
      
    2. Définissez les variables :

      export PROJECT=$(gcloud info --format='value(config.project)')
      export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
      
    3. Attribuez les rôles. Les rôles suivants sont nécessaires pour que le compilateur crée les VM Windows Server copie l'espace de travail dans un bucket Cloud Storage et configure les réseaux de manière à créer l'image Docker :

      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.instanceAdmin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/iam.serviceAccountUser'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.networkViewer'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/storage.admin'
      
  6. Ajoutez une règle de pare-feu nommée allow-winrm-ingress pour permettre à WinRM de se connecter aux VM Windows Server afin d'exécuter une compilation Docker :

    gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
    

Créer le binaire hello.exe dans votre espace de travail

Pour ce tutoriel, créez une application "Hello World" simple, écrite en Go. Le code de l'exemple d'application est disponible sur GitHub.

  1. Clonez le dépôt contenant l'exemple de code de ce tutoriel sur votre ordinateur local à l'aide des commandes suivantes :

     git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
     cd kubernetes-engine-samples/windows-multi-arch
    
  2. Le fichier hello.go renvoie les mots "Hello World" :

    // Copyright 2020 Google LLC
    //
    // Licensed under the Apache License, Version 2.0 (the "License");
    // you may not use this file except in compliance with the License.
    // You may obtain a copy of the License at
    //
    //     http://www.apache.org/licenses/LICENSE-2.0
    //
    // Unless required by applicable law or agreed to in writing, software
    // distributed under the License is distributed on an "AS IS" BASIS,
    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    // See the License for the specific language governing permissions and
    // limitations under the License.
    
    package main
    import "fmt"
    func main() {
        fmt.Println("Hello World!")
    }
  3. Générez le binaire hello.exe :

    GOOS=windows go build hello.go
    

Le binaire hello.exe s'affiche dans votre espace de travail.

Créer un Dockerfile et compiler des fichiers dans votre espace de travail

Dans cette section, vous allez utiliser un fichier Dockerfile pour compiler chaque image Windows Server single-arch, puis un fichier de compilation pour déclencher Cloud Build. La compilation combine les images single-arch en une image multi-arch.

  1. Le fichier Dockerfile est un document texte qui contient des instructions permettant à Docker de créer une image. gke-windows-builder remplace WINDOWS_VERSION par une version spécifique de Windows Server pour laquelle l'image est générée. Par exemple, le compilateur exécute docker build -t multi-arch-helloworld:latest_1909 --build-arg WINDOWS_VERSION=1909 . sur Windows Server 1909.

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    ARG WINDOWS_VERSION=
    FROM mcr.microsoft.com/windows/servercore:${WINDOWS_VERSION}
    COPY hello.exe /hello.exe
    USER ContainerUser
    ENTRYPOINT ["hello.exe"]
    
  2. Dans le répertoire contenant le fichier Dockerfile, le fichier cloudbuild.yaml est votre fichier de configuration de compilation. Au moment de la compilation, Cloud Build remplace automatiquement $PROJECT_ID par l'ID de votre projet.

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    timeout: 3600s
    steps:
    - name: 'gcr.io/gke-release/gke-windows-builder:release-2.6.1-gke.0'
      args:
      - --container-image-name
      - 'gcr.io/$PROJECT_ID/multiarch-helloworld:latest'
    

Compiler l'image

Vous pouvez maintenant compiler l'image et afficher vos journaux pour vérifier que la compilation s'est bien déroulée.

  1. Pour compiler l'image, exécutez la commande suivante :

    gcloud builds submit --config=cloudbuild.yaml .
    
  2. Des journaux semblables à l'exemple suivant s'affichent. La dernière ligne du journal indique que la compilation a réussi :

    Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression.
    Uploading tarball of [.] to [gs://{your project}_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz]
    Created [https://cloudbuild.googleapis.com/v1/projects/{your project}/builds/ec333452-1301-47e8-90e2-716aeb2f5650].
    Logs are available at [https://console.cloud.google.com/cloud-build/builds/ec333452-1301-47e8-90e2-716aeb2f5650?project=840737568665].
    ------------------------ REMOTE BUILD OUTPUT---------------------------------------
    ...
    ...
    
    Created manifest list gcr.io/{your project}/multiarch-helloworld:latest
    sha256:3ecbbc9f5144f358f81f7c7f1a7e28f069c98423d59c40eaff72bf184af0be02
    2020/09/14 11:34:25 Instance: 35.184.178.49 shut down successfully
    PUSH
    DONE
    -----------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                      IMAGES  STATUS
    ec333452-1301-47e8-90e2-716aeb2f5650  2020-09-14T11:21:43+00:00  12M43S    gs://{your project}_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz  -                 SUCCESS
    

Vous venez de compiler l'image à l'aide du fichier de configuration de compilation et l'avez transférée vers gcr.io/{your project}/multiarch-helloworld:latest dans Container Registry.

Déployer l'image

Pour déployer l'image Windows multi-arch sur un cluster, consultez la page Déployer une application Windows Server pour savoir comment déployer l'image.

Utilisation avancée de gke-windows-builder

Pour afficher les options compatibles avec gke-windows-builder, exécutez la commande suivante sur un serveur Linux ou dans Cloud Shell :

docker run -it gcr.io/gke-release/gke-windows-builder:release-2.6.1-gke.0 --help

Pour personnaliser le comportement de gke-windows-builder, vous pouvez ajouter ces options à la section args du fichier cloudbuild.yaml. Par exemple, pour accélérer vos compilations, vous pouvez utiliser un type de machine plus grand pour les instances Windows :

  - --machineType
  - 'n1-standard-8'

Au lieu de créer l'image pour toutes les versions de Windows compatibles avec GKE, vous pouvez choisir des versions spécifiques de Windows Server à l'aide de l'option --versions :

  - --versions
  - '1909,ltsc2019'

Si votre espace de travail contient de nombreux fichiers, la compilation de votre image sera plus fiable si vous configurez le compilateur pour copier l'espace de travail via Cloud Storage plutôt que WinRM. Créez un bucket dans votre projet, tel que gs://{your project}_builder, puis définissez l'option --workspace-bucket :

  - --workspace-bucket
  - '{your project}_builder'

Pour exécuter les instances du compilateur Windows dans un projet de service VPC partagé, utilisez les options suivantes qui contrôlent la configuration du réseau de l'instance :

  - --subnetwork-project
  - 'shared-vpc-host-project'
  - --subnetwork
  - 'host-project-subnet-shared-with-service-project'

Nettoyer

Une fois le tutoriel terminé, vous pouvez procéder au nettoyage des ressources que vous avez créées afin qu'elles ne soient plus comptabilisées dans votre quota et qu'elles ne vous soient plus facturées. Dans les sections suivantes, nous allons voir comment supprimer ou désactiver ces ressources.

Supprimer l'image

Pour supprimer l'image, procédez comme suit :

  1. Accédez à la page Container Registry dans Cloud Console.

    Accéder à Container Registry

  2. Accédez à la page Images.

  3. Cliquez sur multiarch-helloworld.

  4. Sélectionnez toutes les images.

  5. Cliquez sur le bouton Supprimer.

  6. Cliquez sur Supprimer dans la fenêtre d'invite.

Vous avez maintenant supprimé les images que vous avez créées dans ce tutoriel.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étape suivante