© Copyright 2019 Pivotal Software, Inc. All rights Reserved.
Jay Lee(jaylee@pivotal.io)
Advisory Platform Architect
Spring on PKS(Kubernetes)
Cover w/ Image
Agenda
■ Spring Update
■ How to Build Container Image?
■ Memory Configuration
■ testcontainer
■ Spring Cloud Kubernetes
Spring Update
Spring Boot 2.2
• Based on Spring Framework 5.2
• Spring Boot 1.x is end-of-life as of August 1st
• Java 13 Support added
• RSocket support
• 20~40% latency improvement over Sprinng Boot 2.1
Spring Boot 2.2 and Container
• Cloud Platform Kubernetes detection
import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
import org.springframework.boot.cloud.CloudPlatform;
import org.springframework.stereotype.Service;
@Service
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
public class K8sService {
}
Startup Time
How to Build Container Image
“Writing a quality Dockerfile is
still my users’ biggest point of friction”
David Dollar, CEO, Convox (a k8s/Docker PaaS)
Best practices for building containers
• Package a single app per container
• Properly handle PID 1, signal handling, and zombie processes
• Optimize for the Docker build cache
• Remove unnecessary tools
• Build the smallest image possible
• Use vulnerability scanning in Container Registry
• Properly tag your images
• Carefully consider whether to use a public image
From: https://cloud.google.com/solutions/best-practices-for-building-containers
Best practices for building containers
• Package a single app per container
• Properly handle PID 1, signal handling, and zombie processes
• Optimize for the Docker build cache
• Remove unnecessary tools
• Build the smallest image possible
• Use vulnerability scanning in Container Registry
• Properly tag your images
• Carefully consider whether to use a public image
From: https://cloud.google.com/solutions/best-practices-for-building-containers
Cloud Native Buildpack
kpack
Builder
BuildImage
Source
Resolver
SecretSecret
Git
Repository
Container
Registry
repository
Kubernetes resource
kpack resource
Buildpack
image
application
source code
built container image
Pod
Build
Build
Build
Build
Service
Account
kpack
container registry
Controllers
riff
riff: core and streaming
$ riff function create...
Function
Application
build.projectriff.io
Deployer
Stream
Processor
core.projectriff.io
streaming.projectriff.io
CRDs
SourceResolver
Builder
Build
Image
Deployment
ReplicaSet
Pod
Service
Kubernetes
CRDs
$ riff core deployer create...
$ riff streaming processor create...
Startup Time
Memory Configuration
Java Improvements for Docker Containers
• -XX:+UseContainerSupport added and backported to JDK
8u191 -
https://www.oracle.com/technetwork/java/javase/8u191-
relnotes-5032181.html
• -XX:ActiveProcessorCount
Cloud Foundry Java Buildpack
• java-buildpack-memory-calculator
• -Xmx404417K
• -Xss1M
• -XX:ReservedCodeCacheSize=240M
• -XX:MaxDirectMemorySize=10M
• -XX:MaxMetaspaceSize=132158K
testcontainer
testcontainer
• Java library that supports JUnit tests, providing lightweight, throwaway instances of
common databases, Selenium web browsers, or anything else that can run in a
Docker container.
• Data access layer integration tests
• Application integration tests
• UI/Acceptance tests
What is Spring Cloud
Kubernetes?
Why Spring Cloud Kubernetes?
Write Portable apps using Spring Cloud
• Same source code for different environments
• Spring Cloud provides right platform abstraction on no
matter which environments you use
• Seamless integration between Kubernetes and Spring
• Spring Cloud Kubernetes is GA since Feb 2019
Spring Cloud nicely fits with Kubernetes
Native Service Discovery
● Leverage Spring Cloud
Netflix without using
Eureka discovery server
● DiscoveryClient uses
Kubernetes DNS resolver
and cluster events
● Use @LoadBalanced and
LoadBalancerClient for
client-side load balancing
● Spring Cloud
Circuitbreaker
support(Hystrix and
Resilience4j)
Pod Health Indicator
● Pod health indicator
contributes to Health
actuator(/actuator/health)
Kubernetes Aware
● When app is running in
Kubernetes, profile
kubernetes is
automatically enabled
ConfigMap/Secret Support
● Hot reload configuration
● Inject External
configuration properties
using ConfigMap
● Map Spring config support
with ConfigMap: @Value,
@ConfigurationProperties
● Load Secret values into
beans
Transforming How The World Builds Software
© Copyright 2019 Pivotal Software, Inc. All rights Reserved.

