OpenEBS dans AKS et test d’un processus GitOps avec des pipelines de livraison continue via Weave Cloud, Codefresh et Snyk …

Image for post
Image for post

Je pars ici de la création d’un cluster Kubernetes managé dans Azure avec AKS. Azure Kubernetes Service (AKS) simplifie le déploiement d’un cluster Kubernetes géré dans Azure. AKS permet de réduire la complexité et la surcharge opérationnelle de la gestion d’un cluster Kubernetes en déléguant une grande partie de cette responsabilité à Azure. On peut créer un cluster AKS dans le portail Azure, avec Azure CLI ou des options de déploiement piloté par modèle, comme les modèles Resource Manager et Terraform. Lors du déploiement d’un cluster AKS, le noeud maître dans Kubernetes et tous les autres nœuds sont déployés et configurés.

Image for post
Image for post
Image for post
Image for post

J’ai donc ici un déploiement d’un cluster Kubernetes avec AKS :

Image for post
Image for post

J’y install Helm :

Image for post
Image for post

et je vais tester l’installation d’OpenEBS dans ce cluster. OpenEBS est un stockage en bloc conteneurisé pour les environnements cloud natifs et autres avec des SLA QoS par conteneur (ou pod), des stratégies de hiérarchisation et de réplication à travers les AZs et les environnements, et des performances prévisibles et évolutives.

Image for post
Image for post
Image for post
Image for post

OpenEBS s’appuie sur iSCSI pour la gestion du stockage. Pour rappel, L’iSCSI (Internet Small Computer System Interface) est un protocole TCP/IP utilisé pour établir et gérer les interconnexions entre les périphériques de stockage IP, les hôtes et les clients, et pour créer des réseaux de stockage (SANs). Le SAN permet d’utiliser le protocole SCSI dans les réseaux de transmission de données à haut débit, avec transfert de données au niveau bloc entre plusieurs réseaux de stockage de données. L’architecture SCSI est basée sur le mode C/S et est généralement utilisée dans des environnements où les périphériques sont proches les uns des autres et connectés par un bus SCSI. Par exemple ici, vision du CAS (Container Attached Storage) en comparaison avec les modes NAS/SAN et DAS dans Kubernetes :

Je dois commencer par l’installation de l’opérateur OpenEBS dans le cluster et des classes de stockage (pour rappel, Un “opérateur” est une méthode de conditionnement, de déploiement et de gestion d’une application Kubernetes. Une application Kubernetes est une application qui est à la fois déployée sur Kubernetes et gérée à l’aide des API Kubernetes et des outils kubectl. On considére les Operateurs comme le runtime qui gère ce type d’application dans Kubernetes) :

kubectl apply -f https://openebs.github.io/charts/openebs-operator-0.7.0.yaml
Image for post
Image for post
Image for post
Image for post
Image for post
Image for post

Je peux obtenir les différentes classes de stockage installées ici :

Image for post
Image for post

Test à partir de là d’un serveur de notebooks Jupyter qui va utiliser les PersistentVolumeClaim (PVC) :

apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: jupyter-server
namespace: default
spec:
replicas: 1
template:
metadata:
labels:
name: jupyter-server
spec:
containers:
- name: jupyter-server
imagePullPolicy: Always
image: satyamz/docker-jupyter:v0.4
ports:
- containerPort: 8888
env:
- name: GIT_REPO
value: https://github.com/vharsh/plot-demo.git
volumeMounts:
- name: data-vol
mountPath: /mnt/data
volumes:
- name: data-vol
persistentVolumeClaim:
claimName: jupyter-data-vol-claim
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: jupyter-data-vol-claim
spec:
storageClassName: openebs-standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5G
---
apiVersion: v1
kind: Service
metadata:
name: jupyter-service
spec:
ports:
- name: ui
port: 8888
protocol: TCP
selector:
name: jupyter-server
sessionAffinity: None
type: LoadBalancer

Le déploiement nécessite un peu de temps :

et je peux récupérer le token nécessaire pour pouvoir accéder au notebook du serveur Jupyter (ici génération d’un graphe sur les femmes dans l’enseignement supérieur au niveau du Bachelor en fonction de leurs spécialités) :

Je vais maintenant réaliser le test d’exécution de pipelines en mode GitOps via Weave Cloud dans ce cluster. GitOps est un moyen d’assurer une livraison continue. Il fonctionne en utilisant Git comme source unique de vérité pour l’infrastructure déclarative et les applications. Avec Git au centre des pipelines de livraison continue, chaque développeur peut faire des demandes d’extraction et utiliser Git pour accélérer et simplifier à la fois les déploiements d’applications et les tâches d’exploitation pour Kubernetes.

Image for post
Image for post
Image for post
Image for post

Pour cela, exécution du script d’installation fourni par Weave Cloud dans le cluster :

Image for post
Image for post

