Slide 1

Slide 1 text

@errordeveloper A Practical Guide to Cloud-Native Java Apps & Continuous Delivery

Slide 2

Slide 2 text

Microservices BoF Oct 2, 6:30 pm, room 2002 with Chris Richardson, Josh Long, & Ilya Dmitrichenko Kubernetes BoF Oct 2, 7:30 pm, room 2002 with Ilya Dmitrichenko & Tamao Nakahara

Slide 3

Slide 3 text

outline: – our story – technical intro – gitops theory – tutorial

Slide 4

Slide 4 text

outline: – our story – technical intro – gitops theory – tutorial

Slide 5

Slide 5 text

– our story what do we do?

Slide 6

Slide 6 text

– our story what we offer?

Slide 7

Slide 7 text

– our story how I benefit?

Slide 8

Slide 8 text

Kubernetes: what is it?

Slide 9

Slide 9 text

Kubernetes: how it works?

Slide 10

Slide 10 text

Kubernetes: say more?

Slide 11

Slide 11 text

apiVersion: v1 kind: Pod metadata: name: java-demo labels:{ app: java-demo } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 12

Slide 12 text

apiVersion: v1 kind: Pod metadata: name: java-demo labels:{ app: java-demo } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 13

Slide 13 text

apiVersion: v1 kind: Pod metadata: name: java-demo labels:{ app: java-demo } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 14

Slide 14 text

apiVersion: v1 kind: Pod metadata: name: java-demo labels:{ app: java-demo } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 15

Slide 15 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: selector:{ matchLabels: } template:

Slide 16

Slide 16 text

ReplicaCount = 3 PodLabels = { app: java-demo } PodSpec = { metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }] }

Slide 17

Slide 17 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: selector:{ matchLabels: } template:

Slide 18

Slide 18 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels: } template:

Slide 19

Slide 19 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template:

Slide 20

Slide 20 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 21

Slide 21 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 22

Slide 22 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 23

Slide 23 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 24

Slide 24 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 25

Slide 25 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 26

Slide 26 text

apiVersion: apps/v1beta2 kind: Deployment metadata: name: java-demo labels:{ app: java-demo } spec: replicas: 3 selector:{ matchLabels:{ app: java-demo } } template: metadata: { labels:{ app: java-demo } } spec: containers: - name: server image: java-demo:v0.0.1 ports: [{ containerPort: 8080 }]

Slide 27

Slide 27 text

kubectl apply -f deployment.yaml

Slide 28

Slide 28 text

> kubectl get deployment java-demo NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE java-demo 3 3 3 3 1m > kubectl get pods -l app=java-demo NAME READY STATUS RESTARTS AGE java-demo-307071-c93l1 1/1 Running 0 1m java-demo-307071-f6nfc 1/1 Running 0 1m java-demo-307071-x4rr8 1/1 Running 0 1m

Slide 29

Slide 29 text

apiVersion: v1 kind: Service metadata: name: java-demo labels:{ app: java-demo } spec: type: LoadBalancer selector:{ app: java-demo } ports: - name: http protocol: TCP port: 80 targetPort: 8080

Slide 30

Slide 30 text

apiVersion: v1 kind: Service metadata: name: java-demo labels:{ app: java-demo } spec: type: LoadBalancer selector:{ app: java-demo } ports: - name: http protocol: TCP port: 80 targetPort: 8080

Slide 31

Slide 31 text

apiVersion: v1 kind: Service metadata: name: java-demo labels:{ app: java-demo } spec: type: LoadBalancer selector:{ app: java-demo } ports: - name: http protocol: TCP port: 80 targetPort: 8080

Slide 32

Slide 32 text

kubectl apply -f service.yaml

Slide 33

Slide 33 text

> kubectl describe service java-demo Name: java-demo Labels: app=java-demo Selector: app=java-demo Type: LoadBalancer IP: 10.39.245.50 LoadBalancer Ingress: 35.197.214.121 Port: http 80/TCP Endpoints: 10.36.1.79:8080,10.36.1.80:8080,10.36.1.81:8080 ... > curl http://35.197.214.121/ Hello, JavaOne '17!