Spring on Kubernetes

  • 1.
    © Copyright 2019Pivotal Software, Inc. All rights Reserved. Jay Lee(jaylee@pivotal.io) Advisory Platform Architect Spring on PKS(Kubernetes)
  • 2.
    Cover w/ Image Agenda ■Spring Update ■ How to Build Container Image? ■ Memory Configuration ■ testcontainer ■ Spring Cloud Kubernetes
  • 3.
  • 4.
    Spring Boot 2.2 •Based on Spring Framework 5.2 • Spring Boot 1.x is end-of-life as of August 1st • Java 13 Support added • RSocket support • 20~40% latency improvement over Sprinng Boot 2.1
  • 5.
    Spring Boot 2.2and Container • Cloud Platform Kubernetes detection import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform; import org.springframework.boot.cloud.CloudPlatform; import org.springframework.stereotype.Service; @Service @ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) public class K8sService { }
  • 6.
  • 7.
    How to BuildContainer Image
  • 8.
    “Writing a qualityDockerfile is still my users’ biggest point of friction” David Dollar, CEO, Convox (a k8s/Docker PaaS)
  • 9.
    Best practices forbuilding containers • Package a single app per container • Properly handle PID 1, signal handling, and zombie processes • Optimize for the Docker build cache • Remove unnecessary tools • Build the smallest image possible • Use vulnerability scanning in Container Registry • Properly tag your images • Carefully consider whether to use a public image From: https://cloud.google.com/solutions/best-practices-for-building-containers
  • 10.
    Best practices forbuilding containers • Package a single app per container • Properly handle PID 1, signal handling, and zombie processes • Optimize for the Docker build cache • Remove unnecessary tools • Build the smallest image possible • Use vulnerability scanning in Container Registry • Properly tag your images • Carefully consider whether to use a public image From: https://cloud.google.com/solutions/best-practices-for-building-containers
  • 17.
  • 24.
  • 25.
    kpack container registry Controllers riff riff: coreand streaming $ riff function create... Function Application build.projectriff.io Deployer Stream Processor core.projectriff.io streaming.projectriff.io CRDs SourceResolver Builder Build Image Deployment ReplicaSet Pod Service Kubernetes CRDs $ riff core deployer create... $ riff streaming processor create...
  • 26.
  • 27.
  • 28.
    Java Improvements forDocker Containers • -XX:+UseContainerSupport added and backported to JDK 8u191 - https://www.oracle.com/technetwork/java/javase/8u191- relnotes-5032181.html • -XX:ActiveProcessorCount
  • 29.
    Cloud Foundry JavaBuildpack • java-buildpack-memory-calculator • -Xmx404417K • -Xss1M • -XX:ReservedCodeCacheSize=240M • -XX:MaxDirectMemorySize=10M • -XX:MaxMetaspaceSize=132158K
  • 30.
  • 32.
    testcontainer • Java librarythat supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. • Data access layer integration tests • Application integration tests • UI/Acceptance tests
  • 33.
    What is SpringCloud Kubernetes?
  • 34.
    Why Spring CloudKubernetes? Write Portable apps using Spring Cloud • Same source code for different environments • Spring Cloud provides right platform abstraction on no matter which environments you use • Seamless integration between Kubernetes and Spring • Spring Cloud Kubernetes is GA since Feb 2019
  • 35.
    Spring Cloud nicelyfits with Kubernetes Native Service Discovery ● Leverage Spring Cloud Netflix without using Eureka discovery server ● DiscoveryClient uses Kubernetes DNS resolver and cluster events ● Use @LoadBalanced and LoadBalancerClient for client-side load balancing ● Spring Cloud Circuitbreaker support(Hystrix and Resilience4j) Pod Health Indicator ● Pod health indicator contributes to Health actuator(/actuator/health) Kubernetes Aware ● When app is running in Kubernetes, profile kubernetes is automatically enabled ConfigMap/Secret Support ● Hot reload configuration ● Inject External configuration properties using ConfigMap ● Map Spring config support with ConfigMap: @Value, @ConfigurationProperties ● Load Secret values into beans
  • 36.
    Transforming How TheWorld Builds Software © Copyright 2019 Pivotal Software, Inc. All rights Reserved.