Déployer une application de serveur Web conteneurisée

Ce tutoriel explique comment importer une application de conteneur dans un environnement Google Distributed Cloud (GDC) sous air gap et l'exécuter sur un cluster Kubernetes. Une charge de travail en conteneur s'exécute sur un cluster Kubernetes dans un espace de noms de projet. Les clusters sont logiquement distincts des projets et les uns des autres pour fournir différents domaines de défaillance et garanties d'isolation. Toutefois, vous devez vous assurer que votre cluster est associé à un projet pour permettre la gestion des charges de travail en conteneur dans un projet.

Ce workflow est destiné aux développeurs d'applications du groupe d'opérateurs d'applications, qui sont chargés de créer des charges de travail d'application pour leur organisation. Pour en savoir plus, consultez la documentation sur les audiences pour GDC sous air gap.

L'un des principaux obstacles au déploiement d'une application de conteneur consiste à obtenir le binaire de l'application dans votre centre de données sous air gap. Collaborez avec votre équipe d'infrastructure et vos administrateurs pour transférer l'application vers votre poste de travail ou implémenter ce tutoriel directement sur votre serveur d'intégration continue et de livraison continue (CI/CD).

Ce tutoriel utilise un exemple d'application de serveur Web disponible dans l' Google Cloud Artifact Registry.

Objectifs

  • Créer un registre Harbor géré
  • Transférer une image de conteneur vers le registre Harbor géré
  • Créer un cluster Kubernetes
  • Déployer l'exemple d'application de conteneur sur le cluster

Coûts

Étant donné que GDC est conçu pour s'exécuter dans un centre de données sous air gap, les processus et informations de facturation sont limités au déploiement GDC et ne sont pas gérés par d'autres produits Google.

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.

Utilisez le tableau de bord Coût prévu pour anticiper les futurs coûts de SKU pour vos factures.

Pour suivre la consommation de stockage et de calcul, utilisez les tableaux de bord "Utilisation de la facturation".

Avant de commencer

  1. Assurez-vous de disposer d'un projet pour gérer vos déploiements en conteneur. Créez un projet si vous n'en avez pas.

  2. Définissez l'espace de noms de votre projet en tant que variable d'environnement :

    export NAMESPACE=PROJECT_NAMESPACE
    
  3. Téléchargez et installez la gdcloud CLI.

  4. Demandez à votre administrateur IAM de l'organisation de vous accorder les rôles suivants :

    • Rôle d'administrateur d'espace de noms (namepspace-admin) pour l'espace de noms de votre projet. Ce rôle est requis pour déployer des charges de travail de conteneur dans votre projet.

    • Rôle d'administrateur d'instance Harbor (harbor-instance-admin) pour l'espace de noms de votre projet. Ce rôle est requis pour accéder en lecture et en écriture à toutes les ressources Harbor. Il est également requis pour supprimer des instances Harbor.

    • Rôle de lecteur d'instance Harbor (harbor-instance-viewer) pour l'espace de noms de votre projet. Ce rôle est requis pour afficher et sélectionner une instance Harbor.

    • Rôle de créateur de projet Harbor (harbor-project-creator) pour l'espace de noms de votre projet. Ce rôle est requis pour accéder à un projet Harbor et le gérer.

    • Rôle d'administrateur de cluster utilisateur (user-cluster-admin). Ce rôle est requis pour créer un cluster Kubernetes et n'est pas lié à un espace de noms.

  5. Connectez-vous au serveur d'API de gestion zonale et générez son fichier kubeconfig avec une identité utilisateur. Définissez le chemin d'accès kubeconfig en tant que variable d'environnement :

    export MANAGEMENT_API_SERVER=MANAGEMENT_API_SERVER_KUBECONFIG_PATH
    

Créer un registre Harbor géré

GDC sous air gap fournit Harbor as a Service, un service entièrement géré qui vous permet de stocker et de gérer des images de conteneurs à l'aide de Harbor.

Pour utiliser Harbor as a Service, vous devez d'abord créer une instance de registre Harbor et un projet Harbor.

Créer une instance de registre Harbor

Pour créer une instance de registre de conteneurs Harbor, procédez comme suit :

