Déploiement d'applications Java sur Kubernetes : du Dockerfile au service opérationnel
\n\nLe développement Java moderne est impensable sans conteneurisation et orchestration. Kubernetes (K8s) est devenu la norme pour la gestion des microservices, et savoir déployer des applications Java dans un cluster est une compétence obligatoire pour tout développeur backend. Dans cet article, nous allons parcourir en pratique le cycle complet de déploiement : de la construction de l'image Docker avec l'application Java à la configuration de l'équilibrage de charge via Ingress.
\n\n1. Préparation de l'application Java et du Dockerfile
\n\nAvant d'arriver dans Kubernetes, votre application Java doit être empaquetée dans une image Docker. Considérons le cas classique — une application Spring Boot, compilée en fichier JAR.
\n\nCompilation du projet
\nSupposons que nous ayons un projet qui se compile via Maven. Exécutez la commande à la racine du projet :
\nmvn clean package -DskipTests\nEn conséquence, le fichier my-app-1.0.0.jar apparaîtra dans le dossier target/.
Création du Dockerfile
\nPour minimiser la taille de l'image et améliorer la sécurité, utilisons une construction multi-étapes (multi-stage build).
\n# Étape 1 : compilation\nFROM maven:3.8.6-openjdk-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests\n\n# Étape 2 : image finale\nFROM openjdk:17-jdk-slim\nWORKDIR /app\nCOPY --from=builder /app/target/my-app-1.0.0.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nConstruction et publication de l'image
\ndocker build -t my-java-app:1.0.0 .\ndocker tag my-java-app:1.0.0 your-dockerhub/my-java-app:1.0.0\ndocker push your-dockerhub/my-java-app:1.0.0\n\n2. Création des manifestes Kubernetes
\n\nKubernetes utilise une approche déclarative. Nous allons décrire l'état souhaité du système dans des fichiers YAML.
\n\nDeployment — gestion des pods
\nCréez le fichier deployment.yaml :
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: java-app-deployment\n labels:\n app: java-app\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: java-app\n template:\n metadata:\n labels:\n app: java-app\n spec:\n containers:\n - name: java-app\n image: your-dockerhub/my-java-app:1.0.0\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "256Mi"\n cpu: "250m"\n limits:\n memory: "512Mi"\n cpu: "500m"\n livenessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 30\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 20\n periodSeconds: 5\n\nService — garantie d'accès
\nCréez le fichier service.yaml :
apiVersion: v1\nkind: Service\nmetadata:\n name: java-app-service\nspec:\n selector:\n app: java-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nConfigMap — externalisation de la configuration
\nPour stocker les variables d'environnement, créez configmap.yaml :
apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: app-config\ndata:\n SPRING_PROFILES_ACTIVE: "prod"\n DB_URL: "jdbc:postgresql://postgres-service:5432/mydb"\n\n3. Déploiement dans le cluster et vérification
\n\nAppliquons maintenant tous les manifestes au cluster. Assurez-vous que kubectl est configuré et que vous êtes connecté au contexte approprié.
Application des manifestes
\nkubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nVérification de l'état
\nkubectl get pods\nkubectl get deployments\nkubectl get services\nVous devez