1 of 127

1

9 Steps to Awesome with Kubernetes

Burr Sutter (burrsutter.com)

burrsutter@gmail.com

@burrsutter - bit.ly/9stepsawesome

2 of 127

Burr Sutter (burrsutter.com)

  • Currently works at Red Hat
  • Featured speaker at technology events around the globe
  • A Java Champion since 2005
  • Former President of the Atlanta Java User Group
  • Founded the DevNexus conference
  • Always looking for technologies that enable developers+operators to deliver better software, �ever faster

@burrsutter - bit.ly/9stepsawesome

3 of 127

Learning Resources

@burrsutter - bit.ly/9stepsawesome

4 of 127

Watch at your own pace (pause button)

@burrsutter - bit.ly/9stepsawesome

5 of 127

3 classes on O'Reilly Live Training

Kubernetes Basics

(9 Steps to Awesome)

Istio

(Enter the Service Mesh)

Knative

(Kubernetes Serverless)

https://www.oreilly.com/live-training/

Control-F and search for "burr"

@burrsutter - bit.ly/9stepsawesome

6 of 127

@burrsutter - bit.ly/9stepsawesome

7 of 127

Your Journey to Awesomeness

Self-Service,

On-Demand,

Elastic Infrastructure

Automation

CI & CD

Deployment Pipeline

Advanced

Deployment

Techniques

Microservices

Re-Org to

DevOps

@burrsutter - bit.ly/9stepsawesome

8 of 127

MVP

@burrsutter - bit.ly/9stepsawesome

9 of 127

Continuous Delivery, Deployment, Improvement

Agility

@burrsutter - bit.ly/9stepsawesome

10 of 127

3 Month Deployment Cycle

3 Months BEFORE you gain Feedback and Learn

@burrsutter - bit.ly/9stepsawesome

11 of 127

Love Thy Mono

Old School New School

@burrsutter - bit.ly/9stepsawesome

12 of 127

9 Steps

0 - Introduction�1 - Installation & Getting Started�2 - Building Images, Running Containers�3 - Logs�4 - oc/kubectl exec magic�5 - Configuration & Environment�6 - Service discovery & load-balancing�7 - Live & Ready�8 - Rolling updates, Canaries, Blue/Green�9 - Debugging Databases�Bonus Items

@burrsutter - bit.ly/9stepsawesome

13 of 127

Step 0: Introduction

@burrsutter - bit.ly/9stepsawesome

14 of 127

Email

MyApp.war has been tested with the following

On my Windows 7 desktop

JDK 1.8.43

Wildfly 9

Configuration:

Datasource: MySQLDS

Tested with: mysql-connector-java-5.1.31-bin.jar

Production Environment

Red Hat Enterprise Linux 6.2

JRE 1.7.3

WebSphere 8.5.5

Oracle 9

@burrsutter - bit.ly/9stepsawesome

15 of 127

Dockerfile

Container Guest OS

Java App Server

custom configuration

FROM centos/wildfly

COPY xyz.xml /opt/myserver/configuration/

COPY mysql-connector-java-5.1.31-bin.jar /opt/wildfly/standalone/deployments/COPY mysql-sample-ds.xml /opt/wildfly/standalone/deployments/

COPY myapp/target/your.war /opt/wildfly/standalone/deployments/

your.war

dependencies

@burrsutter - bit.ly/9stepsawesome

16 of 127

DevOps Challenges for Multiple Containers

  • How to scale?
  • How to avoid port conflicts?
  • How to manage them on multiple hosts?
  • What happens if a host has trouble?
  • How to keep them running?
  • How to update them?
  • Rebuild Container Images?

Node

Node

Node

Node

Node

Logger

Node

@burrsutter - bit.ly/9stepsawesome

17 of 127

A Challenge

Server Hardware

Operating System

Application Server

.war or .ear

Java Virtual Machine

Custom Configuration

Linux Kernel Version & Distribution

Java 1.6.6_45 or Java 1.7.0_67

Weblogic 10.x.y, Tomcat 6.x.y, JBoss EAP 6.x.y

JDBC driver, datasource, JMS queue, users

Have you ever had “/” vs “\” break your app? Or perhaps needed a unique version of a JDBC driver? Or had a datasource with a slightly misspelled JNDI name? Or received a patch for the JVM or app server that broke your code?

