Environnement de développement

1. Présentation

Cet atelier présente des fonctionnalités conçues pour simplifier le workflow de développement des ingénieurs logiciels chargés de développer des applications Python dans un environnement conteneurisé. Le développement de conteneurs typique exige de l'utilisateur qu'il comprenne les détails des conteneurs et du processus de création de conteneurs. De plus, les développeurs doivent généralement interrompre leur flux de travail et quitter leur IDE pour tester et déboguer leurs applications dans des environnements distants. Grâce aux outils et technologies mentionnés dans ce tutoriel, les développeurs peuvent travailler efficacement avec des applications conteneurisées sans quitter leur IDE.

58a4cdd3ed7a123a.png

Qu'est-ce que Cloud Workstations ?

Cloud Workstations fournit des environnements de développement gérés sur Google Cloud, avec une sécurité intégrée et des environnements de développement préconfigurés, mais personnalisables. Accédez à Cloud Workstations via un IDE basé sur navigateur, depuis plusieurs éditeurs de code locaux (tels que VSCode ou les IDE JetBrains comme IntelliJ IDEA Ultimate et PyCharm Professional), ou via SSH.

Cloud Workstations utilise les ressources suivantes :

  • Les administrateurs créent des clusters de stations de travail.
  • Dans chaque cluster de stations de travail, les administrateurs créent une ou plusieurs configurations de stations de travail qui servent de modèles pour les stations de travail.
  • Les développeurs peuvent créer des workstations qui définissent des environnements de développement fournissant un IDE Cloud, des outils de langage, des bibliothèques, etc.

Cloud Workstations permet aux administrateurs informatiques et de sécurité de provisionner, faire évoluer, gérer et sécuriser facilement leurs environnements de développement. Il permet également aux développeurs d'accéder à des environnements de développement avec des configurations cohérentes et des outils personnalisables.

Cloud Workstations vous aide à déplacer la sécurité vers la gauche en renforçant la sécurité de vos environnements de développement d'applications. Il dispose de fonctionnalités de sécurité telles que VPC Service Controls, des entrées ou sorties privées, la mise à jour forcée des images et des stratégies d'accès Identity and Access Management.

Qu'est-ce que Cloud Code ?

Cloud Code apporte la compatibilité IDE pour l'intégralité du cycle de développement des applications Kubernetes et Cloud Run, de la création et la personnalisation d'une application à partir d'exemples de modèles à l'exécution d'une application achevée. Cloud Code vous fournit également des exemples prêts à l'emploi, des extraits de configuration prêts à l'emploi et une expérience de débogage sur mesure, ce qui facilite considérablement le développement avec Kubernetes et Cloud Run.

Voici quelques fonctionnalités de Cloud Code :

  • Créer et exécuter des applications en continu
  • Débogage de votre application Kubernetes en cours de développement
  • Lecture en streaming et affichage des journaux

En savoir plus sur les autres fonctionnalités de Cloud Code

Objectifs de l'atelier

Dans cet atelier, vous allez découvrir des méthodes de développement avec des conteneurs dans GCP, y compris :

  • Examiner Cloud Workstations
  • Lancer la station de travail
  • Examiner Cloud Code
  • Déboguer sur Kubernetes

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pouvez le modifier à tout moment.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID du projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300$.

Configuration de l'environnement

Dans Cloud Shell, définissez l'ID et le numéro de votre projet. Enregistrez-les en tant que variables PROJECT_ID et PROJECT_ID.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

Dans cet atelier, vous allez déployer du code sur GKE. Vous utiliserez également Cloud Workstations comme IDE.

Le script de configuration ci-dessous prépare cette infrastructure pour vous.

  1. Téléchargez le script d'installation et rendez-le exécutable.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
  1. Ouvrez le fichier setup_with_cw.sh et modifiez les valeurs des mots de passe actuellement définis sur "CHANGEME".
  2. Exécutez le script de configuration pour créer un cluster GKE que vous utiliserez dans cet atelier. Cette configuration prendra environ 20 minutes.
./setup_with_cw.sh &
  1. Ouvrez Cloud Workstations dans la console Cloud. Attendez que le cluster soit à l'état READY avant de passer aux étapes suivantes.
  2. Si votre session Cloud Shell a été déconnectée, cliquez sur "Se reconnecter", puis exécutez la commande gcloud CLI pour définir l'ID du projet. Avant d'exécuter la commande, remplacez l'ID de projet exemple ci-dessous par l'ID de votre projet Qwiklabs.
gcloud config set project qwiklabs-gcp-project-id
  1. Téléchargez et exécutez le script ci-dessous dans le terminal pour créer la configuration Cloud Workstations.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh

