IBM Cloud Docs
Déplacement vers Kubernetes d'une application basée sur une machine virtuelle

Déplacement vers Kubernetes d'une application basée sur une machine virtuelle

Ce tutoriel peut entraîner des coûts. Utilisez l'Estimateur de coûts pour générer une estimation du coût en fonction de votre utilisation projetée.

Ce tutoriel vous guide dans le processus de déplacement d'une application basée sur une machine virtuelle vers un cluster Kubernetes à l'aide de Kubernetes Service. Kubernetes Service fournit des outils puissants en combinant les technologies de conteneur et de Kubernetes, une expérience utilisateur intuitive, et une sécurité et une isolation intégrées pour automatiser le déploiement, l'opération, la mise à l'échelle et la surveillance des applications conteneurisées dans un cluster d'hôtes de traitement.

Les leçons de ce tutoriel incluent des concepts sur la manière d'utiliser une application existante, de la conteneuriser et de la déployer dans un cluster Kubernetes. Pour conteneuriser votre application basée sur une machine virtuelle, vous pouvez choisir parmi les options suivantes.

  1. Identifier les composants d'une application monolithique qui peuvent être séparés dans leur propre microservice. Vous pouvez conteneuriser ces microservices et les déployer dans un cluster Kubernetes.
  2. Conteneurisez l'application complète et déployez-la dans un cluster Kubernetes.

La procédure de migration varie selon le type d'application. Vous pouvez utiliser ce tutoriel pour en savoir plus sur les étapes générales à suivre et les éléments à prendre en compte avant de migrer votre application.

Objectifs

  • Comprendre comment identifier les microservices dans une application basée sur une VM et apprendre à mapper les composants entre les VM et Kubernetes.
  • Apprendre à conteneuriser une application basée sur une machine virtuelle.
  • Découvrir comment déployer le conteneur dans un cluster Kubernetes dans Kubernetes Service.
  • Mettre en pratique toutes vos nouvelles connaissances et lancer l'application JPetStore dans votre cluster.

Architecture

Architecture d'application traditionnelle avec des machines virtuelles

Le diagramme suivant montre un exemple d'architecture d'application traditionnelle basée sur des machines virtuelles.

Diagramme de l'architecture traditionnelle de l'application*Diagramme de l'
du

  1. L'utilisateur envoie une demande au noeud final public de l'application. Le noeud final public est représenté par un service d'équilibrage de la charge qui équilibre le trafic réseau entrant entre les instances de serveur d'applications disponibles.
  2. L'équilibreur de charge sélectionne l'une des instances de serveur d'applications saines qui s'exécutent sur une machine virtuelle et transmet la demande. Les fichiers de l'application, tels que le code de l'application, les fichiers de configuration et les dépendances, sont stockés sur la VM du serveur d'application.
  3. Le serveur d'application stocke les données de l'application dans une base de données MySQL qui s'exécute sur une VM de base de données.

Architecture conteneurisée

Le diagramme suivant montre un exemple d'architecture de conteneur moderne qui s'exécute dans un cluster Kubernetes.

Diagramme d'une architecture de conteneur moderne
Diagramme d'une architecture de conteneur moderne

  1. L'utilisateur envoie une demande au noeud final public de l'application. Le noeud final public est représenté par un équilibreur de charge d'application (Application Load Balancer - ALB) Ingress qui équilibre la charge du trafic réseau entrant entre les pods d'application dans le cluster. L'ALB est un ensemble de règles permettant le trafic réseau entrant vers une application exposée publiquement.
  2. L'ALB transmet la demande à l'un des pods d'application disponibles dans le cluster. Les pods d'application s'exécutent sur des noeuds worker pouvant être une machine virtuelle ou physique.
  3. Les pods d'application stockent les données dans des volumes persistants. Les volumes persistants peuvent être utilisés pour partager des données entre des instances d'application ou des noeuds worker.
  4. Les pods d'application stockent les données dans un service de base de données IBM Cloud. Vous pouvez exécuter votre propre base de données dans le cluster Kubernetes, mais une base de données gérée en tant que service (DBaaS) est généralement plus facile à configurer et offre des sauvegardes et une mise à l'échelle intégrées. Vous pouvez trouver de nombreux types de bases de données dans le catalogueIBM Cloud.

