I. Contexte et Objectifs
Avec l’évolution de la philosophie Devops, il est indispensable d’avoir dans la chaîne CI/CD un outil d’automatisation. Ansible est aujourd’hui incontournable dans la mise en place d’une infrastructure automatisée. Après le déploiement d’une application, il est indispensable de gérer les problématiques de haute disponibilité, de scalabilité et de mise à jour de l’application. Aujourd’hui, l’outil qui répond à toutes ces problématiques est kubernetes.
Au vue des avantages apportés par ces deux outils, il est essentiel de pouvoir proposer des infrastructures qui automatisent le déploiement dans un cluster k8s afin d’avoir une application hautement disponible.
Dans cet article, je vous présente comment utiliser ansible afin de provisionner les ressources dans un cluster kubernetes avec un exemple concret de déploiement.
II. Prérequis :
- Cluster kubernetes (2 VM représentant le master et le worker)
- Python>=2.7
- Openshift>=0.6
- PyYAML>=3.11
Installation des prérequis
- Cluster kubernetes
Dans le cadre de cet article, nous avons déployé un cluster de 2 nœuds (un master et un worker). Le déploiement du cluster s’est fait en utilisant un rôle ansible: https://github.com/franck-art/kubernetes-playbook/tree/master/kubernetes_role_cluster
Visualiser les nœuds
- sudo yum install python3-pip
- sudo pip3 install PyYAML
- sudo pip3 install openshift
- sudo pip3 install –upgrade –user openshift
Une fois les prérequis installés, il est possible d’utiliser le module k8s de ansible.
III. Application au déploiement de nginx
Nous avons utilisé un objet deployment avec un replica de 3 et un service afin d’exposer l’application
Deploiement.yml
Service.yml
Nous avons mis sur pieds un playbook de provisionnement des ressources sur le cluster k8s.
Lancement du playbook
Playbook launch.yml
Ce playbook va créer un namespace du projet nommé « franck », un deployment de 3 replicas et un service afin d’exposer l’application.
Le playbook est lancé sur la VM du noeud master grace à la commande ansible: ansible-playbook -i hosts launch.yml
avec hosts, le fichier contenant notre inventaire
Vérification
kubectl get deploy -n franck
NAME READY UP-TO-DATE AVAILABLE AGE www-deployment 3/3 3 3 5d20h |
kubectl get pods -n franck -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES www-deployment-65c547b6f-g7kgb 1/1 Running 0 5d20h 10.244.1.2 worker-node <none> <none> www-deployment-65c547b6f-l68rf 1/1 Running 0 5d20h 10.244.1.3 worker-node <none> <none> www-deployment-65c547b6f-vjnvf 1/1 Running 0 5d20h 10.244.1.5 worker-node <none> <none> |
Disponibilité de l’application
L’application est disponible à l’adresse http://3.236.211.59:31000/
Conclusion
La jonction de ansible et kubernetes permet de rendre le déploiement efficace et automatisé. Grace au module k8s de ansible, il devient beaucoup plus facile d’interagir avec le cluster. On peut désormais intégrer kubernetes à une chaine CI/CD complète grâce à son interaction avec ansible.
Références:
kubernestes cluster ansible role: https://github.com/franck-art/kubernetes-playbook/tree/master/kubernetes_role_cluster
k8s module doc: https://docs.ansible.com/ansible/latest/modules/k8s_module.html