Cluster et configuration Cloud Workstations

Ouvrez Cloud Workstations dans la console Cloud. Vérifiez que le cluster est à l'état READY.

305e1a3d63ac7ff6.png

Vérifiez l'état des configurations existantes.

2e23c2e9983d1ccf.png

Créez une station de travail.

a53adeeac81a78c8.png

Remplacez le nom par my-workstation et sélectionnez la configuration existante : codeoss-python.

f052cd47701ec774.png

Lancer la station de travail

  1. Démarrez et lancez la station de travail. Le démarrage de la station de travail prend quelques instants.

682f8a307032cba3.png

  1. Autorisez les cookies tiers en cliquant sur l'icône dans la barre d'adresse. 1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

  1. Cliquez sur "Impossible d'accéder au site ?".

36a84c0e2e3b85b.png

  1. Cliquez sur "Autoriser les cookies".

2259694328628fba.png

  1. Une fois la station de travail lancée, l'IDE Code OSS s'affiche.

Cliquez sur "Marquer comme terminé" sur la page "Premiers pas" de l'IDE de la station de travail.

94874fba9b74cc22.png

3. Présentation de Cloud Code

Examiner les différentes sections disponibles dans Cloud Code

  • Développement Kubernetes Profitez d'un environnement de développement et de débogage Kubernetes entièrement intégré à votre IDE. Créez et gérez les clusters directement depuis votre IDE.
  • Déboguez les applications en cours d'exécution. Déboguez le code directement dans vos IDE avec Cloud Code pour VS Code et Cloud Code pour IntelliJ grâce aux fonctionnalités de débogage IDE intégrées.
  • Explorez les déploiements. Consultez les ressources et les métadonnées sous-jacentes pour vos clusters Kubernetes et vos services Cloud Run. Vous pouvez extraire une description, consulter les journaux, gérer les secrets ou injecter un terminal directement dans un pod.
  • Simplifiez le développement local de Kubernetes. En coulisses, Cloud Code pour les IDE utilise des outils populaires tels que Skaffold, Jib et Kubectl pour vous offrir un retour continu et en temps réel sur votre code.

e4e89eea9ff45dff.png

Se connecter à Google Cloud

  1. Cliquez sur l'icône Cloud Code, puis sélectionnez "Se connecter à Google Cloud" :

1769afd39be372ff.png

  1. Cliquez sur "Continuer".

923bb1c8f63160f9.png

  1. Vérifiez le résultat dans le terminal et ouvrez le lien :

517fdd579c34aa21.png

  1. Connectez-vous avec vos identifiants Qwiklabs pour les étudiants.

db99b345f7a8e72c.png

  1. Sélectionnez "Autoriser" :

a5376553c430ac84.png

  1. Copiez le code de validation et revenez à l'onglet "Poste de travail".

6719421277b92eac.png

  1. Collez le code de validation, puis appuyez sur Entrée.

e9847cfe3fa8a2ce.png

Si ce message s'affiche, cliquez sur le bouton "Autoriser" pour pouvoir copier et coller le texte dans la station de travail.

58149777e5cc350a.png

4. Créer une application de démarrage Python

Dans cette section, vous allez créer une application Python.

  1. Ouvrez un nouveau terminal.

c31d48f2e4938c38.png

  1. Créer un répertoire et l'ouvrir en tant qu'espace de travail
mkdir music-service && cd music-service

code-oss-cloud-workstations -r --folder-uri="$PWD"
  1. Créez un fichier nommé requirements.txt et copiez-y le contenu suivant :

789e8389170bd900.png

Flask
gunicorn
ptvsd==4.3.2
  1. Créez un fichier nommé app.py et collez-y le code suivant :
import os
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/")
def hello_world():
    message="Hello, World!"
    return message

if __name__ == '__main__':
    server_port = os.environ.get('PORT', '8080')
    app.run(debug=False, port=server_port, host='0.0.0.0')

  1. Créez un fichier nommé Dockerfile et collez-y le code suivant :
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]

Remarque : FLASK_DEBUG=1 vous permet de recharger automatiquement les modifications de code dans une application Python Flask. Ce Dockerfile vous permet de transmettre cette valeur en tant qu'argument de compilation.

Générer des fichiers manifestes

Dans votre terminal, exécutez la commande suivante pour générer un skaffold.yaml et un deployment.yaml par défaut.

  1. Initialisez Skaffold à l'aide de la commande suivante :
skaffold init --generate-manifests

Lorsque vous y êtes invité, utilisez les flèches pour déplacer le curseur et la barre d'espace pour sélectionner les options.