Machines virtuelles, conteneurs et Kubernetes

Kubernetes Service permet d'exécuter des applications conteneurisées dans des clusters Kubernetes et fournit les outils et les fonctions suivants :

  • Une expérience utilisateur intuitive et des outils puissants.
  • Sécurité et isolation intégrées pour permettre la livraison rapide d'applications sécurisées.
  • Des services cloud qui intègrent les capacités cognitives d' IBM® Watson™.
  • Possibilité de gérer des ressources de cluster dédiées pour les applications sans état et les charges de travail avec état.

Machines virtuelles et conteneurs

Les machines virtuelles (VM) et les applications traditionnelles s'exécutent sur un équipement natif. Une application n'utilise généralement pas toutes les ressources d'un hôte de calcul. La plupart des entreprises essaient d'exécuter plusieurs applications sur un seul hôte de calcul afin d'éviter de gaspiller des ressources. Vous pouvez exécuter plusieurs copies d'une même application, mais pour obtenir un isolement, vous pouvez utiliser des machines virtuelles pour exécuter plusieurs instances d'application (VM) sur le même équipement. Ces machines virtuelles ont des piles de systèmes d'exploitation complètes qui les rendent relativement inefficaces en raison de la duplication à la fois au moment de l'exécution et sur le disque.

Les conteneurs constituent un moyen standard de conditionner des applications et toutes leurs dépendances. Ainsi, vous pouvez déplacer en toute transparence des applications entre divers environnements. A la différence des machines virtuelles, les conteneurs n'incluent pas le système d'exploitation. Seuls le code d'application, l'environnement d'exécution, les outils système, les bibliothèques et les paramètres sont inclus dans les conteneurs. Les conteneurs sont plus légers, plus portables et plus efficaces que les machines virtuelles.

De plus, les conteneurs vous permettent de partager le système d'exploitation de l'hôte. Vous réduisez ainsi les doublons tout en conservant l'isolement. Les conteneurs vous permettent également de supprimer des fichiers inutiles, tels que les bibliothèques système et les fichiers binaires, afin d'économiser de l'espace et de réduire la surface d'attaque. Pour en savoir plus sur les machines virtuelles et les conteneurs, voir Que sont les conteneurs?.

Orchestration Kubernetes

Kubernetes est un orchestrateur de conteneurs qui permet de gérer le cycle de vie des applications conteneurisées dans un cluster de nœuds de travail. Vos applications peuvent nécessiter de nombreuses autres ressources pour s'exécuter, telles que des volumes, des réseaux et des secrets qui vous aideront à vous connecter à d'autres services cloud, ainsi que des clés sécurisées. Kubernetes vous aide à ajouter ces ressources à votre application. Le paradigme essentiel de Kubernetes est son modèle déclaratif. L'utilisateur indique l'état souhaité et Kubernetes tente de s'y conformer, puis conserve l'état décrit.

Cet atelier Kubernetes à son rythme peut vous aider à acquérir une première expérience pratique avec Kubernetes. En outre, consultez la page de documentation Kubernetes concepts pour en savoir plus sur les concepts de Kubernetes.

Ce qu' IBM fait pour vous

En utilisant les clusters Kubernetes avec IBM Cloud Kubernetes Service, vous bénéficiez des avantages suivants :

  • Plusieurs centres de données où vous pouvez déployer vos clusters.
  • Prise en charge des options réseau d'intrusion et d'équilibrage de charge.
  • Prise en charge des volumes persistants dynamiques.
  • Serveurs maîtres Kubernetes gérés par IBM, à haute disponibilité.

Dimensionnement des clusters