Weave Cloud va permettre l’installation de Flux, un outil qui assure automatiquement que l’état d’un cluster correspond à celui de la configuration dans git. Il utilise un opérateur dans le cluster pour déclencher des déploiements dans Kubernetes, ce qui signifie que l’on n’a pas besoin d’un outil de déploiement continu séparé. Il surveille tous les référentiels d’images pertinents, détecte les nouvelles images, déclenche les déploiements et met à jour la configuration d’exécution souhaitée sur cette base :

Image for post
Image for post

Je vais utiliser le dépôt (maintenant traditionnel) dans github du démonstrateur FranceConnect Particulier :

Il va utiliser ce manifeste pour le déploiement dans le cluster :

Image for post
Image for post

et effectivement, le déploiement se met en place automatiquement après la liaison avec le dépôt Github dans Weave cloud :

Image for post
Image for post

Une adresse IP publique est fourni par le LoadBalancer attaché au cluster dans AKS :

Je modifie ce manifeste dans le dépôt Github en y substituant l’image du démonstrateur FranceConnect Particulier par celui de FranceConnect Agent :

Le changement est automatiquement détecté dans Weave Cloud et un un nouveau déploiement se met en place :

Image for post
Image for post

et en effet, j’ai bien le démonstrateur FranceConnect Agent qui a remplacé le précédent en FranceConnect Particulier :

Image for post
Image for post
Image for post
Image for post

via une autre adresse IP publique fournie par le LoadBalancer :

Je peux remettre les anciennes valeurs du fichier de manifest pour qu’elles soient de nouveau détectées automatiquement dans Weave Cloud :

L’observabilité est très important dans ce processus GitOps et peut être considérée comme l’un des principaux moteurs du cycle de livraison continue pour Kubernetes puisqu’elle décrit l’état de fonctionnement réel du système à un moment donné. Le système en fonctionnement est observé afin de le comprendre et de le contrôler. Les nouvelles fonctionnalités et les correctifs sont poussés à git et entraîne le déclenchement du pipeline de déploiement, et lorsqu’ils sont prêts à être lancés, ils peuvent être observés en temps réel dans le cluster en cours d’exécution. À ce stade, le développeur peut revenir au début du pipeline en se basant sur ce retour d’information ou déployer et diffuser l’image dans le cluster de production.

Image for post
Image for post

D’où ces graphes fournis via Prometheus dans Weave Cloud :

On en conserve la trace dans le portail Azure :

Je suis d’ailleurs alerter des actions via la messagerie classique :

Image for post
Image for post

ou dans Slack via un canal préconfiguré :

Dans ce créneau des processus GitOps, on peut utiliser également la plateforme Codefresh :

Image for post
Image for post

Codefresh va permettre de créer, tester et déployer instantanément des images Docker dans le cluster Kubernetes. Les pipelines constituent l’élément central de la plateforme Codefresh. Les pipelines sont des workflows qui contiennent des étapes individuelles. Chaque étape est responsable d’une action spécifique dans le processus.

Image for post
Image for post

Je définis les paramêtres du déploiement (encore une fois) du démonstrateur FranceConnect Particulier dans Codefresh :

et je lance le pipeline :

il me génère cette sortie :

avec une alerte dans le canal Slack :

et effectivement, une adresse IP publique fourni encore une fois par le LoadBalancer permet d’accéder à ce démonstrateur :

Image for post
Image for post

Je crée un autre pipeline mais qui va utiliser le dépôt github du démonstrateur FranceConnect Agent avec une phase de clonage de ce dépôt, suivi de la phase de construction de l’image Docker correspondante, de test unitaire qui vont utiliser Snyk pour la partie sécurité, du déploiement de l’image géneré avec le tag master dans le Docker Hub et dans le cluster Kubernetes :

Le pipeline au format YAML se retrouve sous cette forme :

Le pipeline s’exécute avec succès :

Image for post
Image for post

et cette sortie génerée par ce pipeline où l’on peut voir le détail de toutes les étapes liées à l’exécution de ce dernier :

On voit que pour la partie sécurité au niveau des tests unitaires, on utilise la plateforme Snyk afin de trouver les vulnérabilités dans les dépôts Git et pouvoir corriger les risques grâce à des mises à jour et des correctifs automatisés (pour cela Snyk aide à trouver, corriger et surveiller les vulnérabilités connues dans les dépendances Node.js npm, Ruby et Java, sur une base ad hoc et dans le cadre du système de CI).

Image for post
Image for post

Le dépôt sur le Docker Hub est mis à jour avec le tag prédéfini :

On peut aller beaucoup plus loin puisque Codefresh permet normalement de travailler en bonne harmonie avec Spinnaker en liaison avec jenkins comme le précise cet article :

Image for post
Image for post
Image for post
Image for post

On voit également dans cet article les éventuels avantages/inconvénients vis à vis de GitLab CI :

Aucune grande nouveauté n’est faite ici. GitOps utilise des idées tirées des démarches DevOps et de Site Reliability Engineering, et commence probablement par le superbe aperçu de Martin Fowler sur l’intégration continue en 2006. D’une certaine manière, GitOps est un état de l’art parmis d’autres ...

Image for post
Image for post
Image for post
Image for post

A suivre !

Above the clouds, the sky is always blue ...

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store