Choisissez :

  • 8080 pour le port
  • y pour enregistrer la configuration

Mettre à jour les configurations Skaffold

  • Modifier le nom de l'application par défaut
  • Ouvrir skaffold.yaml
  • Sélectionnez le nom de l'image actuellement défini sur dockerfile-image.
  • Effectuez un clic droit et sélectionnez "Modifier toutes les occurrences".
  • Saisissez le nouveau nom, par exemple python-app.
  • Modifiez la section "build" pour
  • Ajouter docker.buildArgs à la carte FLASK_DEBUG=1
  • Synchroniser les paramètres pour charger les modifications apportées aux fichiers *.py de l'IDE au conteneur en cours d'exécution

Après les modifications, la section de compilation du fichier skaffold.yaml se présente comme suit :

build:
 artifacts:
 - image: python-app
   docker:
     buildArgs:
       FLASK_DEBUG: "1"
     dockerfile: Dockerfile
   sync:
     infer:
     - '**/*.py'

Modifier le fichier de configuration Kubernetes

  1. Modifier le nom par défaut
  • Ouvrir le fichier deployment.yaml
  • Sélectionnez le nom de l'image actuellement défini sur dockerfile-image.
  • Effectuez un clic droit et sélectionnez "Modifier toutes les occurrences".
  • Saisissez le nouveau nom, par exemple python-app.

5. Parcourir le processus de développement

Maintenant que la logique métier est ajoutée, vous pouvez déployer et tester votre application. La section suivante montre comment utiliser le plug-in Cloud Code. Ce plug-in s'intègre, entre autres, à skaffold pour simplifier votre processus de développement. Lorsque vous déployez sur GKE lors des étapes suivantes, Cloud Code et Skaffold créent automatiquement votre image de conteneur, la transfèrent vers Container Registry, puis déploient l'application your sur GKE. Cela se produit en arrière-plan, en masquant les détails du flux de développement.

Ajouter un cluster Kubernetes

  1. Ajouter un cluster

62a3b97bdbb427e5.png

  1. Sélectionnez Google Kubernetes Engine :

9577de423568bbaa.png

  1. Sélectionnez un projet.

c5202fcbeebcd41c.png

  1. Sélectionnez "python-cluster" créé lors de la configuration initiale.

719c2fc0a7f9e84f.png

  1. Le cluster apparaît désormais dans la liste des clusters Kubernetes sous Cloud Code. À partir de là, parcourez et explorez le cluster.

7e5f50662d4eea3c.png

Déployer sur Kubernetes

  1. Dans le volet situé au bas de l'éditeur Cloud Shell, sélectionnez Cloud Code .

d99a88992e15fea9.png

  1. Dans le panneau qui s'affiche en haut, sélectionnez Exécuter sur Kubernetes.

Si vous y êtes invité, sélectionnez "Oui" pour utiliser le contexte Kubernetes actuel.

bfd65e9df6d4a6cb.png

Cette commande compile le code source, puis exécute les tests. L'exécution de la compilation et des tests prend quelques minutes. Ces tests incluent des tests unitaires ainsi qu'une étape de validation qui vérifie les règles définies pour l'environnement de déploiement. Cette étape de validation est déjà configurée. Elle vous permet d'être averti en cas de problème de déploiement, même lorsque vous travaillez toujours dans votre environnement de développement.

  1. La première fois que vous exécutez la commande, une invite s'affiche en haut de l'écran pour vous demander si vous souhaitez utiliser le contexte Kubernetes actuel. Sélectionnez "Oui" pour accepter et utiliser le contexte actuel.
  2. Une invite s'affiche ensuite pour vous demander quel registre de conteneurs utiliser. Appuyez sur Entrée pour accepter la valeur par défaut fournie.
  3. Sélectionnez l'onglet "Sortie" dans le volet inférieur pour afficher la progression et les notifications. Dans le menu déroulant, sélectionnez "Kubernetes: Run/Debug" (Kubernetes : exécuter/déboguer).

9c87ccbf5d06f50a.png

  1. Sélectionnez "Kubernetes: Run/Debug - Detailed" (Kubernetes : Exécuter/Déboguer – Détails) dans le menu déroulant à droite pour afficher des informations supplémentaires et les journaux diffusés en direct depuis les conteneurs.

804abc8833ffd571.png