Lorsque vous concevez votre architecture de cluster, vous souhaitez équilibrer les coûts avec la disponibilité, la fiabilité, la complexité et les capacités de reprise. Les clusters Kubernetes dans IBM Cloud Kubernetes Service fournissent des options d'architecture basées sur les besoins de vos applications. Avec un minimum de planification, vous pouvez tirer le meilleur parti de vos ressources cloud sans architecture ni coûts excessifs. Même en cas de surestimation ou de sous-estimation, vous pouvez facilement augmenter ou réduire votre cluster en modifiant le nombre ou la nature des nœuds de travail.

Pour exécuter une application de production dans le cloud à l'aide de Kubernetes, posez-vous les questions suivantes :

  1. Prévoyez-vous du trafic à partir d'un emplacement géographique spécifique ? Dans l'affirmative, sélectionnez l'emplacement le plus proche de vous pour obtenir des performances optimales.
  2. Combien de répliques de cluster souhaitez-vous pour obtenir une disponibilité accrue ? Vous pourriez commencer avec trois clusters : un pour le développement, un pour les tests et un pour la production. Consultez le guide de solution Meilleures pratiques pour l'organisation des ressources et l'affectation d'accès pour la création de plusieurs environnements.
  3. Quel est l'équipement nécessaire pour les noeuds worker ? Machines virtuelles ou bare metal ?
  4. Combien de noeuds worker sont-ils nécessaires ? Cela dépend fortement de l'échelle des applications, plus vous disposez de noeuds, plus votre application sera résiliente.
  5. Combien de répliques sont-elles nécessaires pour une disponibilité plus élevée ? Déployez des clusters de répliques dans plusieurs emplacements afin de rendre votre application plus disponible et de la protéger des pannes dues à une défaillance sur un emplacement donné.
  6. Quel est l'ensemble minimal de ressources dont votre application a besoin pour démarrer ? Vous pouvez tester votre application pour déterminer la quantité de mémoire et d'unité centrale requise pour son exécution. Le noeud worker devrait alors disposer de suffisamment de ressources pour déployer et démarrer l'application. Assurez-vous ensuite de définir des quotas de ressources dans les spécifications du pod. Ce paramètre est utilisé par Kubernetes pour sélectionner (ou planifier) un noeud worker doté d'une capacité suffisante pour prendre en charge la demande. Estimez le nombre de pods qui s'exécuteront sur le noeud worker et les ressources nécessaires pour ces pods.
  7. Quand faut-il augmenter le nombre de nœuds de travail ? Vous pouvez surveiller l'utilisation du cluster et ajouter des noeuds si nécessaire. Voir Surveillance de l'état des clusters.
  8. Un stockage redondant et fiable est-il nécessaire ? Si oui, créez un volume persistant pour le stockage NFS ou liez un service de base de données IBM Cloud à votre pod.
  9. Avez-vous besoin de déployer un cluster sur une infrastructure de cloud privé virtuel ou dans l'infrastructure classique ? Un VPC vous offre la sécurité d'un environnement de cloud privé avec l'évolutivité dynamique d'un cloud public.

Pour rendre les étapes précédentes plus spécifiques, supposons que vous souhaitiez exécuter une application web de production dans le nuage et que vous vous attendiez à une charge de trafic modérée à élevée. Examinons les ressources dont vous auriez besoin :

  1. Configurez trois clusters : un pour le développement, un pour les tests et un pour la production.
  2. Les clusters de développement et de test peuvent démarrer avec un minimum de RAM et de CPU (par exemple 2 CPU, 4GB de RAM et un worker node pour chaque cluster).
  3. Pour le cluster de production, vous pouvez disposer de davantage de ressources à des fins de performances, de haute disponibilité et de résilience. Nous pourrions choisir une option dédiée ou même bare metal et disposer d'au moins 4 CPU, 16GB RAM et deux nœuds de travail.

Choix de l'option de base de données à utiliser

