chore: push content to Git
Ce dépôt contient du matériel de démonstration.
Ses auteurs sont :
Notre système délivre une page Web avec un chameau dessiné en ASCII Art. Cette page est générée par un serveur appelé chameau, et une instance de NGINX équilibre la charge entre les instances de chameau. Ce système est déployé sur Google Kubernetes Engine grâce à Skaffold.
Nous voulons mettre à jour chameau. En effet, la couleur du fond n'est pas à notre goût, une correction doit être faite. Néanmoins, la mise à jour doit être effectuée sans déni de service, et doit être annulée en cas de problème. Pour cela, nous allons procéder à un déploiement canari : la nouvelle version du serveur Web va cohabiter un temps avec l'ancienne version, et un pourcentage des requêtes au serveur Web lui seront affectées. Si ces requêtes sont traitées avec succès (ce que nous détectons, ici, avec un code de réponse HTTP différent de 5XX), alors nous pouvons augmenter le pourcentage de requêtes traitées par la nouvelle version jusqu'à tout lui affecter. Nous allons augmenter le pourcentage progressivement, jusqu'à arriver à cinquante pourcents. Dès lors, l'ancienne version pourra être éteinte. Cette mécanique est automatisée par Flagger.
Cette démonstration utilise Google Kubernetes Engine (GKE). Il vous faut donc disposer d'un compte Google Cloud Platform (GCP) et d'un projet GCP sur lesquels vous avez le rôle d'Administrateur (nous allons activer des API, créer des ressources et des comptes de service).
Sur le poste de démonstration, l'outil en ligne de commande gcloud est nécessaire. Il faut préalablement s'authentifier avec ; pour cela, exécutez les commandes suivantes : gcloud auth login
, gcloud auth application-default login
et gcloud config set project PROJECT-ID
(remplacer PROJECT_ID
par l'identifiant du projet dans lequel vous allez déployer le système). De plus, il faut installer l'extension gke-gcloud-auth-plugin
.
La construction des images de conteneurs et leur déploiement est orchestré par l'outil Skaffold. Veillez à l'installer sur le poste de démonstration. Les images de conteneurs sont construites localement avec Docker, l'installer est donc également nécessaire.
Un nom de domaine est nécessaire pour interroger le serveur. L'Ingress Controller se sert du nom de domaine dans la requête pour assigner les requêtes au bon conteneur. Les enregistrements DNS de ce nom de domaine seront édités pour la démonstration.
Pour le déploiement avec Terraform, trois valeurs sont requises : gcp_project_id
, gcp_region
et gcp_zone
. Elles peuvent être fournies dans le terminal au moment d'appliquer le plan de déploiement, ou être renseignées dans un fichier values.tfvars dans deploy/terraform et deploy/terraform-api.
Pour interagir avec la grappe de serveurs Kubernetes, il est nécessaire également de disposer de l'outil kubectl. De même, la construction de l'image de conteneur et son déploiement est réalisé depuis le poste de démonstration ; ici, nous utilisons docker et skaffold.
Étant donné la durée de mise en place (le déploiement de l'infrastructure peut durer une dizaine de minutes), quelques étapes peuvent être anticipées :
cd deploy/terraform-api && terraform init && terraform apply -auto-approve
;cd deploy/terraform-api && terraform init && terraform apply -auto-approve -var-file=PATH-TO-TFVARS-FILE
(remplacez PATH-TO-TFVARS-FILE
par le chemin vers le fichier values.tfvars que vous avez préparé) ;gcloud container clusters get-credentials CLUSTER_NAME --region=LOCATION
(remplacez CLUSTER_NAME
par le nom de la grappe générée par Terraform, et LOCATION
par le nom de la zone de déploiement) ;GCP_SERVICE_ACCOUNT
(adresse électronique du compte de service créé par Terraform) et HOST_DOMAIN
(le nom de domaine auquel le serveur est contacté) ;skaffold config set default-repo [REGISTRY]
(remplacez REGISTRY
par l'identifiant que vous pouvez trouver dans la console GCP dans l'interface du service Artifact Registry).kubectl get pods
. Il n'y a pour l'instant aucun conteneur exécuté ;skaffold run
;kubectl get pods
. Il y pour l'instant six pods :
skaffold run
;kubectl get pods
. En plus des conteneurs chameau-primary-..., deux nouveaux conteneurs chameau-... sont apparus : ces conteneurs exécutent la nouvelle version de chameau ;kubectl logs -f flagger-...
. Au fur et à mesure, des lignes vont tracer le passage progressif du trafic vers le conteneur canari ;kubectl get pods
. Il n'y a de nouveau plus que deux instances de chameau-primary-....