Une fois la compilation et les tests terminés, l'URL http://localhost:8080 s'affiche dans les journaux de l'onglet "Sortie" de la vue "Kubernetes : Exécuter/Déboguer".

  1. Dans le terminal Cloud Code, pointez sur la première URL de la sortie (http://localhost:8080), puis sélectionnez "Ouvrir l'aperçu sur le Web" dans l'info-bulle qui s'affiche.
  2. Un nouvel onglet de navigateur s'ouvre et affiche le message suivant : Hello, World!

Hot reload

  1. Ouvrez le fichier app.py.
  2. Modifie le message d'accueil en Hello from Python

Vous remarquerez immédiatement que, dans la fenêtre Output, vue Kubernetes: Run/Debug, le détecteur synchronise les fichiers mis à jour avec le conteneur dans Kubernetes.

Update initiated
Build started for artifact python-app
Build completed for artifact python-app

Deploy started
Deploy completed

Status check started
Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress
Resource deployment/python-app status updated to In Progress
Resource deployment/python-app status completed successfully
Status check succeeded
...
  1. Si vous passez à la vue Kubernetes: Run/Debug - Detailed, vous remarquerez qu'elle reconnaît les modifications apportées aux fichiers, puis compile et redéploie l'application.
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
  1. Actualisez l'onglet de votre navigateur dans lequel vous avez vu les résultats précédents pour afficher les résultats mis à jour.

Débogage

  1. Accédez à la vue Déboguer et arrêtez le thread actuel 647213126d7a4c7b.png. Si vous y êtes invité, vous pouvez choisir de nettoyer après chaque exécution.
  2. 70d6bd947d04d1e6.png
  3. Cliquez sur Cloud Code dans le menu du bas, puis sélectionnez Debug on Kubernetes pour exécuter l'application en mode debug.

b9465c6825caf685.png

  • Dans la vue Kubernetes Run/Debug - Detailed de la fenêtre Output, notez que Skaffold déploie cette application en mode débogage.
  1. La première fois que vous exécutez cette commande, une invite vous demande où se trouve la source dans le conteneur. Cette valeur est liée aux répertoires du fichier Dockerfile.

Appuyez sur Entrée pour accepter la valeur par défaut.

fccc866f32b5ed86.png

La création et le déploiement de l'application prennent quelques minutes. Si la session de débogage est déconnectée, réexécutez les étapes de la section "Déboguer sur Kubernetes" de la section "Sessions de développement".

  1. Lorsque le processus est terminé. Vous remarquerez qu'un débogueur est associé et que l'onglet "Output" (Sortie) indique Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully., et que l'URL http://localhost:8080 est listée.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
  1. La couleur de la barre d'état inférieure passe du bleu à l'orange, ce qui indique qu'elle est en mode Débogage.

b2abd61a129ed76.png

  1. Dans la vue Kubernetes Run/Debug, notez qu'un conteneur débogable est démarré.
**************URLs*****************
Forwarded URL from service python-app: http://localhost:8080
Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default)
Update succeeded
***********************************

Utiliser les points d'arrêt

  1. Ouvrez le fichier app.py.
  2. Recherchez l'instruction return message.
  3. Ajoutez un point d'arrêt à cette ligne en cliquant sur l'espace vide à gauche du numéro de ligne. Un indicateur rouge s'affiche pour indiquer que le point d'arrêt est défini.
  4. Rechargez votre navigateur et notez que le débogueur arrête le processus au point d'arrêt et vous permet d'examiner les variables et l'état de l'application qui s'exécute à distance dans GKE.
  5. Cliquez sur la section "VARIABLES".
  6. Cliquez sur "Locals" (Variables locales), puis recherchez la variable "message".
  7. Double-cliquez sur le nom de la variable "message", puis, dans le pop-up, remplacez la valeur par une autre valeur, par exemple "Greetings from Python".
  8. Cliquez sur le bouton "Continuer" dans le panneau de configuration du débogage 607c33934f8d6b39.png.
  9. Examinez la réponse dans votre navigateur. Elle affiche désormais la valeur modifiée que vous venez de saisir.
  10. Arrêtez le mode "Débogage" en appuyant sur le bouton d'arrêt 647213126d7a4c7b.png, puis supprimez le point d'arrêt en cliquant à nouveau dessus.

6. Nettoyage

Félicitations ! Dans cet atelier, vous avez créé une application Python à partir de zéro et l'avez configurée pour qu'elle fonctionne efficacement avec les conteneurs. Vous avez ensuite déployé et débogué votre application sur un cluster GKE distant en suivant le même flux de développement que celui utilisé dans les piles d'applications traditionnelles.

Pour effectuer le nettoyage une fois l'atelier terminé :

  1. Supprimer les fichiers utilisés dans l'atelier
cd ~ && rm -rf ~/music-service
  1. Supprimer le projet pour supprimer toute l'infrastructure et les ressources associées

Dernière mise à jour : 22/03/2023