Avec Kubernetes, vous disposez de deux options pour gérer les bases de données :

  1. Vous pouvez exécuter votre base de données dans le cluster Kubernetes. Pour ce faire, vous devez créer un microservice pour exécuter la base de données. Par exemple, si vous utilisez une base de données MySQL, il vous faudra procéder comme suit :
    • Créer un fichier Docker MySQL, voir un exemple de fichier Docker MySQL ici.
    • Vous devez utiliser des secrets pour stocker les données d'identification de la base de données. Voir l'exemple de cette ici.
    • Un fichier deployment.yaml contenant la configuration de votre base de données est nécessaire pour effectuer le déploiement sur Kubernetes. Voir l'exemple de cette ici.
  2. La deuxième option consiste à utiliser l'option de base de données gérée en tant que service (DBaaS). Cette option est généralement plus facile à configurer et fournit des sauvegardes et une mise à l'échelle intégrées. Vous pouvez trouver de nombreux types de bases de données dans le catalogueIBM Cloud. Pour utiliser cette option, procédez comme suit :
    • Créez une base de données gérée en tant que service (DBaaS) à partir du Catalogue IBM Cloud.
    • Stockez les données d'identification de la base de données dans un secret. Vous en apprendrez plus sur les secrets dans la section Store credentials in Kubernetes secrets.
    • Utilisez la base de données en tant que service (DBaaS) dans votre application.

Choix de l'emplacement de stockage des fichiers d'application

Kubernetes Service fournit plusieurs options pour stocker et partager des données sur les pods. Toutes les options de stockage n'offrent pas le même niveau de persistance et de disponibilité en cas d'incident.

Stockage de données non persistant

De par leur conception, les conteneurs ont une durée de vie brève et ne sont pas à l'abri de défaillances inattendues. Vous pouvez stocker des données dans le système de fichiers local d'un conteneur. Les données hébergées au sein d'un conteneur ne peuvent pas être partagées avec d'autres conteneurs ou pods et sont perdues en cas de panne ou de suppression du conteneur.

Création d'un stockage de données persistant pour votre application

Vous pouvez persister les données de l'app et les données du conteneur sur un stockage de fichiers NFS ou un stockage en bloc en utilisant les volumes persistants natifs de Kubernetes.

Pour mettre à disposition le stockage de fichiers NFS ou le stockage par blocs, vous devez demander le stockage de votre pod en créant une réservation de volume persistant (Persistent Volume Claim - PVC). Dans votre PVC, vous pouvez choisir parmi des classes de stockage prédéfinies qui définissent le type de stockage, la capacité de stockage en gigaoctets, l'IOPS, la politique de conservation des données et les autorisations de lecture et d'écriture pour votre stockage. Une PVC met à disposition de manière dynamique un volume persistant (PV) qui représente une unité de stockage réel dans IBM Cloud. Vous pouvez monter la PVC sur votre pod pour lire et écrire sur le PV. Les données stockées dans les PV sont disponibles, même si le conteneur se bloque ou si le pod est replanifié. Le stockage de fichiers NFS et le stockage en bloc qui soutient le PV sont mis en cluster par IBM pour assurer la haute disponibilité de vos données.

Pour apprendre à créer une PVC, effectuez les étapes décrites dans la documentation sur le stockage d'Kubernetes Service.

Déplacement de données existantes vers un stockage persistant

Pour copier des données de votre machine locale vers le stockage persistant, vous devez monter la PVC sur un pod. Ensuite, vous pouvez copier les données de votre machine locale vers le volume persistant de votre pod.

  1. Pour copier des données, vous devez d'abord créer une configuration qui ressemble à ce qui suit :

    kind: Pod
    apiVersion: v1
    metadata:
      name: task-pv-pod
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
           claimName: mypvc
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage
    
  2. Ensuite, pour copier les données de votre machine locale vers le pod, utilisez une commande similaire à celle-ci :

     kubectl cp <local_filepath>/<filename> <namespace>/<pod>:<pod_filepath>
    
  3. Copiez les données d'un pod de votre cluster vers votre machine locale :

    kubectl cp <namespace>/<pod>:<pod_filepath>/<filename> <local_filepath>/<filename>
    

Configuration de sauvegardes du stockage persistant

