Java Application Development and
Containerization
Java Application Design and Build
Process
Structuring a modern Java project
Working with Maven or Gradle
Creating a simple RESTful API with Spring Boot
Building runnable jar files for deployment
Introduction to Containerization with
Docker
Why containerize Java applications
Writing Dockerfiles for Java apps
Optimizing image size and startup time
Building and running Java containers locally
Managing Application Configuration
Using environment variables and application properties
Profiles and externalized configuration in Spring Boot
Secure secrets handling
Deploying Java Applications on
Kubernetes
Kubernetes Fundamentals for Java
Developers
Overview of Kubernetes architecture
Pods, Deployments, Services, and Namespaces
kubectl commands and YAML resources
Understanding cluster behavior
Deploying Java Containers to Kubernetes
Writing Kubernetes manifests for Java apps
Exposing apps via Services and Ingress
Configuring environment variables, ports, and resource
requests
Configuration and Secrets Management
Creating and mounting ConfigMaps
Managing secrets in Spring Boot via Kubernetes
Environment variable injection and volume mounts
Health Checks and Lifecycle Hooks
Readiness and liveness probes for Java containers
Graceful shutdown and preStop hooks
Handling failed pods and restarts
Scaling, Monitoring, and Updating Java
Apps on Kubernetes
Scaling and Resource Management
Horizontal Pod Autoscaler for Java workloads
Setting CPU/memory limits and requests
Resource tuning for JVM inside containers
Observability and Logging
Accessing logs from Java pods
Exporting metrics with Prometheus and Micrometer
Integrating with Grafana dashboards
Performing Rolling Updates and
Rollbacks
Strategy configuration in deployments
Updating application version with zero downtime
Rollback handling and version control
Troubleshooting and Debugging in
Kubernetes
Debugging failed pods and crash loops
kubectl exec and log inspection
Common JVM and memory issues in containers
Hands-on Exercises
Summary and Conclusion