- Introduction, Description du travail effectué
- Préliminaires
- Installation
- Suppression
- Notes & Remarques
Implémentation de l'exercice avec :
- des environnements basés sur des clusters EKS et Elasticache Redis,
- une pipeline utilisant Github Actions et Helm
- Infra as Code, avec:
Terraformpour une partie de la configuration de Github ActionsCloudFormationpour le reste de l'infra
.
├── .github # pipeline Github Actions
├── deploy # le chart Helm pour déployer l'application
├── docs # des images pour le README
├── infra # le code d'infra Cloudformation et Terraform (pipeline)
├── docker-compose.yml # pour lancer l'application localement
├── Makefile # des targets pour construire l'infra
├── props.env # des props à modifier pour la création de l'infra
├── src # code "de prod" et "de test" de l'application Java
├── ...
└── README.md
Pour pouvoir déployer l'infra, il faut:
- make: https://www.gnu.org/software/make/
- aws cli: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
- eksctl: https://eksctl.io/
- terraform https://www.terraform.io/downloads
- Générer un token d'accès Github avec les paramètres suivants (permissions à ajuster)
- Editer le fichier
secrets.envet ajoutez-y le token Github
- éxécuter la target
ignore-secretspour que git ne prenne pas en compte les modifications sur ce fichier
>> make ignore-secrets
git update-index --skip-worktree secrets.env- Forker le repo
- Modifier le fichier
props.env
- Installez l'infra et les paramètres de la pipeline avec le token d'accès Github dans
secrets.env(cf section Préliminaires)
>> make all
git update-index --skip-worktree secrets.env
aws cloudformation deploy \
--stack-name click-count-642009745804-eu-west-3-bucket \
--template-file infra/s3-bucket/s3-bucket.yml \
--parameter-overrides \
BucketName=click-count-642009745804-eu-west-3-bucket
[...]Le token d'accès n'est pas rajouté à props.env afin de ne pas le commiter par erreur.
Il est rajouté au fichier secrets.env, dont les modifications sont ignorées
De plus quand Github détecte un token d'accès dans le code source, il l'invalide automatiquement.
- Les environnements et secrets dans Github Actions devraient être créés
- Au bout d'un certain temps (20-30 minutes), les environnements devraient être créés dans AWS
les stacks CloudFormation:
les clusters EKS de staging et prod:
les clusters Elasticache / Redis de staging et prod:
le provider OIDC pour permettre à Github Actions de déployer dans nos cluster EKS (assez pratique):
Ainsi que les rôles, permissions et autres ressources.
- Poussez du code dans
srcoupom.xmlpour faire éxécuter la pipeline si elle ne s'éxécute pas toute seule
Le pipeline a été définie pour ne builder l'application et construire une image Docker que si le code de l'app est modifié. Si uniquement le chart Helm est modifié, l'application est redéployée avec le chart à jour et le tag de l'image Docker la plus récente, mais n'est pas rebuildée.
- Récupérer les urls des Load Balancer sur chaque environnment et vérifiez que tout marche bien
13:27:25 >> aws eks list-clusters
{
"clusters": [
"cluster-click-count-production",
"cluster-click-count-staging"
]
}
13:27:27 >> aws eks update-kubeconfig --name cluster-click-count-staging
Updated context arn:aws:eks:eu-west-3:642009745804:cluster/cluster-click-count-staging in /home/joseph/.kube/config
13:27:41 >> k -n click-count get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
click-count LoadBalancer 172.20.253.162 a4cb99ab0f0ce4191b751fa629600f36-1170078537.eu-west-3.elb.amazonaws.com 80:32714/TCP 5m16s
13:27:54 >> aws eks update-kubeconfig --name cluster-click-count-production
Updated context arn:aws:eks:eu-west-3:642009745804:cluster/cluster-click-count-production in /home/joseph/.kube/config
13:28:05 >> k -n click-count get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
click-count LoadBalancer 172.20.232.105 a68d2fe242da8404692205ec7bd83b6d-1779255576.eu-west-3.elb.amazonaws.com 80:32263/TCP 4m27s
(Rajoutez /clickCount à l'url -> root contexte de l'app dans Tomcat)
Toujours avec le token d'accès Github dans la variable d'environnement GITHUB_PAT, éxécutez:
make delete-all- Le build échoue initialement -> il faut ajouter une version plus récente du plugin maven
maven-war-plugin
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project clickCount: Execution default-war of goal org.apache.maven.plugins:maven-war-plugin:2.2:war failed: Unable to load the mojo 'war' in the plugin 'org.apache.maven.plugins:maven-war-plugin:2.2' due to an API incompatibility: org.codehaus.plexus.component.repository.exception.ComponentLookupException: Cannot access defaults field of Properties
[ERROR] -----------------------------------------------------
[ERROR] realm = plugin>org.apache.maven.plugins:maven-war-plugin:2.2
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
- Implémenter des déploiement "safe"
- rajouter des tests automatisés après le déploiement avec rollback automatique et canary / déploiement progressif (Flagger semble être l'outil de choix pour cela)
- GitOps / déploiement "pull"
- On peut vouloir préférer un modèle "pull" pour le déploiement dans Kube, ne serait-ce que pour éviter à donner accès aux clusters depuis l'extérieur et utiliser un outil tel que par exemple FluxCD, ArgoCD ou autre. Mais il n'est pas toujours facile de suivre le déploiement
- Déployer dans un PaaS
- Pour des applis et projets simples, on pourrait vouloir se tourner vers une solution totalement managée, type heroku, Google App Engine, AWS App Runner (avec des réserves pour ce dernier).
- Séparer le code d'infra (création des environnements)
- L'infra existant a priori de manière indépendante de l'app (et pouvant être utilisée par plusieurs apps), on pourrait vouloir la mettre dans son propre repository. Cependant, les charts Helm devraient rester avec le code de l'app
- Une pipeline pour l'infra
- L'infra est déployée depuis le laptop. Il serait plus approprié de définir une pipeline pour la mise à jour de celle-ci
- Github Actions pas toujours convaincant
- Redis managé ou bien dans Kube ?
- Clean des ressources non-managées par l'IaC
- Des ressources non-managées par
CloudFormationsont créées par EKS et causent des soucis pour clean l'infra, forçant à introduire des scripts (ou des lambdas éventuellement) pour les cleaner.
- Des ressources non-managées par
- Organisation du code d'infra
- On peut avoir des arguments contre une "master-stack" de toute l'infra. C'est pratique de pouvoir créer toute l'infra, sans scotch, via un seul
aws cloudformation deployet la supprimer via une seulaws cloudformation delete-stack, mais ça se discute - Après dans la vraie vie le code d'infra pourrait aussi être géré par plusieurs équipes différentes, ce qui justifierait qu'il soit dans plusieurs repositories
- On peut avoir des arguments contre une "master-stack" de toute l'infra. C'est pratique de pouvoir créer toute l'infra, sans scotch, via un seul
- Le résultat produit l'an dernier est meilleur sur certains aspects
- notamment les tests ou encore la documentation de l'éxécution en locale











