User Tools

Site Tools


devops:docker:kubernetes:tutorial-springboot

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
devops:docker:kubernetes:tutorial-springboot [2024/03/04 21:48] skipidardevops:docker:kubernetes:tutorial-springboot [2024/03/05 21:51] (current) skipidar
Line 6: Line 6:
  
 <sxh> <sxh>
-$ ./gradlew bootJar+$ ./gradlew bootJar  --args='--server.port=8888'
 Starting a Gradle Daemon, 1 busy and 1 stopped Daemons could not be reused, use --status for details Starting a Gradle Daemon, 1 busy and 1 stopped Daemons could not be reused, use --status for details
  
Line 35: Line 35:
 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) 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)
 </sxh> </sxh>
 +
 +
 +Building the image:
 +
 +<sxh>
 +$ ./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
 +</sxh>
 +
 +
 +Running
 +
 +<sxh>
 +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)
 +</sxh>
 +
 +
 +
 +Generate deployment config
 +
 +<sxh shell>
 +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
 +</sxh>
 +
 +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. 
 +
 +
 +
 +
 +
 +<sxh shell>
 +
 +skip@desktop:/mnt/d/1PROJEKTE/Kubernete-tutorials-springboot$  kubectl get all
 +NAME                        READY   STATUS             RESTARTS   AGE
 +pod/demo-86795d784d-2bc82   0/    ImagePullBackOff            91m
 +
 +NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
 +service/demo         ClusterIP   10.101.245.55   <none>        8080/TCP   91m
 +service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP    25h
 +
 +NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
 +deployment.apps/demo   0/               0           91m
 +
 +NAME                              DESIRED   CURRENT   READY   AGE
 +replicaset.apps/demo-86795d784d                         91m
 +
 +</sxh>
 +
 +
 +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:
 +
 +
 +
 +<sxh shell>
 +kubectl port-forward svc/demo 8080:8080
 +</sxh>
 +
 +
 +
 +**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
 +
 +<sxh>
 +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
 +</sxh>
 +
 +
 +**Step2:** 
 +
 +Use ''eval $(minikube docker-env)'' to switch to container cache within minikube.
 +
 +After taht ''docker images'' will show you minikube containers.
 +
 +<sxh shell>
 +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
 +</sxh>
 +
 +
 +
 +
 +
 +Now finally you can run a container with image 'image: springguides/demo'
 +
 +<sxh>
 +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/    Running            3s
 +
 +NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
 +service/demo         ClusterIP   10.97.44.9   <none>        8080/TCP   3s
 +service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    26h
 +
 +NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
 +deployment.apps/demo   1/               1           3s
 +
 +NAME                              DESIRED   CURRENT   READY   AGE
 +replicaset.apps/demo-6f64658b59                         3s
 +
 +</sxh>
 +
 +
 +Forwarding port 
 +
 +<sxh>
 +kubectl port-forward svc/demo 8080:8080
 +</sxh>
 +
 +
 +
 +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
 +<sxh>
 +curl localhost:8080/actuator/health
 +</sxh>
 +
devops/docker/kubernetes/tutorial-springboot.1709588903.txt.gz · Last modified: by skipidar