https://spring.io/guides/gs/spring-boot-kubernetes To build the jar use: $ ./gradlew bootJar --args='--server.port=8888' Starting a Gradle Daemon, 1 busy and 1 stopped Daemons could not be reused, use --status for details BUILD SUCCESSFUL in 11s 4 actionable tasks: 1 executed, 3 up-to-date To run $ java -jar build/libs/demo-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.3) 2024-03-04T22:46:38.269+01:00 INFO 47724 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication v0.0.1-SNAPSHOT using Java 17.0.4 with PID 47724 (/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot/build/libs/demo-0.0.1-SNAPSHOT.jar started by skip in /mnt/d/1PROJEKTE/Kubernete-tutorials-springboot) 2024-03-04T22:46:38.282+01:00 INFO 47724 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default" ^X^C2024-03-04T22:46:40.721+01:00 INFO 47724 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator' 2024-03-04T22:46:41.296+01:00 INFO 47724 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port 8080 2024-03-04T22:46:41.311+01:00 INFO 47724 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 4.003 seconds (process running for 4.858) Building the image: $ ./gradlew bootBuildImage [creator] Adding label 'io.buildpacks.project.metadata' [creator] Adding label 'org.opencontainers.image.title' [creator] Adding label 'org.opencontainers.image.version' [creator] Adding label 'org.springframework.boot.version' [creator] Setting default process type 'web' [creator] Saving docker.io/library/demo:0.0.1-SNAPSHOT... [creator] *** Images (b57e814aa8fb): [creator] docker.io/library/demo:0.0.1-SNAPSHOT [creator] Adding cache layer 'paketo-buildpacks/syft:syft' [creator] Adding cache layer 'buildpacksio/lifecycle:cache.sbom' Successfully built image 'docker.io/library/demo:0.0.1-SNAPSHOT' BUILD SUCCESSFUL in 1m 6s 5 actionable tasks: 1 executed, 4 up-to-date skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE paketobuildpacks/run-jammy-base latest ddb21b4d22de 6 days ago 111MB gcr.io/k8s-minikube/kicbase v0.0.42 dbc648475405 3 months ago 1.2GB gcr.io/k8s-minikube/kicbase v0.0.30 1312ccd2422d 2 years ago 1.14GB demo 0.0.1-SNAPSHOT b57e814aa8fb 44 years ago 307MB paketobuildpacks/builder-jammy-base latest d00577c76e33 44 years ago 1.46GB Running docker run -p 8080:8080 demo:0.0.1-SNAPSHOT Setting Active Processor Count to 20 Calculating JVM memory based on 30175084K available memory For more information on this calculation, see https://paketo.io/docs/reference/java-reference/#memory-calculator Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx29783343K -XX:MaxMetaspaceSize=84540K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 30175084K, Thread Count: 50, Loaded Class Count: 12512, Headroom: 0%) Enabling Java Native Memory Tracking Adding 137 container CA certificates to JVM truststore Spring Cloud Bindings Enabled Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -XX:+ExitOnOutOfMemoryError -XX:ActiveProcessorCount=20 -XX:MaxDirectMemorySize=10M -Xmx29783343K -XX:MaxMetaspaceSize=84540K -XX:ReservedCodeCacheSize=240M -Xss1M -XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics -Dorg.springframework.cloud.bindings.boot.enable=true . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.3) Generate deployment config kubectl create deployment demo --image=springguides/demo --dry-run -o=yaml > deployment.yaml echo --- >> deployment.yaml kubectl create service clusterip demo --tcp=8080:8080 --dry-run -o=yaml >> deployment.yaml Manifests are YAML files containing multiple resources separated by the "---" separator. * **Service in Kubernetes**: A service acts as an abstraction layer for a set of Pods, providing a network identity for them. This allows other applications within the cluster to discover and connect to these Pods using the service's name and port instead of individual Pod IPs. * **ClusterIP Service Type**: When you use clusterip, you're creating a service that has a virtual IP address assigned within the cluster. **This IP address is only accessible from within the cluster** and cannot be directly accessed from the outside world. * **Benefits**: ClusterIP services are useful for applications that only need to communicate with other services or Pods within the cluster. skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ kubectl get all NAME READY STATUS RESTARTS AGE pod/demo-86795d784d-2bc82 0/1 ImagePullBackOff 0 91m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo ClusterIP 10.101.245.55 8080/TCP 91m service/kubernetes ClusterIP 10.96.0.1 443/TCP 25h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo 0/1 1 0 91m NAME DESIRED CURRENT READY AGE replicaset.apps/demo-86795d784d 1 1 0 91m Now you need to be able to connect to the application, which you have exposed as a Service in Kubernetes. One way to do that, which works great at development time, is to create an SSH tunnel: kubectl port-forward svc/demo 8080:8080 **Kubernetes usually uses REMOTE images from repo.** To fix: **Step1:** Artificially add the image to the minikube cache. Achtung: work around bug https://github.com/kubernetes/minikube/issues/18021 skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ docker image save -o image.tar springguides/demo:latest skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ minikube image load image.tar **Step2:** Use ''eval $(minikube docker-env)'' to switch to container cache within minikube. After taht ''docker images'' will show you minikube containers. skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ eval $(minikube docker-env) skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker latest e5fbe8997fd9 11 days ago 348MB k8s.gcr.io/kube-apiserver v1.23.3 f40be0088a83 2 years ago 135MB k8s.gcr.io/kube-controller-manager v1.23.3 b07520cd7ab7 2 years ago 125MB k8s.gcr.io/kube-scheduler v1.23.3 99a3486be4f2 2 years ago 53.5MB k8s.gcr.io/kube-proxy v1.23.3 9b7cc9982109 2 years ago 112MB k8s.gcr.io/etcd 3.5.1-0 25f8c7f3da61 2 years ago 293MB k8s.gcr.io/coredns/coredns v1.8.6 a4ca41631cc7 2 years ago 46.8MB k8s.gcr.io/pause 3.6 6270bb605e12 2 years ago 683kB kubernetesui/dashboard v2.3.1 e1482a24335a 2 years ago 220MB kubernetesui/metrics-scraper v1.0.7 7801cfc6d5c0 2 years ago 34.4MB gcr.io/k8s-minikube/storage-provisioner v5 6e38f40d628d 2 years ago 31.5MB springguides/demo latest b57e814aa8fb 44 years ago 307MB Now finally you can run a container with image 'image: springguides/demo' skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ kubectl apply -f deployment.yaml deployment.apps/demo created service/demo created skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$ kubectl get all NAME READY STATUS RESTARTS AGE pod/demo-6f64658b59-swj5z 1/1 Running 0 3s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/demo ClusterIP 10.97.44.9 8080/TCP 3s service/kubernetes ClusterIP 10.96.0.1 443/TCP 26h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/demo 1/1 1 1 3s NAME DESIRED CURRENT READY AGE replicaset.apps/demo-6f64658b59 1 1 1 3s Forwarding port kubectl port-forward svc/demo 8080:8080 kubectl: This is the command-line tool used to interact with a Kubernetes cluster. port-forward: This is a subcommand of kubectl specifically designed for forwarding ports from Pods or Services within the cluster to your local machine. svc/demo: This specifies the target resource for port forwarding. It indicates a Service named demo in the current namespace. 8080:8080: This defines the port mapping. The first 8080 represents the local port on your machine that will be used to access the forwarded service. The second 8080 indicates the port on the target service within the cluster. You can now reach the service on 8080 curl localhost:8080/actuator/health