CI / CD avec drone, Kubernetes et Helm – Partie 1 – leboncoin Engineering Blog

leboncoin

Par Paul Lhussiez (Développeur Backend Lab)

L'intégration et la livraison continues sont difficiles. C'est un fait sur lequel tout le monde peut s'entendre. Mais maintenant, nous avons toute cette merveilleuse technologie et les problèmes sont principalement «comment puis-je brancher ceci avec ça?» Ou «comment faire fonctionner ces deux produits ensemble?»

Eh bien, il y a jamais une réponse simple et universelle à ces questions. Dans cette série d'articles, nous allons progressivement construire un pipeline complet pour une intégration et une livraison continues en utilisant trois produits populaires, à savoir Kubernetes, Helm et Drone.

Ce premier article sert d'introduction aux différentes technologies utilisées tout au long de la série. Il est destiné aux débutants qui ont une certaine connaissance de Docker, comment fonctionne un conteneur et les bases de Kubernetes. Vous pouvez l'ignorer entièrement si vous avez un cluster k8s en cours d'exécution et une instance Drone en cours d'exécution.

CI / CD avec drone, Kubernetes et Helm - Partie 1 - leboncoin Engineering Blog 2
  • Créer un cluster Kubernetes avec GKE
  • Créer un compte de service pour Tiller
  • Initialiser le casque
  • Ajouter un dépôt à Helm
  • Déployer Drone sur le nouveau cluster k8s
  • Activez HTTPS sur notre nouvelle instance de drone

Drone est une plateforme de livraison continue construite sur Docker et écrite en Go. Drone utilise un simple fichier de configuration YAML, un sur-ensemble de docker-compose, pour définir et exécuter des pipelines à l'intérieur de conteneurs Docker.

Il a la même approche que Travis, où vous définissez votre pipeline comme code dans votre référentiel. La fonctionnalité intéressante est que chaque étape de votre pipeline est exécutée dans un conteneur Docker. Cela peut sembler contre-intuitif au premier abord, mais cela permet un excellent système de plugins: chaque plugin pour Drone que vous pourriez utiliser est une image Docker, que Drone tirera en cas de besoin. Vous n'avez rien à installer directement dans Drone comme vous le feriez avec Jenkins par exemple.

Un autre avantage de l'exécution dans Docker est que la procédure d'installation de Drone est vraiment simple. Mais nous n'allons pas installer Drone sur un serveur nu ou à l'intérieur d'une machine virtuelle. Plus d'informations à ce sujet plus loin dans le didacticiel.

Kubernetes (généralement stylisé sous le nom de K8) est un système open-source d'orchestration de conteneurs pour automatiser le déploiement, la mise à l'échelle et la gestion des applications conteneurisées qui a été initialement conçu par Google et maintenant géré par la Cloud Native Computing Foundation. Il vise à fournir une «plate-forme pour automatiser le déploiement, la mise à l'échelle et les opérations des conteneurs d'applications sur des clusters d'hôtes». Il fonctionne avec une gamme d'outils de conteneur, y compris Docker.
Wikipédia

Wikipedia résume assez bien les k8. Fondamentalement, k8s résume les machines sous-jacentes sur lesquelles il s'exécute et offre une plate-forme où nous pouvons déployer nos applications. Il est chargé de distribuer correctement nos conteneurs sur différents nœuds, donc si un nœud s'arrête ou est déconnecté du réseau, l'application est toujours accessible pendant que k8s travaille à réparer le nœud ou en provisionne un nouveau pour nous.

Je recommande au moins de lire les bases de Kubernetes pour ce tutoriel.

Helm est le gestionnaire de packages pour Kubernetes. Il nous permet de créer, maintenir et déployer des applications dans un cluster Kubernetes.

Fondamentalement, si vous souhaitez installer quelque chose dans votre cluster Kubernetes, vous pouvez vérifier s'il existe un graphique pour celui-ci. Par exemple, nous allons utiliser le Chart for Drone pour le déployer.

Helm vous permet de déployer votre application dans différents espaces de noms, de modifier la balise de votre image et de remplacer essentiellement tous les paramètres que vous pouvez placer dans vos fichiers de déploiement Kubernetes lors de son exécution. Cela signifie que vous pouvez utiliser le même graphique pour déployer votre application dans votre environnement de transfert et en production simplement en remplaçant certaines valeurs sur la ligne de commande ou dans un fichier de valeurs.

Dans cet article, nous verrons comment utiliser un graphique préexistant. Dans le prochain, nous verrons comment en créer un à partir de zéro.

