Slide 1

Slide 1 text

@saturnism @googlecloud @kubernetesio @jfokus Managing Cloud Native Application with Kubernetes End-to-End

Slide 2

Slide 2 text

@saturnism @googlecloud @kubernetesio @jfokus Time Topics 09:00 - 10:30 Containers, Orchestration Scheduling, Kubernetes 10:30 - 11:00 Break. YAY! 11:00 - 12:30 Kubernetes Federation CI/CD

Slide 3

Slide 3 text

@saturnism @googlecloud @kubernetesio @jfokus Ray Tsang Developer Advocate Google Cloud Platform @saturnism | +RayTsang

Slide 4

Slide 4 text

@saturnism @googlecloud @kubernetesio @jfokus Ray Tsang Developer Architect Traveler Photographer flickr.com/saturnism

Slide 5

Slide 5 text

@saturnism @googlecloud @kubernetesio @jfokus

Slide 6

Slide 6 text

@saturnism @googlecloud @kubernetesio @jfokus Cloud Native? != Running in the Cloud

Slide 7

Slide 7 text

@saturnism @googlecloud @kubernetesio @jfokus Cloud Native? Innovate fast Iterate fast Focus on core business differentiators

Slide 8

Slide 8 text

@saturnism @googlecloud @kubernetesio @jfokus Cloud Native? Infrastructure - elastic, automated Environment - consistent, agile Application - scalable, resilient, service oriented Deployment - continuous Everything - measurable

Slide 9

Slide 9 text

@saturnism @googlecloud @kubernetesio @jfokus Cloud Native? Infrastructure - elastic, automated Environment - consistent, agile Application - scalable, resilient, service oriented Deployment - continuous Everything - measurable DevOps Machines as Cattles Containerization Orchestration Microservices CI/CD Orchestration Trace, Monitoring Metrics

Slide 10

Slide 10 text

@saturnism @googlecloud @kubernetesio @jfokus

Slide 11

Slide 11 text

@saturnism @googlecloud @kubernetesio @jfokus Hello World Service - Greet Guestbook Service - Create Guestbook Service - Retrieve

Slide 12

Slide 12 text

@saturnism @googlecloud @kubernetesio @jfokus Guestbook UI Hello World Service Redis session replication greeting MySQL Guestbook Service CRUD

Slide 13

Slide 13 text

@saturnism @googlecloud @kubernetesio @jfokus Package & Deployment application.ear app.war helloworld-service.jar guestbook-service.jar apache-xyz.jar application.war /... helloworld-service.jar guestbook-service.jar apache-xyz.jar

Slide 14

Slide 14 text

@saturnism @googlecloud @kubernetesio @jfokus Machine app.war / app.ear Application Server Kernel Shell / CLI / Tools

Slide 15

Slide 15 text

@saturnism @googlecloud @kubernetesio @jfokus Machine app.war / app.ear Application Server Kernel Shell / CLI / Tools Machine app.war / app.ear Application Server Kernel Shell / CLI / Tools Machine app.war / app.ear Application Server Kernel Shell / CLI / Tools

Slide 16

Slide 16 text

@saturnism @googlecloud @kubernetesio @jfokus Let’s see write some code

Slide 17

Slide 17 text

@saturnism @googlecloud @kubernetesio @jfokus Microservices helloworld-service.jar guestbook-service.jar app.jar

Slide 18

Slide 18 text

@saturnism @googlecloud @kubernetesio @jfokus Deployment? Just run it! java -jar helloworld-service.jar java -jar guestbook-service.jar java -jar app.jar

Slide 19

Slide 19 text

@saturnism @googlecloud @kubernetesio @jfokus So many services Deploy, Manage, Bin Pack, Ports, Discovery, Isolation… How?

Slide 20

Slide 20 text

@saturnism @googlecloud @kubernetesio @jfokus Challenges Which host machine(s) should each service run on? Avoid port conflicts? How does the application code find the Guest Book service? How do we keep all of these service running? What happens if a host machine has trouble? Are the services healthy? How do we scale when load changes? Run this in another environment? QA, dev, another cloud, your servers?