Slide 34

Slide 34 text

> kubectl get pods -l app=java-demo -o wide NAME READY STATUS IP ... java-demo-307071-c93l1 1/1 Running 10.36.1.80 java-demo-307071-f6nfc 1/1 Running 10.36.1.79 java-demo-307071-x4rr8 1/1 Running 10.36.1.81

Slide 35

Slide 35 text

Prometheus: what is it?

Slide 36

Slide 36 text

Prometheus: how it works?

Slide 37

Slide 37 text

Prometheus: say more?

Slide 38

Slide 38 text

> curl http://35.197.214.121/prometheus ... # HELP process_starttime_seconds The starttime of the Java virtual machine # TYPE process_starttime_seconds gauge process_starttime_seconds 1.506735317456E9 # HELP process_uptime_seconds The uptime of the Java virtual machine # TYPE process_uptime_seconds gauge process_uptime_seconds 145236.015

Slide 39

Slide 39 text

> curl http://35.197.214.121/prometheus ... # HELP http_requests_duration_seconds Timer of servlet request # TYPE http_requests_duration_seconds summary http_requests_duration_seconds_count{method="GET",status=" 200",uri="/"} 2.0 http_requests_duration_seconds_sum{method="GET",status="20 0",uri="/"} 0.05230485

Slide 40

Slide 40 text

process_uptime_seconds

Slide 41

Slide 41 text

process_uptime_seconds{job=“default/java-demo”}

Slide 42

Slide 42 text

http_requests_duration_seconds_count

Slide 43

Slide 43 text

http_requests_duration_seconds_count{ job=“default/java-demo”, method=“GET”, uri=“/”, }

Slide 44

Slide 44 text

sum( http_requests_duration_seconds_count{ job=“default/java-demo”, method=“GET”, uri=“/”, } )

Slide 45

Slide 45 text

sum( rate( http_requests_duration_seconds_count{ job=“default/java-demo”, method=“GET”, uri=“/”, }[1m] ) )

Slide 46

Slide 46 text

– gitops theory

Slide 47

Slide 47 text

– gitops theory • any developer can use git • anyone can join team and ship a new app or make changes easily • all changes can be stored, audited and validated in git and we didn’t have to do anything very new or clever =)

Slide 48

Slide 48 text

– gitops theory • config is code • code (& config!) must be version controlled • CD tools that do not record changes in git are harmful

Slide 49

Slide 49 text

– gitops theory Continuous Delivery/Deployment Image Repo Orchestrator Deploy Synchronizer Config change Manual deployment Git Code change Git Update Hint Continuous Integration Deploy Automator CI Pipeline

Slide 50

Slide 50 text

– kube pitfalls

Slide 51

Slide 51 text

I just go and kubectl all the things; great!

Slide 52

Slide 52 text

Maybe, I should get my CI to do kubectl!

Slide 53

Slide 53 text

– more gitops

Slide 54

Slide 54 text

– more gitops •everything is checked in git •easy to deploy the entire stack locally •easy to fork a cluster •easy to detect ad-hoc changes, alert/undo

Slide 55

Slide 55 text

– more gitops •git is the source of truth •review process is the same as for code •infra changes go through review process •you are free to use whatever tools

Slide 56

Slide 56 text

tutorial part 1: deploying Spring Boot app to Kubernetes, step-by-step http://github.com/errordeveloper/prom-java-demo

Slide 57

Slide 57 text

tutorial part 2: deploying Socks Shop to Kubernetes, the gitops way

Slide 58

Slide 58 text

cloud.weave.works

Slide 59

Slide 59 text

[email protected] slack.weave.works

Slide 60

Slide 60 text

Microservices BoF Oct 2, 6:30 pm, room 2002 with Chris Richardson, Josh Long, & Ilya Dmitrichenko Kubernetes BoF Oct 2, 7:30 pm, room 2002 with Ilya Dmitrichenko & Tamao Nakahara