TP optionnel - Stratégies de déploiement
Déployer notre application d'exemple (goprom) et la connecter à prometheus
Nous allons installer une petite application d'exemple en go.
- Téléchargez le code de l'application et de son déploiement depuis github:
git clone https://github.com/e-lie/k8s-deployment-strategies
Nous allons d'abord construire l'image docker de l'application à partir des sources et la déployer dans le cluster.
- Allez dans le dossier
goprom_app
et "construisez" l'image docker de l'application avec le tag<votrelogindockerhub>/goprom
.
Réponse
cd goprom_app
docker build -t tecpi/goprom .
- Allez dans le dossier de la première stratégie
recreate
et ouvrez le fichierapp-v1.yml
. Notez queimage:
est àtecpi/goprom
et qu'un paramètreimagePullPolicy
est défini àNever
. Changez ces paramètres si nécessaire (oui en général).
- Appliquez ce déploiement kubernetes:
Réponse
cd '../k8s-strategies/1 - recreate'
kubectl apply -f app-v1.yml
Observons notre application et son déploiement kubernetes
- Explorez le fichier de code go de l'application
main.go
ainsi que le fichier de déploiementapp-v1.yml
. Quelles sont les routes http exposées par l'application ?
Réponse
- L'application est accessible sur le port
8080
du conteneur et la route/
. - L'application expose en plus deux routes de diagnostic (
probe
) kubernetes sur le port8086
sur/live
pour laliveness
et/ready
pour lareadiness
(cf https://kubernetes.io/docs/) - Enfin,
goprom
expose une route spécialement pour le monitoring Prometheus sur le port9101
et la route/metrics
Utilisez le service
NodePort
pour accéder au servicegoprom
dans votre navigateur.Utilisez le service
NodePort
pour accéder au servicegoprom-metrics
dans votre navigateur. Quelles informations récupère-t-on sur cette route ?Pour tester le service
prometheus-server
nous avons besoin de le mettre en mode NodePort (et non ClusterIP par défaut). Modifiez le service dans Lens pour changer son type.Exposez le service avec un NodePort (n'oubliez pas de préciser le namespace monitoring).
Vérifiez que prometheus récupère bien les métriques de l'application avec la requête PromQL :
sum(rate(http_requests_total{app="goprom"}[5m])) by (version)
.Quelle est la section des fichiers de déploiement qui indique à prometheus ou récupérer les métriques ?
Réponse
apiVersion: apps/v1
kind: Deployment
---
spec:
---
template:
metadata:
---
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9101"
Créer une dashboard avec un Graphe. Utilisez la requête prometheus (champ query suivante):
sum(rate(http_requests_total{app="goprom"}[5m])) by (version)
Pour avoir un meilleur aperçu de la version de l'application accédée au fur et à mesure du déploiement, ajoutez {{version}}
dans le champ legend
.
Observer un basculement de version
Ce TP est basé sur l'article suivant: https://blog.container-solutions.com/kubernetes-deployment-strategies
Maintenant que l'environnement a été configuré :
- Lisez l'article.
- Vous pouvez testez les différentes stratégies de déploiement en lisant leur
README.md
. - En résumé, pour les plus simple, on peut:
- appliquer le fichier
app-v1.yml
pour une stratégie. - lançer la commande suivante pour effectuer des requêtes régulières sur l'application:
service=$(minikube service goprom --url) ; while sleep 0.1; do curl "$service"; done
- Dans un second terminal (pendant que les requêtes tournent) appliquer le fichier
app-v2.yml
correspondant. - Observez la réponse aux requêtes dans le terminal ou avec un graphique adapté dans
graphana
(Il faut configurer correctement le graphique pour observer de façon lisible la transition entre v1 et v2). Un aperçu en image des histogrammes du nombre de requêtes en fonction des versions 1 et 2 est disponible dans chaque dossier de stratégie. - supprimez le déploiement+service avec
delete -f
ou dans Lens.
- appliquer le fichier
Par exemple pour la stratégie recreate le graphique donne:
Facultatif : Installer Istio pour des scénarios plus avancés
Pour des scénarios plus avancés de déploiement, on a besoin d'utiliser soit un service mesh comme Istio (soit un plugin de rollout comme Argo Rollouts mais pas ce que nous proposons ici).
- Sur k3s, supprimer la release Helm du Ingress Controller Traefik (ou le ingress Nginx) pour le remplacer par l'ingress Istio.
- Installer Istio, créer du trafic vers l'ingress de l'exemple et afficher le graphe de résultat dans le dashboard Istio : https://istio.io/latest/docs/setup/getting-started/
- Utiliser ces deux ressources pour appliquer une stratégie de déploiement de type A/B testing poussée :