Slide 21

Slide 21 text

@saturnism @googlecloud @kubernetesio @jfokus Containers To the Rescue!

Slide 22

Slide 22 text

@saturnism @googlecloud @kubernetesio @jfokus Old Way: Shared machines kernel libs app app app No isolation No namespacing Common libs Highly coupled apps and OS app

Slide 23

Slide 23 text

@saturnism @googlecloud @kubernetesio @jfokus Old Way: Virtual machines Some isolation Expensive and inefficient Still highly coupled to the guest OS Hard to manage app libs kernel libs app app kernel app libs libs kernel kernel

Slide 24

Slide 24 text

@saturnism @googlecloud @kubernetesio @jfokus New Way: Containers libs app kernel libs app libs app libs app

Slide 25

Slide 25 text

@saturnism @googlecloud @kubernetesio @jfokus Containerize Option #1 Dockerfile

Slide 26

Slide 26 text

@saturnism @googlecloud @kubernetesio @jfokus Containerize Option #2 spotify/docker-maven-plugin mvn docker:build or, spotify/dockerfile-maven-plugin or, fabric8 maven plugin

Slide 27

Slide 27 text

@saturnism @googlecloud @kubernetesio @jfokus Containerize Option #3 Docker Hub / GitHub saturnism/spring-boot

Slide 28

Slide 28 text

@saturnism @googlecloud @kubernetesio @jfokus Static Binary! Runs anywhere

Slide 29

Slide 29 text

@saturnism @googlecloud @kubernetesio @jfokus More on Containers Container Basics

Slide 30

Slide 30 text

@saturnism @googlecloud @kubernetesio @jfokus Let’s run the container! docker run -ti -p 8080:8080 helloworld-service

Slide 31

Slide 31 text

@saturnism @googlecloud @kubernetesio @jfokus Docker Compose docker-compose up

Slide 32

Slide 32 text

@saturnism @googlecloud @kubernetesio @jfokus Versioning container image docker tag spring-boot-demo spring-boot-demo:1.0

Slide 33

Slide 33 text

@saturnism @googlecloud @kubernetesio @jfokus Versioning container image docker build -t spring-boot-demo:${BUILDNO}

Slide 34

Slide 34 text

@saturnism @googlecloud @kubernetesio @jfokus Don’t Log to Container Filesystem! Log to a volume… docker -v /tmp/log:/log Or Send it elsewhere! STDOUT is captured by Docker / Kubernetes

Slide 35

Slide 35 text

@saturnism @googlecloud @kubernetesio @jfokus Clean up disk spaces Every image, layer, and, even containers litters docker rm $(docker ps -a -q) docker rmi $(docker images -q --filter dangling=true)

Slide 36

Slide 36 text

@saturnism @googlecloud @kubernetesio @jfokus Combine RUN commands apt-get update && apt-get install xyz && apt-get clean Saves you space.

Slide 37

Slide 37 text

@saturnism @googlecloud @kubernetesio @jfokus Consider Slim JARs Base Layer - java:8 (not frequently updated) Next Layer - Dependency JARs (not frequently updated) Last Layer - Application JAR (frequently updated) Use dockerfile-maven-plugin, copy-dependencies or slimfast

Slide 38

Slide 38 text

@saturnism @googlecloud @kubernetesio @jfokus Run with --rm docker run -ti --rm saturnism/spring-boot-helloworld-service:1.0

Slide 39

Slide 39 text

@saturnism @googlecloud @kubernetesio @jfokus Everything at Google runs in containers Launch over 2 billion containers per week.

Slide 40

Slide 40 text

@saturnism @googlecloud @kubernetesio @jfokus

Slide 41

Slide 41 text

@saturnism @googlecloud @kubernetesio @jfokus Control Plane Apps Software Engineers

Slide 42

Slide 42 text