Containerize

Your

App

@burrsutter - bit.ly/9stepsawesome

18 of 127

@burrsutter - bit.ly/9stepsawesome

19 of 127

  • Greek for “Helmsman,” also the root of the word “Governor” (from latin: gubernator)
  • Container orchestrator
  • Supports multiple cloud and bare-metal environments
  • Inspired by Google’s experience with containers
  • Open source, written in Go
  • Manage applications, not machines

Meet Kubernetes

@burrsutter - bit.ly/9stepsawesome

20 of 127

Key Capabilities

  • Self-healing
  • Horizontal Manual & Auto Scaling
  • Automatic Restarting
  • Scheduled across hosts
  • Built-in load-balancer
  • Rolling upgrades

@burrsutter - bit.ly/9stepsawesome

21 of 127

@burrsutter - bit.ly/9stepsawesome

22 of 127

Pods

A group of whales is commonly referred to as a pod and a pod usually consists a group of whales that have bonded together either because of biological reasons or through friendships developed between two or more whales.

In many cases a typical whale pod consists of anywhere from 2 to 30 whales or more.*

*http://www.whalefacts.org/what-is-a-group-of-whales-called/

@burrsutter - bit.ly/9stepsawesome

23 of 127

Kubernetes Terms

Label

  • 1+ containers
  • Shared IP
  • Shared storage (ephemeral)
  • Shared resources
  • Shared lifecycle
  • The Desired State - replicas,�pod template: health checks, resources,�image
  • Grouping of pods (acting as one) has stable virtual IP and DNS name
  • Key/Value pairs associated with Kubernetes objects�(env=production)
  • Network available storage
  • PVs and PVCs

@burrsutter - bit.ly/9stepsawesome

24 of 127

Kubernetes Cluster - Nodes

Master

Node

Node

Istio�proxy

Node

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

kubelet

@burrsutter

25 of 127

Kubernetes Cluster - Declarative

Master

Node

Node

Istio�proxy

Node

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

kubelet

image: repo/mytomcat:v1

replicas: 4

@burrsutter

26 of 127

Kubernetes Cluster - 4 Tomcats

Master

Node

Node

Istio�proxy

Node

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

kubelet

@burrsutter

27 of 127

Kubernetes Cluster - Pod Fail

Master

Node

Node

Istio�proxy

Node

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

kubelet

X

@burrsutter

28 of 127

Kubernetes Cluster - Correcting

Master

Node

Node

Istio�proxy

Node

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

kubelet

@burrsutter

29 of 127

Kubernetes Cluster - Node Fail

Master

Node

Node

Istio�proxy

Node

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

kubelet

X

@burrsutter

30 of 127

Kubernetes Cluster

Master

Node

Node

Istio�proxy

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

@burrsutter

31 of 127

Kubernetes Cluster - New Node

Master

Node

Node

Istio�proxy

Node

Node

Node

Dev

Ops

api

scheduler

controllers

kubelet

kubelet

kubelet

kubelet

kubelet

Node

kubelet

@burrsutter

32 of 127

Labels

App: Cool

Env: Dev

Version: 1.0

App: Cool

Env: Prod

Version: 1.0

App: Cool

Env: Dev

Version: 2.0

App: Cool

Env: Prod

Version: 2.0

Node

Logger

Node

Node

Node

@burrsutter - bit.ly/9stepsawesome

33 of 127

Labels App:Cool

App: Cool

Env: Dev

Version: 1.0

App: Cool

Env: Prod

Version: 1.0

App: Cool

Env: Dev

Version: 2.0

App: Cool

Env: Prod

Version: 2.0

Node

Logger

Node

Node

Node

@burrsutter - bit.ly/9stepsawesome

34 of 127

Labels Env:Dev

App: Cool

Env: Dev

Version: 1.0

App: Cool

Env: Prod

Version: 1.0

App: Cool

Env: Dev

Version: 2.0

App: Cool

Env: Prod

Version: 2.0

Node

Logger

Node

Node

Node

@burrsutter - bit.ly/9stepsawesome

35 of 127

Labels Env:Prod

App: Cool

Env: Dev

Version: 1.0

App: Cool

Env: Prod

Version: 1.0

App: Cool

Env: Dev

Version: 2.0

App: Cool

Env: Prod

Version: 2.0

Node

Logger

Node

Node

