Déploiement Java sur Kubernetes : guide de base
Kubernetes (K8s) est devenu le standard de facto pour l'orchestration d'applications conteneurisées. Si vous êtes développeur Java, savoir déployer vos applications sur Kubernetes n'est pas seulement un atout, mais une nécessité dans la culture DevOps moderne. Dans ce guide, nous allons parcourir le chemin complet, de la création d'une simple application Java à son déploiement dans un cluster Kubernetes. Vous apprendrez comment empaqueter l'application dans une image Docker, écrire les manifestes nécessaires et l'exécuter dans un environnement de type production.
1. Préparation de l'application Java et de l'image Docker
Avant de déployer une application sur Kubernetes, il faut la conteneuriser. Docker est le moyen standard d'empaqueter les applications Java avec leurs dépendances. Considérons un simple service REST avec Spring Boot.
Créons la classe HelloController.java :
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class HelloController {
@GetMapping("/") public String hello() { return "Hello from Java on Kubernetes!"; }}Créons maintenant un Dockerfile pour construire l'image. Utilisons une construction multi-stage pour minimiser la taille de l'image finale :
FROM maven:3.8.5-openjdk-17 AS buildWORKDIR /appCOPY pom.xml .COPY src ./srcRUN mvn clean package -DskipTests
FROM openjdk:17-jdk-slimWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]Construisez l'image avec la commande docker build -t my-java-app:latest . et exécutez-la localement pour vérifier : docker run -p 8080:8080 my-java-app. Si tout fonctionne, vous pouvez charger l'image dans un registre (par exemple, Docker Hub) :
docker tag my-java-app:latest yourusername/my-java-app:latestdocker push yourusername/my-java-app:latest2. Manifestes Kubernetes de base
Pour le déploiement sur Kubernetes, vous aurez besoin d'au moins deux ressources : un Deployment (responsable de la gestion des pods) et un Service (assure l'accès réseau).
Créez le fichier deployment.yaml :
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app-deployment labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/my-java-app:latest ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 20 periodSeconds: 5Créez maintenant service.yaml pour rendre l'application accessible à l'intérieur du cluster :
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPSi vous devez ouvrir l'accès depuis l'extérieur (par exemple, pour les tests), changez le type en LoadBalancer ou utilisez NodePort.
3. Déploiement dans le cluster
Assurez-vous d'avoir accès à un cluster Kubernetes (par exemple, Minikube local ou un service cloud). Appliquez les manifestes :
kubectl apply -f deployment.yamlkubectl apply -f service.yaml