Aller au contenu
Retour au blog
Cloud & DevOps 20 octobre 2026 9 min de lecture

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.

CI/CD vers Kubernetes (K3s) sur AWS avec Terraform, Ansible et Jenkins

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 destroy sur 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.

CI/CDKubernetesK3sTerraformAnsibleJenkinsDockerAWS
Anass Essadikine

À propos de l'auteur

Anass Essadikine

Data & AI Engineer et ingénieur logiciel basé à Casablanca, au Maroc. Je construis des plateformes data, des tableaux de bord Power BI, des assistants RAG et des applications Next.js / Spring Boot.

Projets liés

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.

Continuer la lecture

Tous les articles

Besoin de ces compétences ?

Je suis ouvert aux missions freelance, aux stages et aux postes à temps plein. Discutons.