Einleitung: Warum Kubernetes für Java-Entwickler?
Die moderne Java-Entwicklung geht immer häufiger über das einfache Ausführen von JAR-Dateien auf einem Server hinaus. Die Microservices-Architektur, die Notwendigkeit der horizontalen Skalierung und Ausfallsicherheit führen zum Einsatz von Containern und Orchestratoren. Kubernetes (K8s) ist zum De-facto-Standard für die Verwaltung containerisierter Anwendungen geworden. In diesem Leitfaden werden wir durchgehen, wie man eine typische Java-Anwendung (z. B. auf Spring Boot) in einem Kubernetes-Cluster bereitstellt. Sie erfahren, wie Sie die Anwendung in ein Docker-Image packen, die erforderlichen Manifeste erstellen und sie ausführen.
1. Vorbereitung der Java-Anwendung und Erstellung des Docker-Images
Bevor sie in Kubernetes gelangt, muss die Java-Anwendung in einen Container verpackt werden. Betrachten wir ein einfaches Beispiel mit Spring Boot.
1.1. Beispiel einer Java-Anwendung
Wir erstellen einen minimalen REST-Controller, der die Version der Anwendung zurückgibt:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication@RestControllerpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }
@GetMapping("/") public String home() { return "Java App running on Kubernetes v1.0"; }}1.2. Erstellung des Dockerfile
Für Java-Anwendungen ist es optimal, einen Multi-Stage-Build zu verwenden, um die Größe des endgültigen Images zu reduzieren:
FROM maven:3.8.6-eclipse-temurin-17 AS builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offline -BCOPY src ./srcRUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]1.3. Erstellung und Veröffentlichung des Images
Erstellen Sie das Image und senden Sie es an eine Registry (z. B. Docker Hub):
docker build -t yourusername/java-k8s-demo:1.0 .docker push yourusername/java-k8s-demo:1.02. Wichtige Kubernetes-Objekte für die Java-Bereitstellung
Für die Bereitstellung einer Java-Anwendung werden mindestens zwei Ressourcen benötigt: Deployment (verwaltet Replikate und Updates) und Service (stellt den Netzwerkzugriff sicher).
2.1. Deployment-Manifest
Erstellen Sie die Datei deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/java-k8s-demo:1.0 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: 5Wichtig: Verwenden Sie für Spring Boot Actuator für Health Checks. Geben Sie requests und limits an, damit Kubernetes die Ressourcen richtig verteilt.
2.2. Service-Manifest
Erstellen Sie service.yaml für den internen Zugriff auf die Pods:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port