Deploy von Java auf Kubernetes: Ein grundlegendes Handbuch
Kubernetes (K8s) hat sich zum De-facto-Standard für die Orchestrierung containerisierter Anwendungen entwickelt. Wenn Sie ein Java-Entwickler sind, ist die Fähigkeit, Ihre Anwendungen in Kubernetes bereitzustellen, nicht nur ein Plus, sondern eine Notwendigkeit in der modernen DevOps-Kultur. In diesem Handbuch gehen wir den gesamten Weg von der Erstellung einer einfachen Java-Anwendung bis zu ihrem Deploy in einem Kubernetes-Cluster. Sie erfahren, wie Sie die Anwendung in ein Docker-Image packen, die erforderlichen Manifeste schreiben und sie in einer produktionsähnlichen Umgebung ausführen.
1. Vorbereitung der Java-Anwendung und des Docker-Images
Bevor Sie die Anwendung in Kubernetes deployen, muss sie containerisiert werden. Docker ist die Standardmethode zum Verpacken von Java-Anwendungen mit ihren Abhängigkeiten. Betrachten wir einen einfachen REST-Service auf Spring Boot.
Wir erstellen die Klasse 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!"; }}Jetzt erstellen wir ein Dockerfile zum Bauen des Images. Wir verwenden einen Multi-Stage-Build, um die Größe des endgültigen Images zu minimieren:
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"]Bauen Sie das Image mit dem Befehl docker build -t my-java-app:latest . und führen Sie es lokal zum Testen aus: docker run -p 8080:8080 my-java-app. Wenn alles funktioniert, können Sie das Image in eine Registry (z. B. Docker Hub) hochladen:
docker tag my-java-app:latest yourusername/my-java-app:latestdocker push yourusername/my-java-app:latest2. Grundlegende Kubernetes-Manifeste
Für den Deploy in Kubernetes werden mindestens zwei Ressourcen benötigt: Deployment (zuständig für die Verwaltung der Pods) und Service (stellt den Netzwerkzugriff sicher).
Erstellen Sie die Datei 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: 5Erstellen Sie nun service.yaml, um die Anwendung innerhalb des Clusters verfügbar zu machen:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPWenn Sie den Zugriff von außen öffnen müssen (z. B. zum Testen), ändern Sie den Typ auf LoadBalancer oder verwenden Sie NodePort.
3. Bereitstellung im Cluster
Stellen Sie sicher, dass Sie Zugriff auf den Kubernetes-Cluster haben (z. B. lokales Minikube oder ein Cloud-Dienst). Wenden Sie die Manifeste an:
kubectl apply -f deployment.yamlkubectl apply -f service.yaml