Node

@burrsutter - bit.ly/9stepsawesome

36 of 127

Labels Version:1.0

App: Cool

Env: Dev

Version: 1.0

App: Cool

Env: Prod

Version: 1.0

App: Cool

Env: Dev

Version: 2.0

App: Cool

Env: Prod

Version: 2.0

Node

Logger

Node

Node

Node

@burrsutter - bit.ly/9stepsawesome

37 of 127

@burrsutter - bit.ly/9stepsawesome

38 of 127

@burrsutter - bit.ly/9stepsawesome

39 of 127

kubectl commands

kubectl get namespaces

kubectl get pods -n mynamespace

kubectl run myvertx --image=burr/myvertx:v1 --port=8080

kubectl logs myvertx-kk605

kubectl expose deployment --port=8080 myvertx --type=LoadBalancer

kubectl scale deployment myvertx --replicas=3

kubectl set image deployment/myvertx myvertx=burr/myvertx:v2

@burrsutter - bit.ly/9stepsawesome

40 of 127

Microservices == Distributed Computing

Pod

Container

JVM

Service A

Pod

Container

JVM

Service B

Pod

Container

JVM

Service C

@burrsutter - bit.ly/9stepsawesome

41 of 127

java -jar myapp.jar

DropWizard

www.dropwizard.io

JAX-RS API

First to market

DropWizard Metrics

Spring Boot

spring.io/projects/�spring-boot

Spring API (@RestController)

‘Starter’ POMs: �start.spring.io

Thorntail

thorntail.io

MicroProfile.io

‘Starter’ POMs: thorntail.io/generator

Vert.x

vertx.io

Reactive

Async�non-blocking

RxJava

vertx run myhttp.java

Micronaut

micronaut.io

"Compile-time" dependency injection

@burrsutter - bit.ly/9stepsawesome

42 of 127

Quarkus: Supersonic, Subatomic Java

Kubernetes Native

@burrsutter - bit.ly/9stepsawesome

43 of 127

History of Microservices

@burrsutter - bit.ly/9stepsawesome

Continuous

Integration

via XP

1999

AWS EC2

2006

DropWizard

May 2011

Agile

Manifesto

Feb

2001

NETFLIX

to AWS

2010

Ribbon

March� 2012

Hystrix

March 2012

Eureka

July 2012

Microservices

Assess

Thoughtworks

Radar

March 2012

Microservices

Defined

Thoughtworks

Fowler, Lewis

March 2014

Java EE6

2009

DevOps

2009

Docker

March

2013

Vert.x

June 2011

2

0

1

5

@burrsutter - bit.ly/9stepsawesome

44 of 127

2015

Launch 1000+

Containers

Audience

Claims a Container

@burrsutter - bit.ly/9stepsawesome

45 of 127

MyService

Tracing

API

Discovery

Invocation

Resilience

Pipeline

Authentication

Logging

Elasticity

Monitoring

Polyglot Microservices Platform

@burrsutter - bit.ly/9stepsawesome

46 of 127

9 Steps

@burrsutter - bit.ly/9stepsawesome

47 of 127

Step 1: Installation

@burrsutter - bit.ly/9stepsawesome

48 of 127

  1. Localhost Development
    1. minikube (kubectl) (docs)
    2. KinD
    3. Docker Desktop
  2. Hosted Kubernetes Cluster
  3. Many more… https://kubernetes.io/docs/setup/pick-right-solution/#turnkey-cloud-solutions

Lots of Options

Step 1: Installation

@burrsutter - bit.ly/9stepsawesome

49 of 127

  • bash: documented commands are based on bash
  • docker and/or podman: build images
  • git: pull resources from github
  • JDK & Apache Maven: if you wish to compile Java
  • curl, tar: downloading and unpacking installations
  • Homebrew for Mac: package installation tool
  • kubectl: the primary tool you will be using
  • minikube: on-laptop, single-node Kubernetes cluster

Tools

@burrsutter

50 of 127

Kubernetes Options

@burrsutter

51 of 127

@burrsutter - bit.ly/9stepsawesome

52 of 127

Step 2: Building Images

@burrsutter - bit.ly/9stepsawesome

