Slide 1

Slide 1 text

@kevindubois From 0 to Production with Kubernetes Native Java Kevin Dubois (@kevindubois) Senior Principal Developer Advocate Red Hat

Slide 2

Slide 2 text

@kevindubois Kevin Dubois 🤘 Sr Principal Developer Advocate at Red Hat 🤘 Java Champion 🤘 Based in Belgium 󰎐 🤘 Speak English, Dutch, French, Italian 🤘 Open Source Contributor (Quarkus, Camel, Knative, ..) 🤘 Open Source Community Member (Belgian JUG, Belgian CNCF chapter) @[email protected] youtube.com/@thekevindubois github.com/kdubois

Slide 3

Slide 3 text

@kevindubois “Kube Native” Java !?

Slide 4

Slide 4 text

@kevindubois “Traditional” Java ● Throughput at the expense of footprint ● Long running at expense of startup speed ● Rich, dynamic behaviour for mutable systems “Kube Native” Java ● Throughput solved by scaling ● Ephemeral, immutable systems ● Footprint and startup speed matter

Slide 5

Slide 5 text

@kevindubois JVM Scaling increase of load triggers scale up event of pods

Slide 6

Slide 6 text

@kevindubois When you can’t scale fast enough…

Slide 7

Slide 7 text

@kevindubois CRaC

Slide 8

Slide 8 text

@kevindubois Quarkus + Native (via GraalVM) 12 MB Quarkus + JVM (via OpenJDK) 73 MB Traditional Cloud-Native Stack 136 MB Quarkus + Native (via GraalVM) 0.016 Seconds Quarkus + JVM (via OpenJDK) 0.943 Seconds Traditional Cloud-Native Stack 4.3 Seconds Supersonic. Subatomic. Java

Slide 9

Slide 9 text

@kevindubois Let’s start to build our app!

Slide 10

Slide 10 text

@kevindubois Architecture 3: Generate power (REST) Game Dashboard 1: Assign player Name & Team (REST) 6: Update dashboard (SSE) 2: Increment player cluster counter 4: Send power event 5: Receive power events

Slide 11

Slide 11 text

@kevindubois Architecture 3: Generate power (REST) Game Dashboard 4: Send power event 5: Receive power events

Slide 12

Slide 12 text

@kevindubois

Slide 13

Slide 13 text

@kevindubois @kevindubois

Slide 14

Slide 14 text

@kevindubois Container Running Sends traffic App not ready Ready??

Slide 15

Slide 15 text

@kevindubois After 2.6s (Kafka, DB, Caching) App is ready to receive traffic Container Running Sends traffic App not ready Ready??

Slide 16

Slide 16 text

@kevindubois Downtime of 2.6s Ready??

Slide 17

Slide 17 text

@kevindubois https://microprofile.io/

Slide 18

Slide 18 text

@kevindubois readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 10 periodSeconds: 3 Ready!

Slide 19

Slide 19 text

@kevindubois containers: - name: nginx-container image: nginx:latest ports: - containerPort: 80 volumes: - name: secret-volume secret: secretName: your-secret-name Kubernetes Secrets

Slide 20

Slide 20 text

@kevindubois resources: requests: memory: "300Mi" cpu: "250m" # 1/4 core limits: memory: "400Mi" cpu: "1000m" # 1 core Resource Limits

Slide 21

Slide 21 text

@kevindubois CPU Request More CPU Limit State your intentions

Slide 22

Slide 22 text

@kevindubois Memory Request More Memory Limit Burstable

Slide 23

Slide 23 text

@kevindubois Memory Request Limit Guaranteed

Slide 24

Slide 24 text

@kevindubois https://learn.microsoft.com/en-us/azure/developer/java/containers/overview vCPU cores Memory Heap Size GC Replicas 2 4Gb 75% Parallel 2 Some sensible starting numbers

Slide 25

Slide 25 text

@kevindubois https://learn.microsoft.com/en-us/azure/developer/java/containers/overview resources: requests: memory: "4000Mi" cpu: "2000m" limits: memory: "4000Mi" cpu: "2000m" - env: - name: JDK_JAVA_OPTIONS value: "-XX:+UseParallelGC -XX:MaxRAMPercentage=75" Sensible Initial Values ( JVM )

Slide 26

Slide 26 text

@kevindubois spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In values: - my-app topologyKey: "kubernetes.io/hostname" containers: Pod Affinity = lower latency

Slide 27

Slide 27 text

@kevindubois @kevindubois @alexsotob Observability

Slide 28

Slide 28 text

@kevindubois Ready for Production!

Slide 29

Slide 29 text

@kevindubois Push to give energy windmill Kafka Topic 2.Sends the interaction Dashboard: Green Energy Nickname Team Push/Tap to generate energy Cars that need energy Two teams competing (top 5 players) First team wins @kevindubois @alexsotob

Slide 30

Slide 30 text

@kevindubois Architecture 3: Generate power (REST) Game Dashboard 1: Assign player Name & Team (REST) 6: Update dashboard (SSE) 2: Increment player cluster counter 4: Send power event 5: Receive power events

Slide 31

Slide 31 text

@kevindubois YOU PLAY! Scan the QR Code with your phone to play

Slide 32

Slide 32 text

@kevindubois

Slide 33

Slide 33 text

@kevindubois

Slide 34

Slide 34 text

@kevindubois

Slide 35

Slide 35 text

@kevindubois

Slide 36

Slide 36 text

@kevindubois

Slide 37

Slide 37 text

@kevindubois

Slide 38

Slide 38 text

@kevindubois

Slide 39

Slide 39 text

@kevindubois @kevindubois @alexsotob What is GitOps?

Slide 40

Slide 40 text

@kevindubois Treat everything as code Git Commands Infrastructure as Code Operations through Git workflows Git Repository Git is the single source of truth @kevindubois @alexsotob What is GitOps?

Slide 41

Slide 41 text

@kevindubois Pull Request Source Git Repository Image Registry Config Git Repository Kubernetes Deploy Monitor Detect drift CD Take action GitOps Application Delivery Model

Slide 42

Slide 42 text

@kevindubois Shaking Time :)

Slide 43

Slide 43 text

@kevindubois V2 Scan the QR Code with your phone to play

Slide 44

Slide 44 text

@kevindubois github.com/kdubois/quarkus-kubernetes-kafka-db github.com/redhat-developer-demos/quinoa-wind-turbine

Slide 45

Slide 45 text

@kevindubois Free Developer e-Books & Tutorials! developers.redhat.com/eventtutorials

Slide 46

Slide 46 text

@kevindubois Start exploring in the OpenShift Sandbox. Learn containers, Kubernetes, and OpenShift in your browser. developers.redhat.com/developer-sandbox Try Red Hat's products and technologies without setup or configuration.

Slide 47

Slide 47 text

@kevindubois @thekevindubois kdubois @kevindubois