Dans ce didacticiel, nous utiliserons Google Cloud Platform, car il permet de créer facilement des clusters Kubernetes et dispose d'un registre de conteneurs privé que nous utiliserons plus tard.

Vous pouvez ignorer cette étape si vous possédez déjà un cluster k8s avec une version Kubernetes supérieure à 1.8.

Dans cette étape, nous aurons besoin du et CLI. Découvrez comment installer le SDK Google Cloud pour votre système d'exploitation.

Comme indiqué précédemment, ce didacticiel ne concerne pas la création et la maintenance d'un cluster Kubernetes. En tant que tel, nous allons utiliser Google Kubernetes Engine pour créer notre cluster de terrains de jeux. Il existe deux options pour le créer: soit dans l'interface Web offerte par GCP, soit directement à l'aide du commander. Au moment de la rédaction du présent document, la version par défaut des k8 proposés par Google est mais tant que vous êtes au-dessus vous pouvez choisir la version que vous souhaitez. Même s'il n'y a aucune raison de ne pas choisir la version stable la plus élevée …

le le choix est parce que dans cette version RBAC est activé par défaut et est le système d'authentification par défaut.

Pour réduire le coût de votre cluster, vous pouvez modifier le type de machine, mais essayez de conserver au moins 3 nœuds; cela permettra des migrations sans temps d'arrêt vers différents types de machines et mettra à niveau la version k8s si vous souhaitez conserver ce cluster actif et en cours d'exécution.

Pour vérifier si votre cluster est en cours d'exécution, vous pouvez vérifier la sortie de la commande suivante:

Vous devriez également obtenir le , , et le que j'ai supprimé de cet extrait. Désormais dans les extraits de code et les exemples de ligne de commande, fera référence à l'emplacement de votre cluster, fera référence au nom de votre cluster, et fera référence à votre projet GCP.

Une fois votre cluster en cours d'exécution, vous pouvez ensuite exécuter la commande suivante pour récupérer les informations d'identification pour vous connecter à votre cluster:

À présent est configuré pour fonctionner sur votre cluster. La dernière commande imprimera toutes les informations dont vous avez besoin pour savoir où se trouve votre cluster.

Tout d'abord, nous aurons besoin du commander. Voir cette page pour les instructions d'installation.

Le casque est en fait composé de deux parties. Helm lui-même est le client et Tiller est le serveur. Tiller doit être installé dans notre cluster k8s pour que Helm puisse fonctionner avec lui, mais nous allons d'abord avoir besoin d'un compte de service pour Tiller. Tiller doit pouvoir interagir avec notre cluster k8s, il doit donc être capable de créer des déploiements, des cartes de configuration, des secrets, etc. Bienvenue à RBAC.

Créons donc un fichier nommé

Dans ce fichier yaml, nous déclarons un ServiceAccount nommé tiller, puis nous déclarons un ClusterRoleBinding qui associe le compte de service de tiller à l'autorisation d'administrateur de cluster.

Maintenant, nous pouvons déployer tiller en utilisant le compte de service que nous venons de créer comme ceci:

Notez que ce n'est pas nécessairement une bonne pratique de déployer tiller de cette façon. En utilisant RBAC, nous pouvons limiter les actions que Tiller peut exécuter dans notre cluster et les espaces de noms sur lesquels il peut agir. Consultez cette documentation pour savoir comment utiliser RBAC pour restreindre ou modifier le comportement de Tiller dans votre cluster k8s.

Cette étape est vraiment importante pour les parties suivantes de cette série, car nous utiliserons plus tard ce compte de service pour interagir avec les k8 de Drone.

Si vous avez un nom de domaine et souhaitez associer un sous-domaine à votre instance Drone, vous devrez créer une adresse IP externe dans votre console Google Cloud. Donnez-lui un nom et souvenez-vous de ce nom, nous l'utiliserons juste après lors de la configuration de la carte Drone.