Console

  1. Dans le menu de navigation, sélectionnez Harbor Container Registry (Registre de conteneurs Harbor) dans la section CI/CD.

  2. Sélectionnez la zone dans laquelle créer votre instance Harbor. Une instance Harbor est une ressource zonale et doit être créée manuellement dans chaque zone pour garantir une haute disponibilité.

  3. Cliquez sur Create Instance (Créer une instance).

  4. Saisissez le nom de l'instance et acceptez les conditions d'utilisation gérées de Harbor.

  5. Cliquez sur Create Instance (Créer une instance).

  6. Vérifiez que votre nouvelle instance Harbor existe dans la section Harbor Instance (Instance Harbor).

  7. Cliquez sur le lien externe Go to Harbor Instance (Accéder à l'instance Harbor) et notez l'URL de l'instance. Par exemple, le format de l'URL de l'instance ressemble à harbor-1.org-1.zone1.google.gdc.test. L'URL de l'instance ne doit pas inclure le préfixe https://.

  8. Définissez l'URL de l'instance en tant que variable à utiliser ultérieurement dans le tutoriel :

    export INSTANCE_URL=INSTANCE_URL
    

    Remplacez INSTANCE_URL par l'URL de l'instance de registre Harbor.

    Exemple :

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

gdcloud

  1. Créez la nouvelle instance de registre de conteneurs Harbor :

    gdcloud harbor instances create INSTANCE_NAME \
        --project=PROJECT \
    

    Remplacez les éléments suivants :

    • INSTANCE_NAME: nom de l'instance Harbor.
    • PROJECT: nom du projet GDC.
  2. Affichez l'URL de l'instance :

    gdcloud harbor instances describe INSTANCE_NAME \
        --project=PROJECT
    

    La sortie ressemble à ceci :

    # Several lines of code are omitted here.
    status:
      url: https://harbor-1.org-1.zone1.google.gdc.test
    
  3. Définissez l'URL de l'instance en tant que variable à utiliser ultérieurement dans le tutoriel :

    export INSTANCE_URL=INSTANCE_URL
    

    Remplacez INSTANCE_URL par l'URL de l'instance de registre Harbor. Assurez-vous que l'URL de l'instance n'inclut pas le préfixe https://.

    Exemple :

    export INSTANCE_URL=harbor-1.org-1.zone1.google.gdc.test
    

Créer un projet Harbor dans le registre

Vous devez créer un projet Harbor dans l'instance de registre Harbor pour gérer vos images de conteneurs :

Console

  1. Cliquez sur Create A Harbor Project (Créer un projet Harbor) sur la page Harbor Container Registry (Registre de conteneurs Harbor).

  2. Saisissez le nom du projet.

  3. Cliquez sur Create (Créer).

  4. Définissez le nom du projet Harbor en tant que variable à utiliser ultérieurement dans le tutoriel :

    export HARBOR_PROJECT=HARBOR_PROJECT
    

gdcloud

  1. Créez le projet Harbor :

    gdcloud harbor harbor-projects create HARBOR_PROJECT \
        --project=PROJECT \
        --instance=INSTANCE_NAME
    

    Remplacez les éléments suivants :

    • HARBOR_PROJECT: nom du projet Harbor à créer.
    • PROJECT: nom du projet GDC.
    • INSTANCE_NAME : nom de l'instance Harbor.
  2. Définissez le nom du projet Harbor en tant que variable à utiliser ultérieurement dans le tutoriel :

    export HARBOR_PROJECT=HARBOR_PROJECT
    

Configurer Docker

Pour utiliser Docker dans votre registre Harbor, procédez comme suit :

  1. Configurez Docker pour qu'il approuve Harbor as a Service. Pour en savoir plus, consultez Configurer Docker pour qu'il approuve l'autorité de certification racine Harbor.

  2. Configurez l'authentification Docker auprès de Harbor. Pour en savoir plus, consultez Configurer l'authentification Docker auprès des instances de registre Harbor.

Créer un secret d'extraction d'image Kubernetes

Étant donné que vous utilisez un projet Harbor privé, vous devez créer un secret d'extraction d'image Kubernetes.

  1. Ajoutez un compte de robot de projet Harbor pour qu'il serve de compte de service.

    1. Dans la console Harbor, sélectionnez votre projet Harbor.

    2. Cliquez sur Robot Accounts (Comptes de robot).

    3. Sélectionnez New Robot Account (Nouveau compte de robot).

    4. Attribuez un nom à votre nouveau compte de robot et définissez tous les paramètres supplémentaires.

    5. Cliquez sur Add (Ajouter).

    6. Le nom et le secret du compte de robot s'affichent sur l'écran de confirmation. Laissez cet écran ouvert pour référence à l'étape suivante.

    Pour en savoir plus, consultez la documentation de Harbor : https://goharbor.io/docs/2.8.0/working-with-projects/project-configuration/create-robot-accounts/#add-a-robot-account.

  2. Dans une nouvelle fenêtre de terminal, connectez-vous à Docker avec le compte de robot de votre projet Harbor et le jeton secret :

    docker login ${INSTANCE_URL}
    

    Lorsque vous y êtes invité, insérez le nom du projet de robot pour le nom d'utilisateur et le jeton secret pour le mot de passe qui ont été fournis à l'étape précédente à partir de l'écran de confirmation de la console Harbor.

  3. Définissez un nom arbitraire pour le secret d'extraction d'image :

    export SECRET=SECRET
    
  4. Créez le secret requis pour l'extraction d'image :

    kubectl create secret docker-registry ${SECRET}  \
        --from-file=.dockerconfigjson=DOCKER_CONFIG \
        -n ${NAMESPACE}
    

    Remplacez DOCKER_CONFIG par le chemin d'accès au fichier .docker/config.json.

  5. Vérifiez que votre secret existe dans l'espace de noms de votre projet GDC :

    kubectl get secrets -n ${NAMESPACE}
    

    Le résultat ressemble à ce qui suit :

    NAME          TYPE                               DATA     AGE
    my-secret     kubernetes.io/dockerconfigjson     1        23s
    

Transférer une image de conteneur vers le registre Harbor géré

Pour ce tutoriel, vous allez télécharger et transférer l'image du serveur Web nginx vers le registre Harbor géré, puis l'utiliser pour déployer un exemple d'application de serveur Web nginx sur un cluster Kubernetes. L'application de serveur Web nginx est disponible dans le dépôt public Docker Hub.

  1. Extrayez l'image nginx de Docker Hub vers votre poste de travail local à l'aide d'un réseau externe :

    docker pull nginx
    
  2. Ajoutez un tag à l'image locale avec le nom du dépôt :

    docker tag nginx ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    
  3. Transférez l'image de conteneur nginx vers votre registre Harbor géré :

    docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
    

Créer un cluster Kubernetes

Maintenant que l'image de conteneur nginx est stockée dans le registre Harbor géré et que vous pouvez y accéder, créez un cluster Kubernetes partagé pour exécuter le serveur Web nginx.

Console

  1. Dans le menu de navigation, sélectionnez Kubernetes Engine > Clusters.

  2. Cliquez sur Create Cluster (Créer un cluster).

  3. Dans le champ Name (Nom), spécifiez un nom pour le cluster.

  4. Sélectionnez la zone dans laquelle créer votre cluster Kubernetes. Un cluster Kubernetes est une ressource zonale et doit être créé manuellement dans chaque zone pour garantir une haute disponibilité.

  5. Cliquez sur Attach Project (Associer un projet), puis sélectionnez un projet à associer à votre cluster. Cliquez ensuite sur Save (Enregistrer).

  6. Cliquez sur Create (Créer).

  7. Attendez que le cluster soit créé. Lorsque le cluster est disponible, l'état READY s'affiche à côté de son nom.

API

  1. Créez une ressource personnalisée Cluster et enregistrez-la en tant que fichier YAML, tel que cluster.yaml :

    apiVersion: cluster.gdc.goog/v1
    kind: Cluster
    metadata:
      name: CLUSTER_NAME
      namespace: platform
    

    Remplacez la valeur CLUSTER_NAME par le nom du cluster.

  2. Appliquez la ressource personnalisée à votre instance GDC :

    kubectl create -f cluster.yaml --kubeconfig ${MANAGEMENT_API_SERVER}
    
  3. Associez un projet à votre cluster Kubernetes à l'aide de la console GDC. Vous ne pouvez pas associer de projet au cluster à l'aide de l'API pour le moment.

Pour en savoir plus sur la création d'un cluster Kubernetes partagé, consultez Créer un cluster partagé. Pour en savoir plus sur les options de configuration de cluster disponibles, consultez Configurations de clusters Kubernetes.

Déployer l'exemple d'application de conteneur

Vous êtes maintenant prêt à déployer l'image de conteneur nginx sur votre cluster Kubernetes.

Kubernetes représente les applications en tant que ressources Pod, qui sont des unités évolutives contenant un ou plusieurs conteneurs. Le pod est la plus petite unité déployable dans Kubernetes. Généralement, vous déployez les pods sous la forme d'un ensemble d'instances dupliquées pouvant être mises à l'échelle et réparties sur votre cluster. Pour déployer un ensemble d'instances dupliquées, vous pouvez utiliser un Deployment Kubernetes.

Dans cette section, vous allez créer un Deployment Kubernetes pour exécuter l'application de conteneur nginx sur votre cluster. Ce déploiement comporte des instances dupliquées, ou pods. Un pod Deployment ne contient qu'un seul conteneur : l'image de conteneur nginx. Vous allez également créer une ressource Service qui offre aux clients un moyen stable d'envoyer des requêtes aux pods de votre Deployment.

Déployez le serveur Web nginx sur votre cluster Kubernetes :

  1. Connectez-vous au cluster Kubernetes et générez son fichier kubeconfig avec une identité utilisateur. Définissez le chemin d'accès kubeconfig en tant que variable d'environnement :

    export KUBECONFIG=CLUSTER_KUBECONFIG_PATH
    
  2. Créez et déployez les ressources personnalisées Deployment et Service Kubernetes :

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: ${INSTANCE_URL}/${HARBOR_PROJECT}/nginx:1.25
            ports:
            - containerPort: 80
          imagePullSecrets:
          - name: ${SECRET}
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
        - port: 80
          protocol: TCP
      type: LoadBalancer
    EOF
    
  3. Vérifiez que les pods ont été créés par le déploiement :

    kubectl get pods -l app=nginx -n ${NAMESPACE}
    

    Le résultat ressemble à ce qui suit :

    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1882529037-6p4mt   1/1       Running   0          1h
    nginx-deployment-1882529037-p29za   1/1       Running   0          1h
    nginx-deployment-1882529037-s0cmt   1/1       Running   0          1h
    
  4. Créez une stratégie réseau pour autoriser tout le trafic réseau vers l'espace de noms :

    kubectl --kubeconfig ${KUBECONFIG} -n ${NAMESPACE} \
    create -f - <<EOF
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    
  5. Exportez l'adresse IP du service nginx :

      export IP=`kubectl --kubeconfig=${KUBECONFIG} get service nginx-service \
          -n ${NAMESPACE} -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  6. Testez l'adresse IP du serveur nginx à l'aide de curl :

      curl http://$IP
    

Libérer de l'espace

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte GDC, vous devez les supprimer.

Supprimer l'image de conteneur

Pour supprimer l'image de conteneur de votre environnement GDC sous air gap, supprimez l'instance Harbor qui contient l'image ou conservez l'instance Harbor et supprimez l'image de conteneur individuelle.

Pour supprimer l'image de conteneur du registre Harbor géré, utilisez la console GDC :

  1. Dans le menu de navigation, sélectionnez Harbor Container Registry (Registre de conteneurs Harbor) dans la section CI/CD.

  2. Cliquez sur le lien externe Go to Harbor Instance (Accéder à l'instance Harbor).

  3. Supprimez l'image de conteneur à l'aide de l'interface utilisateur Harbor. Pour en savoir plus, consultez Supprimer des instances de registre Harbor.

Supprimer l'application de conteneur

Pour supprimer l'application de conteneur déployée, soit supprimez le projet GDC qui contient les ressources, soit conservez le projet GDC et supprimez les ressources individuelles.

Pour supprimer les ressources individuelles, procédez comme suit :

  1. Supprimez l'objet Service de votre application de conteneur :

    kubectl delete service nginx-service -n ${NAMESPACE}
    
  2. Supprimez l'objet Deployment de votre application de conteneur :

    kubectl delete deployment nginx-deployment -n ${NAMESPACE}
    
  3. Si vous avez créé un cluster Kubernetes de test uniquement pour ce tutoriel, supprimez-le :

    kubectl delete clusters.cluster.gdc.goog/USER_CLUSTER_NAME \
        -n platform --kubeconfig ${MANAGEMENT_API_SERVER}
    

    Cela supprime les ressources qui constituent le cluster Kubernetes, telles que les instances de calcul, les disques et les ressources réseau :

Étape suivante