53 of 127

  • Find a base Image: Docker Hub, quay.io, gcr.io, access.redhat.com/containers
  • Craft your Dockerfile
  • Build your Image: docker build -t mystuff/myimage:v1 .
    • If remote, do "docker push"
  • kubectl apply -f myDeployment.yml
  • kubectl apply -f myService.yml
  • kubectl apply -f myIngress.yml
  • Expose a URL via your Kubernetes distribution's load-balancer

Running your App on Kubernetes

@burrsutter - bit.ly/9stepsawesome

54 of 127

Step 2: Building Images

Options Include:

@burrsutter - bit.ly/9stepsawesome

55 of 127

Managing Yaml

Options Include:

@burrsutter - bit.ly/9stepsawesome

56 of 127

Beyond Managing Yaml - Operators

Phase I

Phase II

Phase III

Phase IV

Phase V

Installation

Provisioning

Configuration

Management

Updates

Patches and Minors

Full Lifecycle

App and Storage (backup, failure, recovery)

Deep Insights

Metrics, alerts, log processing, workload analysis

Auto Pilot

Auto tuning, auto scaling, abnormality detection

Ansible

Go

@burrsutter - bit.ly/9stepsawesome

57 of 127

@burrsutter - bit.ly/9stepsawesome

58 of 127

FROM fabric8/java-jboss-openjdk8-jdk:1.4.0�ENV JAVA_APP_DIR=/deployments�EXPOSE 8080 8778 9779�COPY target/my.jar /deployments/

https://github.com/fabric8io-images/java/tree/master/images/jboss/openjdk8/jdk

https://github.com/fabric8io-images/java/tree/master/images/jboss/openjdk8/jdk

Dockerfile for Java projects

@burrsutter - bit.ly/9stepsawesome

59 of 127

minikube(docker-env) or minishift(docker-env)�docker build -t burr/myimage:v1 .�docker run -it -p 8080:8080 burr/myimage:v1�curl $(minishift ip):8080�# now run it on Kubernetes�kubectl run myapp --image burr/myimage:v1 --port 8080�kubectl expose deployment --port=8080 myapp --type=LoadBalancer�oc expose service myapp�curl myapp-stuff.$(minishift ip).nip.io�# scale up�kubectl scale --replicas=2 deploy/myapp�# create an updated image�docker build -t burr/myimage:v2 .�# rollout update�kubectl set image deployment/myapp myapp=burr/myimage:v2

docker build, kubectl run

@burrsutter - bit.ly/9stepsawesome

60 of 127

https://maven.fabric8.io/#fabric8:setup (no Dockerfile, Deployment.yml)

oc new-project stuff (or kubectl create namespace)

mvn clean compile package

mvn io.fabric8:fabric8-maven-plugin:3.5.40:setup

mvn fabric8:deploy

Fabric8 Maven Plugin http://jshift.io/

@burrsutter - bit.ly/9stepsawesome

61 of 127

Slides: bit.ly/javadockerfailRecording from JBCNConf 2017

docker run -m 100MB openjdk:8u121 java -XshowSettings:vm -version

docker run -m 100MB openjdk:8u131 java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XshowSettings:vm -version

Do NOT Java + Docker == FAIL

@burrsutter - bit.ly/9stepsawesome

62 of 127

Step 2 Demo

@burrsutter - bit.ly/9stepsawesome

63 of 127

Step 3: logs

@burrsutter - bit.ly/9stepsawesome

64 of 127

System.out.println("Java, where am I?");�Or console.log("Node logs");

kubectl get pods�kubectl logs microspringboot1-2-nz8f8 �kubectl logs microspringboot1-2-nz8f8 -p # last failed pod

OR stern (brew install stern)�https://github.com/wercker/stern�stern myboot