Les partages de fichiers et le stockage par blocs sont mis à disposition au même emplacement que votre cluster. Le stockage même est hébergé sur des serveurs en cluster par IBM pour assurer une haute disponibilité. Cependant, les partages de fichiers et le stockage par blocs ne sont pas sauvegardés automatiquement et risquent d'être inaccessibles en cas de défaillance de l'emplacement global. Pour éviter que vos données ne soient perdues ou endommagées, vous pouvez configurer des sauvegardes périodiques que vous pouvez utiliser pour restaurer vos données en cas de besoin.

Pour plus d'informations, voir Planification du stockage options for NFS file storage and block storage.

Préparation du code

Application des principes des 12 facteurs

L' application à douze facteurs est une méthodologie de construction d'applications natives pour le cloud. Lorsque vous souhaitez conteneuriser une application, la déplacer vers le cloud et l'orchestrer avec Kubernetes, il est important de comprendre et d'appliquer certains de ces principes. Certains de ces principes sont nécessaires dans IBM Cloud.

Les principes clés suivants sont requis:

  • Base de code - Tous les fichiers de code source et de configuration sont suivis dans un système de contrôle de version (par exemple, un référentiel GIT), ce qui est nécessaire si vous utilisez le pipeline DevOps pour le déploiement.
  • Générer, publier, exécuter - L'application à 12 facteurs utilise une séparation stricte entre les étapes de génération, de publication et d'exécution. Cette opération peut être automatisée avec un pipeline de distribution DevOps intégré pour générer et tester l'application avant de la déployer dans le cluster. Consultez le tutoriel Déployer une application sur Kubernetes pour apprendre à configurer un pipeline d'intégration et de distribution en continu. Il couvre la mise en place du contrôle des sources, les étapes de construction, de test et de déploiement et vous montre comment ajouter des intégrations telles que des scanners de sécurité, des notifications et des analyses.
  • Config - Toutes les informations de configuration sont stockées dans des variables d'environnement. Il n'y a pas de données d'identification de service codées en dur dans le code de l'application. Pour stocker les données d'identification, vous pouvez utiliser les secrets Kubernetes. Plus d'informations sur les données d'identification ultérieurement.

Stockage des données d'identification dans les secrets Kubernetes

Ce n'est jamais une bonne pratique de stocker des données d'identification dans le code de l'application. Au lieu de cela, Kubernetes fournit ce que l'on appelle des "secrets" qui contiennent des informations sensibles, telles que des mots de passe, des jetons OAuth ou des clés SSH. Les secrets Kubernetes sont chiffrés par défaut ; il s'agit donc d'une option plus sûre et plus flexible pour stocker des données sensibles que le stockage de ces données en l'état dans une définition de pod ou dans une image de conteneur.

Une façon d'utiliser des secrets à Kubernetes est de faire quelque chose comme ceci :

  1. Créez un fichier nommé cloud-secrets.txt et stockez les données d'identification de tout service cloud dans ce fichier.

    {
        "url": "<SERVICE_URL>",
        "api_key": <API_Key>
    }
    
  2. Ensuite, créez un secret Kubernetes en exécutant la commande suivante et vérifiez que le secret est créé en utilisant kubectl get secrets après avoir exécuté la commande suivante :

    kubectl create secret generic cloud-service-secret --from-file=cloud-secrets.txt=./cloud-secrets.txt
    

Conteneurisation de votre application

Pour conteneuriser votre application, vous devez créer une image de conteneur.

Une image est créée à partir d'un Dockerfile, qui est un fichier contenant des instructions et des commandes pour construire l'image. Un Dockerfile peut référencer dans ses instructions des artefacts de génération stockés séparément, comme une application, sa configuration, et ses dépendances.

Pour créer votre propre fichier Docker pour votre application existante, vous pouvez utiliser les commandes suivantes :

  • FROM - Choisissez une image parent pour définir l'exécution du conteneur.
  • ADD/COPY - Copiez le contenu d'un répertoire dans le conteneur.
  • WORKDIR - Définissez le répertoire de travail à l'intérieur du conteneur.
  • RUN - Installez les packages logiciels dont les applications ont besoin pendant l'exécution.
  • EXPOSE - Créez un port disponible à l'extérieur du conteneur.
  • ENV NAME - Définissez les variables d'environnement.
  • CMD - Définissez les commandes à exécuter lors du lancement du conteneur.

