CI/CD vers Kubernetes (K3s) sur AWS avec Terraform, Ansible et Jenkins
Une chaîne de livraison complète et reproductible pour une petite équipe : infrastructure as code, un cluster Kubernetes léger et un pipeline qui déploie à chaque push.

Pourquoi automatiser toute la chaîne ?
Les déploiements manuels sont lents et fragiles : quelqu'un se connecte au serveur, récupère le code, reconstruit et espère que la configuration est la même que la dernière fois. Une chaîne CI/CD rend chaque version identique et permet de reconstruire l'infrastructure de zéro. J'ai construit cette chaîne pour une application React (voir le projet).
L'architecture
git push → Jenkins
1. checkout + build (npm ci, npm run build)
2. docker build → docker push (Docker Hub)
3. kubectl set image / apply des manifestes → cluster K3s sur AWS
Terraform → instances EC2, groupes de sécurité, réseau
Ansible → Docker, serveur K3s + agents, kubeconfig
Étape 1 — Provisionner AWS avec Terraform
Terraform décrit l'infrastructure en code : instances, groupes de sécurité, paires de clés. Une instance minimale :
resource "aws_instance" "k3s_server" {
ami = var.ami_id
instance_type = "t3.small"
key_name = aws_key_pair.deploy.key_name
vpc_security_group_ids = [aws_security_group.k3s.id]
tags = { Name = "k3s-server" }
}
output "server_ip" {
value = aws_instance.k3s_server.public_ip
}
N'ouvrez que le nécessaire : SSH depuis votre IP, HTTP/HTTPS pour l'application et l'API Kubernetes (6443) uniquement depuis des adresses de confiance.
Étape 2 — Configurer les serveurs avec Ansible
Ansible lit les IP produites par Terraform et installe les logiciels. K3s est une distribution Kubernetes légère qui s'installe en une commande, idéale pour de petits clusters :
- hosts: k3s_server
become: true
tasks:
- name: Installer le serveur K3s
shell: curl -sfL https://get.k3s.io | sh -
args:
creates: /usr/local/bin/k3s
- name: Lire le jeton du nœud
slurp:
src: /var/lib/rancher/k3s/server/node-token
register: k3s_token
Les agents rejoignent le cluster avec l'URL du serveur et ce jeton.
Étape 3 — Conteneuriser l'application
Un Dockerfile multi-étapes garde l'image finale légère : build avec Node, service des fichiers statiques avec Nginx.
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
Étape 4 — Le pipeline Jenkins
pipeline {
agent any
environment { IMAGE = "myuser/frontend:${env.BUILD_NUMBER}" }
stages {
stage('Build image') { steps { sh 'docker build -t $IMAGE .' } }
stage('Push') {
steps {
withCredentials([usernamePassword(credentialsId: 'dockerhub',
usernameVariable: 'U', passwordVariable: 'P')]) {
sh 'echo $P | docker login -u $U --password-stdin && docker push $IMAGE'
}
}
}
stage('Deploy') {
steps { sh 'kubectl set image deployment/frontend frontend=$IMAGE' }
}
}
}
Étiquetez les images avec le numéro de build ou le SHA du commit, jamais seulement latest, pour pouvoir revenir en arrière en une commande.
Étape 5 — Les manifestes Kubernetes
Un Deployment à deux réplicas avec des sondes readiness et liveness, et un Service, suffisent pour commencer. Les sondes font attendre Kubernetes que la nouvelle version réponde avant de lui envoyer du trafic : mises à jour sans interruption.
Pièges fréquents
- Des secrets dans le dépôt — utilisez les credentials Jenkins et les Secrets Kubernetes.
- Pas de limites de ressources — un conteneur peut saturer le nœud.
- Déployer
latest— les retours arrière deviennent hasardeux. - Oublier
terraform destroysur les environnements de test — la facture cloud grimpe sans bruit.
Les mêmes idées, plus simplement
Pour ce site, j'applique les mêmes principes avec moins de composants : une image Docker construite à chaque push par GitHub Actions et déployée sur un seul serveur derrière un tunnel Cloudflare (voir le projet). Choisissez le niveau d'outillage adapté à l'équipe et au trafic.
Besoin d'aide pour vos déploiements ?
Je mets en place des pipelines CI/CD, des déploiements Docker et des serveurs cloud. Voir mes services ou me contacter.
Projets liés
Cloud & DevOpsProjet académique · 2024Déploiement cloud avec CI/CD automatisé
Un pipeline complet qui build, conteneurise et déploie une application React sur Kubernetes (AWS) à chaque push.
Génie logicielProjet personnel · 2026essadikine.com — Portfolio Next.js bilingue
Ce site : un portfolio rapide et bilingue (EN/FR), optimisé pour Google et les moteurs de réponse IA, auto-hébergé avec Docker derrière Cloudflare.
Questions fréquentes
K3s est une distribution Kubernetes certifiée et légère, livrée sous forme d'un seul binaire. Elle consomme moins de mémoire et s'installe vite, ce qui convient aux petits clusters, aux serveurs edge et à l'apprentissage.



