Le mécanisme du rolling update (2/6) myapp.pyxida.io 100% -> v1.0.0 myapp:v2.0.0 myapp:v1.0.0 myapp:v1.0.0 myapp:v1.0.0 myapp:v1.0.0 $> kubectl set image deployment/myapp myapp=myapp:v2.0.0 myapp:v2.0.0 myapp:v2.0.0 Check santé du pod
Une bonne liveness et Readiness fiabilise ce mécanisme apiVersion: apps/v1 kind: Deployment metadata: name: myapp [...] spec: replicas: 3 [...] template: [...] spec: containers: - name: myapp image: myapp:v2.0.0 ports: - containerPort:8080 livenessProbe: httpGet: path: /healthz port: 8080 readinessProbe httpGet: path: /ready port: 8080 KO KO OK Kubernetes tente de redémarrer le pod OK OK KO Le pod sort du loadbalancing
Généralités sur les probes Liveness et Readiness se configure de la même manière 3 façon de faire des probes • La requête HTTP • TCP • Script/commande Voici un bout de code qui est une liveness :) http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) w.Write([]byte("ok")) })
Si on résume ce mécanisme basique • Montée de version en ZDD (Zero downtime deployment) • Transparent pour les OPS, automatisé par Kubernetes • Historique des replicasets nous permet de faire un rollout Ce mécanisme nous empêche cependant de pouvoir tester le comportement de notre application en amont dans les mêmes conditions
Si on résume ce mécanisme • Mise en production consiste uniquement en l’update d’un service pour faire pointer vers un nouveau label • La nouvelle stack peut être montée et testée en amont • Rollout simplifié, il suffit de refaire pointer le service vers l’ancienne version Cependant : • C’est raté pour le ZDD • La nouvelle stack peut être tester sur la même infrastructure mais pas dans les mêmes conditions que la “vrai” production
Si on résume ce mécanisme • Mécanisme de canary release “by design” • Permet un déploiement progressif Cependant : • Pas très précis • Les proportions ne sont plus bonne en cas d’autoscalabilité
Si on résume ce mécanisme • Les annotations facilitent la mise en place. • Traefik et Nginx supportent cette feature • Contrôle fin sur les pourcentages • Plus de problème liés à la scalabilité Cependant : • Quid des services internes qui ne sont pas exposé par une Ingress ?
Un service mesh est donc la meilleure solution ? • Gestion fine du trafic • Géré par des ressources externes à la base de l’architecture • Gestion au niveau du service donc feature disponible à tout niveau Cependant : • Complexifie l’architecture • Plus compliqué à debugger • Mais surtout ...
Et si on le faisait nous même ? myapp:v1.0.0 myapp:v1.0.0 myapp:v1.0.0 myapp:v1.0.0 myapp:v2.0.0 myapp:v2.0.0 myapp:v2.0.0 myapp:v2.0.0 myapp-v1 myapp-v2 myapp backend balance roundrobin server srv1 myapp-v1:8080 weight 90 server srv2 myapp-v2:8080 weight 10 90% 10%
Bordeaux 33000 > France > www.pyxida.io Take Away ! • Plein de façons de gérer ses déploiements sur k8s • Votre méthode de MEP reflète votre organisation • Sans test, le blue/green ne sert à rien • Sans métrique, oubliez le canary • Les services mesh apportent des features … • mais aussi de la complexité • La meilleure des MEP est celle que vous avez décidée