Bereitstellung von Java-Anwendungen auf Kubernetes: Vom Dockerfile zum laufenden Service
\n\nModerne Java-Entwicklung ist ohne Containerisierung und Orchestrierung undenkbar. Kubernetes (K8s) ist zum Standard für die Verwaltung von Mikroservices geworden, und die Fähigkeit, Java-Anwendungen in einem Cluster bereitzustellen, ist eine unverzichtbare Fähigkeit für Backend-Entwickler. In diesem Artikel gehen wir den gesamten Bereitstellungszyklus praktisch durch: vom Bau des Docker-Images mit der Java-Anwendung bis zur Konfiguration des Lastenausgleichs über Ingress.
\n\n1. Vorbereitung der Java-Anwendung und des Dockerfile
\n\nBevor Ihre Java-Anwendung in Kubernetes gelangt, muss sie in ein Docker-Image verpackt werden. Betrachten wir den klassischen Fall – eine Spring Boot-Anwendung, die als JAR-Datei gebaut wird.
\n\nProjekt-Build
\nAngenommen, wir haben ein Projekt, das über Maven gebaut wird. Führen Sie den folgenden Befehl im Projektstammverzeichnis aus:
\nmvn clean package -DskipTests\nAls Ergebnis erscheint im Ordner target/ die Datei my-app-1.0.0.jar.
Erstellung des Dockerfile
\nUm die Image-Größe zu minimieren und die Sicherheit zu erhöhen, verwenden wir einen Multi-Stage-Build.
\n# Stage 1: Build\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# Stage 2: Finales Image\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\nImage bauen und veröffentlichen
\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. Erstellung von Kubernetes-Manifesten
\n\nKubernetes verwendet einen deklarativen Ansatz. Wir beschreiben den gewünschten Zustand des Systems in YAML-Dateien.
\n\nDeployment – Pod-Verwaltung
\nErstellen Sie die Datei 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 – Zugriff ermöglichen
\nErstellen Sie die Datei 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 – Auslagerung der Konfiguration
\nZur Speicherung von Umgebungsvariablen erstellen Sie 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. Bereitstellung im Cluster und Überprüfung
\n\nWenden wir nun alle Manifeste auf den Cluster an. Stellen Sie sicher, dass kubectl konfiguriert ist und Sie mit dem richtigen Kontext verbunden sind.
Anwenden der Manifeste
\nkubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nStatus überprüfen
\nkubectl get pods\nkubectl get deployments\nkubectl get services\nSie sollten