Les images sont généralement stockées dans un registre qui peut être accessible au public (registre public) ou configuré avec un accès limité pour un groupe d'utilisateurs (registre privé). Des registres publics, tel que Docker Hub, peuvent être utilisés pour vous familiariser avec Docker et Kubernetes pour créer votre première application conteneurisée dans un cluster. Toutefois, en ce qui concerne les applications d'entreprise, utilisez un registre privé, comme celui fourni dans IBM Cloud Container Registry, pour protéger vos images contre l'utilisation et la modification par des utilisateurs non autorisés.

Pour conteneuriser une application et la stocker dans IBM Cloud Container Registry :

  1. Vous devez créer un fichier Docker, le code suivant est un exemple de fichier Docker.
    # Build JPetStore war
    FROM openjdk:8 as builder
    COPY . /src
    WORKDIR /src
    RUN ./build.sh all
    
    # Use WebSphere Liberty base image from the Docker Store
    FROM websphere-liberty:latest
    
    # Copy war from build stage and server.xml into image
    COPY --from=builder /src/dist/jpetstore.war /opt/ibm/wlp/usr/servers/defaultServer/apps/
    COPY --from=builder /src/server.xml /opt/ibm/wlp/usr/servers/defaultServer/
    RUN mkdir -p /config/lib/global
    COPY lib/mysql-connector-java-3.0.17-ga-bin.jar /config/lib/global
    
  2. Une fois le fichier Docker créé, vous devez générer l'image de conteneur et la transmettre à IBM Cloud Container Registry. Vous pouvez générer un conteneur à l'aide d'une commande semblable à :
    docker build . -t <image_name>
    docker push <image_name>
    

Déploiement de votre application dans un cluster Kubernetes

Une fois qu'une image de conteneur est générée et transférée dans le cloud, vous devez effectuer un déploiement sur votre cluster Kubernetes. Pour ce faire, vous devez créer un fichier deployment.yaml.

Création d'un fichier Kubernetes deployment.yaml

Pour créer des fichiers Kubernetes deployment.yaml, vous devez procéder de la manière suivante :

  1. Créer un fichier deployment.yaml, voici un exemple de fichier YAML de déploiement.

  2. Dans votre fichier deployment.yaml, vous pouvez définir des quotas de ressources pour vos conteneurs afin de spécifier la quantité de CPU et de mémoire dont chaque conteneur a besoin pour démarrer correctement. Si des quotas de ressources sont spécifiés dans les conteneurs, le planificateur Kubernetes peut prendre de meilleures décisions concernant le noeud worker sur lequel vos pods doivent être placés.

  3. Ensuite, vous pouvez utiliser les commandes suivantes pour créer et visualiser le déploiement et les services créés :

    kubectl create -f <filepath/deployment.yaml>
    kubectl get deployments
    kubectl get services
    kubectl get pods
    

Summary

Dans ce tutoriel, vous avez appris :

  • Les différences entre les machines virtuelles, les conteneurs et Kubernetes.
  • Comment définir des clusters pour différents types d'environnement (développement, test et production).
  • Comment gérer le stockage de données et l'importance du stockage de données persistant.
  • Comment appliquer les principes des 12 facteurs à votre application et utiliser des secrets pour les données d'identification dans Kubernetes.
  • Comment générer des images de conteneur et les transmettre à IBM Cloud Container Registry.
  • Comment créer des fichiers de déploiement Kubernetes et déployer l'image de conteneur sur Kubernetes.

Mise en pratique de toutes vos nouvelles connaissances et exécution de l'application JPetStore dans votre cluster

Pour mettre en pratique tout ce que vous avez appris, suivez la démonstration pour lancer l'application JPetStore sur votre cluster et appliquer les concepts appris. L'application JPetStore possède des fonctionnalités enrichies vous permettant d'étendre une application dans Kubernetes en exécutant une classification des images en tant que microservice distinct.