Associez cette adresse IP statique à votre domaine (et gardez à l'esprit que la propagation DNS peut prendre un certain temps).

Pour les besoins de cet article, le nom de l'adresse IP externe sera et le domaine sera .

Nous devons d'abord configurer l'intégration Github pour notre instance Drone. Jetez un œil à cette documentation ou si vous utilisez un autre système de contrôle de version, vérifiez dans la documentation du Drone comment créer la bonne intégration. Actuellement, Drone prend en charge le VCS suivant:

N'oubliez pas que si vous n'utilisez pas l'intégration Github, les modifications des variables d'environnement dans la section suivante doivent correspondre.

Nous pouvons jeter un oeil à la partie configuration de ce graphique. Nous allons créer un fichier qui contiendra les informations requises pour que notre instance de drone fonctionne correctement.

Bien! Nous avons notre IP statique associée à notre domaine. Nous devons mettre le nom de cette adresse IP réservée dans les annotations Ingress afin qu'il sache à quelle adresse IP il doit se lier. Nous allons utiliser un équilibreur de charge GCE, et puisque nous n'avons pas de certificat TLS, nous allons dire à Ingress qu'il est acceptable d'accepter les connexions HTTP. (Veuillez ne pas me frapper, je vous promets que nous verrons comment activer TLS plus tard.)

Nous déclarons également toutes les variables utilisées par Drone lui-même pour communiquer avec notre VCS, dans ce cas Github.

C'est ça. Nous sommes prêts. Allumons Helm!

Étant donné que votre enregistrement DNS est maintenant propagé, vous devriez pouvoir accéder à votre instance de drone en utilisant le URL!

Dans le passé, nous avions kube-lego qui est maintenant obsolète au profit de cert-manager.

La documentation indique que l'installation de cert-manager est aussi simple que l'exécution de cette commande:

Cert-manager est composé de plusieurs composants. Il utilise ce qu'on appelle des définitions de ressources personnalisées et permet d'utiliser pour contrôler les certificats, les émetteurs, etc.

Un Issuer ou ClusterIssuer représente une autorité de certification auprès de laquelle des certificats x509 peuvent être obtenus.

La différence entre un émetteur et un ClusterIssuer est que l'émetteur ne peut gérer que les certificats dans son propre espace de noms et être appelé à partir de cet espace de noms. Le ClusterIssuer ne dépend pas d'un espace de noms spécifique.

Nous allons créer un Let’sEncrypt ClusterIssuer afin de pouvoir émettre un certificat pour notre instance Drone et pour nos futurs déploiements. Créons un fichier nommé :

Ici, nous créons le ClusterIssuer avec le défi HTTP activé. Nous ne verrons ce défi que dans cet article, reportez-vous à la documentation pour plus d'informations sur les défis. N'oubliez pas de changer l'adresse e-mail associée dans votre émetteur!

Nous pouvons également créer un ClusterIssuer à l'aide de l'environnement de transfert Let’sEncrypt qui est plus permissif avec des erreurs sur les demandes. Si vous souhaitez tester sans émettre de vrais certificats, utilisez celui-ci à la place. Créer un nouveau fichier :

Maintenant que notre ClusterIssuer utilise la production de Let’sEncrypt, nous pouvons créer un manifeste qui résoudra le défi ACME pour nous. Nous allons d'abord avoir besoin du nom de l'entrée créée par la carte Drone:

Maintenant que nous avons ces informations, créons le fichier:

Il y a de nombreux champs à expliquer ici. La plupart d'entre eux sont assez explicites et peuvent être trouvés dans la documentation sur la validation HTTP.

Les choses importantes ici sont:

  • : Le secret dans lequel le certificat sera stocké. Habituellement, cela sera préfixé par donc ça ne se mélange pas avec d'autres secrets.
  • : Le nom que nous avons défini plus tôt pour notre ClusterIssuer
  • : Spécifiez que l'émetteur est un ClusterIssuer
  • : Le nom de l'entrée déployée avec Drone

Appliquons maintenant ceci:

Nous devons attendre que cette dernière ligne apparaisse, le avant de pouvoir mettre à jour nos valeurs Ingress. Cela peut prendre un certain temps, soyez patient, car la mise à jour de Google Cloud Load Balancers peut prendre plusieurs minutes.

Maintenant que nous avons notre secret contenant le certificat TLS approprié, nous pouvons revenir à notre fichier que nous avons utilisé plus tôt pour déployer Drone avec sa carte et ajouter le secret TLS à la section d'entrée! Nous allons également désactiver HTTP sur notre entrée (seul HTTPS sera servi) et modifier notre pour refléter ce changement HTTPS.

Et nous devons juste mettre à niveau notre déploiement:

Vous devrez également modifier votre application Github.

Dans cet article, nous avons vu comment déployer un cluster Kubernetes sur GKE, comment créer un compte de service avec la liaison de rôle de cluster appropriée pour déployer Tiller, comment utiliser Helm et comment déployer un graphique avec l'exemple de drone.

Dans le prochain article, nous verrons comment rédiger un pipeline de qualité pour un projet Go ainsi que la façon de pousser vers Google Cloud Registry.

Grâce à @shirley_leu pour relire cet article et corriger mes erreurs en anglais!

Nous serions ravis de connaître votre avis

      Laisser un commentaire