OR kail (https://github.com/boz/kail)�kail -d myboot

logs

@burrsutter

65 of 127

Step 3 Demo

@burrsutter - bit.ly/9stepsawesome

66 of 127

Step 4: oc or kubectl exec

@burrsutter - bit.ly/9stepsawesome

67 of 127

"ssh" into your containers and explore

kubectl get pods --namespace=microworld�kubectl exec -it --namespace=microworld $POD cat /sys/fs/cgroup/memory/memory.limit_in_bytes�Or�kubectl exec -it --namespace=microworld microspringboot1-2-nz8f8 /bin/bash�ps -ef | grep java�Note: the following apply if using the fabric8 generated image, otherwise consult your Dockerfile�java -version�javac -version�# now find that fat jar�find / -name *.jar �cd /deployments (based on use of the fabric8 maven plugin)�ls�exit

Step 4: oc or kubectl exec

@burrsutter - bit.ly/9stepsawesome

68 of 127

Step 4 Demo

@burrsutter - bit.ly/9stepsawesome

69 of 127

Step 5: env and configmaps

@burrsutter - bit.ly/9stepsawesome

70 of 127

An app’s config is everything that is likely to vary between deploys (staging, production, developer environments, etc). 12 Factor Apps

kubectl set env deployment/myboot DBCONN="jdbc:sqlserver://45.91.12.123:1443;user=MyUserName;password=*****;"

kubectl create cm my-config --from-env-file=config/some.properties

Step 5: env vars & configmaps

@burrsutter - bit.ly/9stepsawesome

71 of 127

some.properties

GREETING=jambo�LOVE=Amour

Partial deployment.yml

spec:

containers:

- name: myboot

image: 9stepsawesome/myboot:v1

ports:

- containerPort: 8080

envFrom:

- configMapRef:

name: my-config

Partial .java

@Autowired

private Environment environment;

String greeting = environment.getProperty("GREETING","Default");

String love = environment.getProperty("LOVE","Default");

ConfigMaps

kubectl create cm my-config --from-env-file=config/some.properties

@burrsutter

72 of 127

Step 5 Demo

@burrsutter - bit.ly/9stepsawesome

73 of 127

Step 6: service discovery & load-balancing

@burrsutter - bit.ly/9stepsawesome

74 of 127

  • Services are internal to the cluster and can be mapped to pods via a label selector
  • Just refer to a Service by its name, it is just DNS

String url = "http://producer:8080/";

ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

Step 6: Service Discovery

@burrsutter - bit.ly/9stepsawesome

75 of 127

@burrsutter - bit.ly/9stepsawesome

76 of 127

Step 7: Live and Ready

@burrsutter - bit.ly/9stepsawesome

77 of 127

Step 7: Live and Ready

resources:

requests:

memory: "300Mi"

cpu: "250m" # 1/4 core

limits:

memory: "400Mi"

cpu: "1000m" # 1 core

livenessProbe:

httpGet:

port: 8080

path: /

initialDelaySeconds: 10

periodSeconds: 5

timeoutSeconds: 2

readinessProbe:

httpGet:

path: /health

port: 8080

initialDelaySeconds: 10

periodSeconds: 3

kubectl create -f Deployment.yml

@burrsutter - bit.ly/9stepsawesome

78 of 127

Step 7 Demo

@burrsutter - bit.ly/9stepsawesome

79 of 127

Step 8: Rolling Updates, Blue/Green�Canary

@burrsutter - bit.ly/9stepsawesome

80 of 127

Blue/Green Deployment

@burrsutter - bit.ly/9stepsawesome

81 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

BUILD

SCM

@burrsutter - bit.ly/9stepsawesome

82 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

BUILD

SCM

@burrsutter - bit.ly/9stepsawesome

83 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

BUILD

SCM

@burrsutter - bit.ly/9stepsawesome

84 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

BUILD

SCM

@burrsutter - bit.ly/9stepsawesome

85 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

BUILD

SCM

@burrsutter - bit.ly/9stepsawesome

86 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

SCM

@burrsutter - bit.ly/9stepsawesome

87 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

SCM

x

@burrsutter - bit.ly/9stepsawesome

88 of 127

Blue/Green Deployment

DEVELOPMENT

QA

STAGING

PRODUCTION

ROUTER

USERS

SCM

@burrsutter - bit.ly/9stepsawesome

89 of 127

@burrsutter - bit.ly/9stepsawesome

90 of 127

New Step 9: Databases

@burrsutter - bit.ly/9stepsawesome

91 of 127

  1. Persistent Volume
  2. Persistent Volume Claim
  3. Deployment
  4. Service

https://redhat-scholars.github.io/kubernetes-tutorial/kubernetes-tutorial/volumes-persistentvolumes.html

https://github.com/burrsutter/9stepsawesome/blob/master/9_databases.adoc

Step 9: Databases

@burrsutter - bit.ly/9stepsawesome

92 of 127

Bonus: Istio

@burrsutter - bit.ly/9stepsawesome

93 of 127

Istio - Sail

(Kubernetes - Helmsman or ship’s pilot)

https://dn.dev/istio-tutorial

@burrsutter - bit.ly/9stepsawesome

94 of 127

Code Independent

  • Intelligent Routing and Load-Balancing
    • Canary Releases
    • Dark Launches
  • Distributed Tracing
  • Circuit Breakers
  • Fine grained Access Control
  • Telemetry, metrics and Logs
  • Fleet wide policy enforcement

Next Generation - Service Mesh

@burrsutter - bit.ly/9stepsawesome

95 of 127

What is Knative?

"Kubernetes-based platform to build, deploy, and manage modern serverless workloads."

"Essential base primitives for all"

"Knative provides a set of middleware components that are essential to build modern, source-centric, and container-based applications that can run anywhere: on premises, in the cloud, or even in a third-party data center"

@burrsutter - bit.ly/9stepsawesome

96 of 127

Apache Kafka on Kubernetes & OpenShift

@burrsutter - bit.ly/9stepsawesome

97 of 127

Free

eBooks/

Resources

@burrsutter - bit.ly/9stepsawesome

98 of 127

dn.dev/knative-cookbook

@burrsutter - bit.ly/9stepsawesome

99 of 127

https://dn.dev/k8s-patterns

@burrsutter - bit.ly/9stepsawesome

100 of 127

bit.ly/mono2microdb

@burrsutter - bit.ly/9stepsawesome

101 of 127

https://dn.dev/istiobook

@burrsutter - bit.ly/9stepsawesome

102 of 127

Backup Content

@burrsutter - bit.ly/9stepsawesome

103 of 127

The End

(Istio is Next)

bit.ly/istio-intro

@burrsutter - bit.ly/9stepsawesome

104 of 127

Kubernetes

OpenShift

Multi-container, multi-host scheduling

Self-service provisioning

Service discovery

Persistent Storage

Multi-tenancy

Networking (SDN)

Image Registry

Image Build Tools

Metrics

Log Aggregation

Ingress

UX: Console, Service Catalog, "oc"

Secured by Default

@burrsutter - bit.ly/9stepsawesome

105 of 127

Kubernetes

Kube Native

App

Helmed

App

Kubernetes Ingress

Kubernetes CLI

Kubernetes API

@burrsutter - bit.ly/9stepsawesome

106 of 127

RHEL

Ansible/Terraform/Operators

OVN

Kubernetes

Kube Native

App

OpenShift

Specialized Java Services

---

Any Language�Any Framework

OpenShift Native

App

Operated/Helmed

App

RHT Storage

Quay

Telemetry

(EFK/Profana)

Admin Console

Kubernetes Ingress

OpenShift Routes

Kubernetes CLI

OpenShift CLI

Kubernetes API

OpenShift API

Che

Templates/S2I/BC

OpenShift Mesh/Istio

Knative

@burrsutter - bit.ly/9stepsawesome

107 of 127

Strangler Strategy

@burrsutter - bit.ly/9stepsawesome

108 of 127

@burrsutter - bit.ly/9stepsawesome

109 of 127

@burrsutter - bit.ly/9stepsawesome

110 of 127

Application on Whiteboard

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

111 of 127

Whiteboard had 3 Tiers

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

112 of 127

UI, Logic, Data

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

113 of 127

Clean Architecture

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

114 of 127

Real Life: Non-Majestic Monolith

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

115 of 127

Large Team

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

116 of 127

Strangle

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

117 of 127

Strangle Hug

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

118 of 127

Friend Hug

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

119 of 127

Family Hug

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

120 of 127

Bear Hug

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

121 of 127

"Refactor"

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

122 of 127

Squeeze

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

123 of 127

Streamline

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

124 of 127

Embrace Others

@burrsutter - bit.ly/9stepsawesome

@burrsutter - bit.ly/9stepsawesome

125 of 127

Recording from Devoxx BE 2018: https://www.youtube.com/watch?v=ZpbXSdzp_vo

"excellent stuff.. worth 3 hours spending to watch this video.. Really loved it. Will give a complete picture on Kubernetes and how it works" - Pradeep

@burrsutter - bit.ly/9stepsawesome

126 of 127

http://www.g-pop.net/fistoffury.htm

@burrsutter - bit.ly/9stepsawesome

127 of 127

@burrsutter - bit.ly/9stepsawesome