Nous allons utiliser Gitlab CI et GitOps manuel pour implémenter et utiliser le déploiement canari dans Kubernetes.

Articles de ce cycle :
- (cet article)
- Déploiement Canari avec Istio
- Déploiement Canari avec Jenkins-X Istio Flagger
Nous effectuerons le déploiement canari manuellement via GitOps et la création/modification des ressources principales de Kubernetes. Cet article est principalement destiné à introduire comment fonctionne le déploiement canari dans Kubernetes, car il existe des méthodes d'automatisation plus efficaces que nous examinerons dans les articles suivants.

Déploiement Canary
Avec la stratégie canari de mise à jour, les mises à jour ne sont d'abord appliquées qu'à une partie des utilisateurs. Grùce à la surveillance, aux données des journaux, aux tests manuels ou à d'autres canaux de retour d'information, la version est testée avant son déploiement pour tous les utilisateurs.
Kubernetes Deployment (mise Ă jour progressive)
La stratĂ©gie par dĂ©faut pour Kubernetes Deployment est la mise Ă jour progressive, oĂč un certain nombre de pods avec de nouvelles versions d'images sont lancĂ©s. S'ils se crĂ©ent sans problĂšme, les pods avec les anciennes versions d'images sont arrĂȘtĂ©s et de nouveaux pods sont créés en parallĂšle.
GitOps
Nous utilisons GitOps dans cet exemple, car nous :
- utilisons Git comme source unique de vérité
- utilisons les opérations Git pour la construction et le déploiement (aucune commande, sauf git tag/merge, n'est nécessaire)
Exemple
Adoptons une bonne pratique : avoir un seul dépÎt pour le code des applications et un pour l'infrastructure.
DépÎt pour les applications
C'est une API trÚs simple en Python+Flask, qui renvoie une réponse au format JSON. Nous construirons le paquet via GitlabCI et publierons le résultat dans le registre Gitlab. Dans le registre, nous avons deux versions différentes des releases :
wuestkamp/k8s-deployment-example-app:v1wuestkamp/k8s-deployment-example-app:v2
La seule différence entre elles est le changement du fichier JSON renvoyé. Nous utilisons cette application pour visualiser de maniÚre trÚs simple avec quelle version nous interagissons.
DépÎt d'infrastructure
Dans ce dépÎt, nous allons déployer via GitlabCI dans Kubernetes, .gitlab-ci.yml se présente comme suit :
image: traherom/kustomize-docker
before_script:
- printenv
- kubectl version
stages:
- deploy
deploy test:
stage: deploy
before_script:
- echo $KUBECONFIG
script:
- kubectl get all
- kubectl apply -f i/k8s
only:
- master
Pour le lancer par vous-mĂȘme, vous aurez besoin d'un cluster, vous pouvez utiliser Gcloud :
gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80Vous devez faire un fork et créer une variable KUBECONFIG dans GitlabCI, qui contiendra la configuration d'accÚs kubectl à votre cluster.
Pour savoir comment obtenir les informations d'identification du cluster (Gcloud), vous pouvez consulter .
Yaml d'infrastructure
Dans le dépÎt d'infrastructure, nous avons un service :
apiVersion: v1
kind: Service
metadata:
labels:
id: app
name: app
spec:
ports:
- port: 80
protocol: TCP
targetPort: 5000
selector:
id: app
type: LoadBalancerEt déploiement dans deploy.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
replicas: 10
selector:
matchLabels:
id: app
type: main
template:
metadata:
labels:
id: app
type: main
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
name: app
resources:
limits:
cpu: 100m
memory: 100MiEt un autre déploiement dans deploy-canary.yaml:
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 0
selector:
matchLabels:
id: app
type: canary
template:
metadata:
labels:
id: app
type: canary
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
name: app
resources:
limits:
cpu: 100m
memory: 100MiRemarquez que l'app-deploy n'a pas encore de réplicas définis.
Exécution du déploiement initial
Pour lancer le déploiement initial, vous pouvez exécuter le pipeline GitlabCI manuellement dans la branche master. Ensuite, kubectl il doit afficher ce qui suit :

Nous voyons app un déploiement avec 10 réplicas et app-canary avec 0. Il y a aussi un LoadBalancer auquel nous pouvons accéder via curl par l'IP externe :
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done

Nous voyons que notre application de test renvoie uniquement âv1â.
Exécution du déploiement Canary
Ătape 1 : dĂ©ployer la nouvelle version pour une partie des utilisateurs
Nous avons défini le nombre de réplicas à 1 dans le fichier deploy-canary.yaml et l'image de la nouvelle version :
kind: Deployment
metadata:
name: app-canary
spec:
replicas: 1
selector:
matchLabels:
id: app
type: canary
template:
metadata:
labels:
id: app
type: canary
spec:
containers:
- image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
name: app
resources:
limits:
cpu: 100m
memory: 100MiDans le fichier deploy.yaml nous avons changé le nombre de réplicas à 9 :
kind: Deployment
metadata:
name: app
spec:
replicas: 9
selector:
matchLabels:
id: app
...Nous poussons ces modifications dans le dépÎt, à partir duquel le déploiement sera lancé (via GitlabCI) et voyons au final :

Notre Service pointera vers les deux dĂ©ploiements, car les deux ont le sĂ©lecteur app. En raison de la distribution alĂ©atoire par dĂ©faut dans Kubernetes, nous devons voir des rĂ©ponses diffĂ©rentes sur environ 10% des requĂȘtes :

L'état actuel de notre application (GitOps, pris de Git comme Single Source Of Truth) est la présence de deux déploiements avec des réplicas actifs, un pour chaque version.
~10% des utilisateurs découvrent la nouvelle version et la testent involontairement. Il est maintenant temps de vérifier s'il y a des erreurs dans les journaux et les données de surveillance pour identifier des problÚmes.
Ătape 2 : dĂ©ployer la nouvelle version pour tous les utilisateurs
Nous avons décidé que tout s'était bien passé et maintenant nous devons déployer la nouvelle version pour tous les utilisateurs. Pour cela, nous mettons simplement à jour deploy.yaml en installant la nouvelle version de l'image et le nombre de réplicas, égal à 10. Dans deploy-canary.yaml Nous définissons le nombre de réplicas sur zéro. AprÚs le déploiement, le résultat sera le suivant :

En résumé
Pour moi, lancer le dĂ©ploiement manuellement de cette maniĂšre aide Ă comprendre Ă quel point il peut ĂȘtre facilement configurĂ© avec k8s. Ătant donnĂ© que Kubernetes permet de mettre Ă jour tout via l'API, ces Ă©tapes peuvent ĂȘtre automatisĂ©es Ă l'aide de scripts.
Une autre chose Ă mettre en Ćuvre est le point d'entrĂ©e du testeur (LoadBalancer ou via Ingress), par lequel on peut accĂ©der uniquement Ă la nouvelle version. Il peut ĂȘtre utilisĂ© pour une visualisation manuelle.
Dans les prochains articles, nous examinerons d'autres solutions automatisĂ©es qui mettent en Ćuvre la plupart de ce que nous avons fait.
Lisez aussi d'autres articles sur notre blog :
Source : habr.com