@saturnism @googlecloud @kubernetesio @jfokus job hello_world = { runtime = { cell = 'ic' } // Cell (cluster) to run in binary = '.../hello_world_webserver' // Program to run args = { port = '%port%' } // Command line parameters requirements = { // Resource requirements ram = 100M disk = 100M cpu = 0.1 } replicas = 5 // Number of tasks } 10000

Slide 43

Slide 43 text

@saturnism @googlecloud @kubernetesio @jfokus web browsers BorgMaster link shard UI shard BorgMaster link shard UI shard BorgMaster link shard UI shard BorgMaster link shard UI shard Scheduler borgcfg web browsers scheduler Borglet Borglet Borglet Borglet Config file BorgMaster link shard UI shard persistent store (Paxos) Binary What just happened?

Slide 44

Slide 44 text

@saturnism @googlecloud @kubernetesio @jfokus Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Image by Connie Zhou Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world! Hello world!

Slide 45

Slide 45 text

@saturnism @googlecloud @kubernetesio @jfokus

Slide 46

Slide 46 text

@saturnism @googlecloud @kubernetesio @jfokus Containers Orchestration

Slide 47

Slide 47 text

@saturnism @googlecloud #kubernetes #devoxx

Slide 48

Slide 48 text

@saturnism @googlecloud #kubernetes #devoxx Kubernetes Greek for “Helmsman”; also the root of the words “governor” and “cybernetic” • Infrastructure for containers • Schedules, runs, and manages containers on virtual and physical machines • Platform for automating deployment, scaling, and operations • Inspired and informed by Google’s experiences and internal systems • 100% Open source, written in Go

Slide 49

Slide 49 text

@saturnism @googlecloud @kubernetesio @jfokus web browsers Scheduler kubectl web browsers scheduler Kubelet Kubelet Kubelet Kubelet Config file Kubernetes Master Container Image Developer View What just happened?

Slide 50

Slide 50 text

@saturnism @googlecloud @kubernetesio @jfokus Developer View spec: containers: - name: myservice image: myservice resources: limits: memory: "128Mi" cpu: "0.1" ports: - containerPort: 3306 protocol: TCP replicas: 1 10000

Slide 51

Slide 51 text

@saturnism @googlecloud @kubernetesio @jfokus Cluster of Machines as One

Slide 52

Slide 52 text

@saturnism @googlecloud @kubernetesio @jfokus Live Demo

Slide 53

Slide 53 text

@saturnism @googlecloud #kubernetes #devoxx

Slide 54

Slide 54 text

@saturnism @googlecloud @kubernetesio @jfokus

Slide 55

Slide 55 text

@saturnism @googlecloud @kubernetesio @jfokus Hello World Service - Greet Guestbook Service - Create Guestbook Service - Retrieve

Slide 56

Slide 56 text

@saturnism @googlecloud @kubernetesio @jfokus Guestbook UI Hello World Service Redis session replication greeting MySQL Guestbook Service CRUD

Slide 57

Slide 57 text

@saturnism @googlecloud @kubernetesio @jfokus Staging vs. production Use Namespaces - deploy in the same infrastructure

Slide 58

Slide 58 text

@saturnism @googlecloud @kubernetesio @jfokus Canary Use service, and replication controllers to canary new versions

Slide 59

Slide 59 text

@saturnism @googlecloud @kubernetesio @jfokus Rollback Super simple with versioned containers

Slide 60

Slide 60 text

@saturnism @googlecloud @kubernetesio @jfokus Persistent Volumes

Slide 61

Slide 61 text

@saturnism @googlecloud @kubernetesio @jfokus Rolling upgrade Similar to canary, but slowly let the new version take over

Slide 62

Slide 62 text

@saturnism @googlecloud @kubernetesio @jfokus Health Checks

Slide 63

Slide 63 text

@saturnism @googlecloud @kubernetesio @jfokus Configuration Map

Slide 64

Slide 64 text

@saturnism @googlecloud @kubernetesio @jfokus Secrets

Slide 65

Slide 65 text

@saturnism @googlecloud @kubernetesio @jfokus Namespace

Slide 66

Slide 66 text

@saturnism @googlecloud @kubernetesio @jfokus Service discovery Read service IP addresses via environmental variables

Slide 67

Slide 67 text

@saturnism @googlecloud @kubernetesio @jfokus Service discovery Kubernetes API or… DNS Lookups! ping redis

Slide 68

Slide 68 text

@saturnism @googlecloud @kubernetesio @jfokus Before Stateful Set - Stateless Cattles Deployment Replicas → 1 Pod frontend Pod - cb-axk3u type = Couchbase version = 1.0 Pod CB-Disk Volume Mount

Slide 69

Slide 69 text

@saturnism @googlecloud @kubernetesio @jfokus Before Pet Set - Stateless Cattles Deployment Replicas → 2 Pod frontend Pod - cb-axk3u type = Couchbase version = 1.0 Pod CB-Disk Pod frontend Pod - cb-a94kd type = Couchbase version = 1.0 Volume Mount

Slide 70

Slide 70 text

@saturnism @googlecloud @kubernetesio @jfokus Stateful Set Stateful Set Replicas → 1 Pod frontend Pod - cb-0 type = Couchbase version = 1.0 cb-0 Volume Mount Automatic Provisioning

Slide 71

Slide 71 text

@saturnism @googlecloud @kubernetesio @jfokus Stateful Set Stateful Set Replicas → 2 Pod frontend Pod - cb-0 type = Couchbase version = 1.0 Pod Pod frontend Pod - cb-1 type = Couchbase version = 1.0 cb-0 Volume Mount cb-1 Volume Mount

Slide 72

Slide 72 text

@saturnism @googlecloud @kubernetesio @jfokus Wait a second, how about the disks? volumeClaimTemplates: - metadata: name: www annotations: volume.alpha.kubernetes.io/storage-class: anything spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi

Slide 73

Slide 73 text

@saturnism @googlecloud @kubernetesio @jfokus Stateful Set Stateful Set Replicas → 2 Pod frontend Pod - cb-0 type = Couchbase version = 1.0 Pod Pod frontend Pod - cb-1 type = Couchbase version = 1.0 cb-0 Volume Mount Automatic Provisioning cb-1 Volume Mount

Slide 74

Slide 74 text

@saturnism @googlecloud @kubernetesio @jfokus Next Step? Data Centers as One!

Slide 75

Slide 75 text

@saturnism @googlecloud @kubernetesio @jfokus UI CLI API Control Plane Servers Admin containers containers containers containers containers containers containers containers containers containers containers containers containers containers containers Cluster / Data Center / Availability Zone

Slide 76

Slide 76 text

@saturnism @googlecloud @kubernetesio @jfokus UI CLI API API Kubernetes on Kubernetes on Kubernetes on Premise Federation

Slide 77

Slide 77 text

@saturnism @googlecloud @kubernetesio @jfokus Higher Availability Easy Application Migration Avoid Vendor Lock-in Capacity Overflow Cross-cluster Load Balancer Your users Cluster 1 Cluster 2 Cluster 3 Use Cases

Slide 78

Slide 78 text

@saturnism @googlecloud @kubernetesio @jfokus Provider 1 Zone A Zone B Provider 2 Zone C Provider 1 Zone D Challenges

Slide 79

Slide 79 text

@saturnism @googlecloud @kubernetesio @jfokus Geographically aware DNS gets clients to the "closest" healthy cluster. Standard Kubernetes service load balancing within each cluster. Can be extended to divert traffic away from "healthy-but-saturated" clusters. Cross-cluster Load Balancing

Slide 80

Slide 80 text

@saturnism @googlecloud @kubernetesio @jfokus Location affinity Strictly coupled pods/applications • High bandwidth requirements • Low latency requirements • High fidelity requirements • Cannot easily span clusters Loosely coupled • Opposite of above • Relatively easily distributed across clusters Preferentially coupled • Strongly coupled but can be migrated piecemeal.

Slide 81

Slide 81 text

@saturnism @googlecloud @kubernetesio @jfokus Location affinity continued... Negative Affinity • Don't run my replicas in the same failure domain (host/rack/zone) Topology • Same host • Same rack • Same zone • Same metro region • Same sub-continent Absolute affinity

Slide 82

Slide 82 text

@saturnism @googlecloud @kubernetesio @jfokus What can we federate? As of Kubernetes 1.5 Namespace Deployment Replica Set Secret ConfigMap Service Ingress

Slide 83

Slide 83 text

@saturnism @googlecloud @kubernetesio @jfokus Federation Control Plane Cluster 2 us-central1-b Cluster 1 us-east1-b Cluster 3 europe-west1-b Cluster 4 asia-east1-b API API API API Cluster 2 - us-central1-b Federation API Server Federation Controller Federation Key/value store (etcd) Federation API contexts: - context: cluster: federation-cluster user: federation-cluster

Slide 84

Slide 84 text

@saturnism @googlecloud @kubernetesio @jfokus Adding a Cluster Kubernetes Cluster (Asia) Federation Control Plane kubectl --context=federation-cluster create -f clusters/gcp-asia-east1.yaml apiVersion: federation/v1beta1 kind: Cluster metadata: name: gce-asia-east1 spec: serverAddressByClientCIDRs: - clientCIDR: "0.0.0.0/0" serverAddress: "https://..." secretRef: name: gce-asia-east1 API kubeconfig

Slide 85

Slide 85 text

@saturnism @googlecloud @kubernetesio @jfokus Cluster Federation Kubernetes Cluster 1 (Google Cloud) Kubernetes Cluster 2 (On-Prem) Kubernetes Cluster 3 (Another Cloud) Federation Control Plane kubectl

Slide 86

Slide 86 text

@saturnism @googlecloud @kubernetesio @jfokus Cluster Federation Kubernetes Cluster 1 (Google Cloud) Kubernetes Cluster 2 (On-Prem) Kubernetes Cluster 3 (Another Cloud) Federation Control Plane kubectl create -f nginx-service.yaml nginx Service nginx Service nginx Service

Slide 87

Slide 87 text

@saturnism @googlecloud @kubernetesio @jfokus Cluster Federation Kubernetes Cluster 1 (Google Cloud) Kubernetes Cluster 2 (On-Prem) Kubernetes Cluster 3 (Another Cloud) Federation Control Plane kubectl create -f nginx-service.yaml nginx Service nginx Service nginx Service DNS

Slide 88

Slide 88 text

@saturnism @googlecloud @kubernetesio @jfokus Kubernetes Cluster 1 (Google Cloud) Kubernetes Cluster 2 (On-Prem) Kubernetes Cluster 3 (Another Cloud) svc app Clusters 1 and 3 DNS nslookup app.default.federation.svc.federation.com svc app

Slide 89

Slide 89 text

@saturnism @googlecloud @kubernetesio @jfokus Ecosystem

Slide 90

Slide 90 text

@saturnism @googlecloud @kubernetesio @jfokus minikube

Slide 91

Slide 91 text

@saturnism @googlecloud @kubernetesio @jfokus kompose

Slide 92

Slide 92 text

@saturnism @googlecloud @kubernetesio @jfokus kubeadm

Slide 93

Slide 93 text

@saturnism @googlecloud @kubernetesio @jfokus kops

Slide 94

Slide 94 text

@saturnism @googlecloud @kubernetesio @jfokus helm

Slide 95

Slide 95 text

@saturnism @googlecloud @kubernetesio @jfokus kubefed

Slide 96

Slide 96 text

@saturnism @googlecloud @kubernetesio @jfokus Resources Spring Boot: https://github.com/saturnism/spring-boot-docker Federation: https://github.com/saturnism/buttonmasher Visualizer: https://github.com/saturnism/gcp-live-k8s-visualizer Hands-on Lab: http://bit.ly/k8s-lab Raspberry Pi Cluster: http://bit.ly/k8s-rpi Google Container Engine: https://cloud.google.com/container-engine/

Slide 97

Slide 97 text

@saturnism @googlecloud @kubernetesio @jfokus Thanks! Images by Connie Zhou http://kubernetes.io http://bit.ly/1QLg5E1