zero downtime-java-deployments-with-docker-and-kubernetes

58
Zero downtime Java deployments with Docker & Kubernetes @pbakker @arjanschaaf

Upload: arjan-schaaf

Post on 06-Jan-2017

3.771 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Zero downtime-java-deployments-with-docker-and-kubernetes

Zero downtime Java deploymentswith Docker & Kubernetes

@pbakker @arjanschaaf

Page 2: Zero downtime-java-deployments-with-docker-and-kubernetes

Why care about containers

Don’t worry about environment setup

Easy to replicate to dev/test/prod

More compact than VMs

Page 3: Zero downtime-java-deployments-with-docker-and-kubernetes

Why care about Kubernetes

Docker is about containers on a single host

How to deploy on a cluster?

What about failover of nodes?

How to network between nodes?

Page 4: Zero downtime-java-deployments-with-docker-and-kubernetes

Automated, production ready Kubernetes cluster in

steps8

Page 5: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Understanding Kubernetes0

Terminology, and concepts to build upon

Page 6: Zero downtime-java-deployments-with-docker-and-kubernetes

Nodes, Pods, Controllers

Docker container

Docker container

Docker container

Docker container

Pods

Node

Docker container

Docker container

Docker container

Docker container

Pods

Node

Docker container

Docker container

Docker containerReplication Controller

Master

schedules

schedules

Page 7: Zero downtime-java-deployments-with-docker-and-kubernetes

Deployment 101

Push your Docker image

Create a new replication controller JSON file kubectlcreate-fmycontroller.json

Replication Controller creates Pods

Page 8: Zero downtime-java-deployments-with-docker-and-kubernetes

mycontroller.json"spec":{"replicas":3,"selector":{"name":"frontend"},"template":{"metadata":{"labels":{"name":"frontend"}},"spec":{"containers":[{"name":"php-redis","image":"kubernetes/example-guestbook-php-redis:v2","ports":[{"containerPort":80}]}]}}

Page 9: Zero downtime-java-deployments-with-docker-and-kubernetes

Scaling

kubectlscale—replicas=10myreplication-controller

Page 10: Zero downtime-java-deployments-with-docker-and-kubernetes

Updating my app

Create a new Replication Controller JSON file

kubectl create -f my-new-rc.json

Scale down and delete old RC

Page 11: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Automated deployment (simplistic)

1This kubectl stuff doesn’t really feel like automation…

Page 12: Zero downtime-java-deployments-with-docker-and-kubernetes

The simplest Automated deployment

Don’t use kubectl, use the API!

Build server creates Replication Controller using REST

Build server destroys old cluster using REST

Page 13: Zero downtime-java-deployments-with-docker-and-kubernetes

Docker container

Docker container

Docker container

Docker container

Node

Docker registry

Build Server

Docker container

Docker container

Docker container

Docker container

Node

push

Create RCDocker

containerDocker

containerDocker

containerReplication Controller

Master

schedules

schedules

API

Page 14: Zero downtime-java-deployments-with-docker-and-kubernetes

Curl example

curl-XPOST

http://k8-master:8080/api/v1/namespaces/default/replicationcontrollers-d'{#Poddefinition

}’

Page 15: Zero downtime-java-deployments-with-docker-and-kubernetes

What about downtime?

Not quite there yet

Page 16: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Load balancing

2Our containers are running, but how do we access them!?

Page 17: Zero downtime-java-deployments-with-docker-and-kubernetes

Pods come and go

Pods have dynamic IP addresses

First try - Kubernetes Services

A service is a proxy to your Pods

Fixed IP

P O D

S ERVIC E

Page 18: Zero downtime-java-deployments-with-docker-and-kubernetes

Docker container

Docker container

Docker container

Docker container

Pods

Node

Docker container

Docker container

Docker container

Docker container

Pods

Node

MyServiceHTTP Virtual IP

Virtual IP

Fixed IP

Page 19: Zero downtime-java-deployments-with-docker-and-kubernetes

What about SSL offloading?

… better load balancing?

… redirects, rewrites, etc?

… and that “fixed” IP can’t be reached!?

Services - Not quite right

Page 20: Zero downtime-java-deployments-with-docker-and-kubernetes

Services are for communication within the k8 network (inter Pod communication)

Services - A Hammer and screws…

Page 21: Zero downtime-java-deployments-with-docker-and-kubernetes

Docker container

Docker container

Docker container

Docker container

Pods

Node

Docker container

Docker container

Docker container

Docker container

Pods

Node

HAProxyHTTPS

Virtual IP

Virtual IP

Fixed IP

Custom load balancer

confd

etcd

HTTP

HTTP

Page 22: Zero downtime-java-deployments-with-docker-and-kubernetes

Proxy RegistratorKubernetes API

confd etcd

Proxy Registrator

Watch

update backend configurations

watch changes

HAProxy

update config file

Page 23: Zero downtime-java-deployments-with-docker-and-kubernetes

Choosing a load balancer

Vulcand uses etcd for all its config

Can use Nginx / HAProxy with templating ⇒ confd

Page 24: Zero downtime-java-deployments-with-docker-and-kubernetes

So you’re telling me…

—link doesn’t work!?

And now you’re telling me…

—I can’t see my Pods!?

Page 25: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Software Defined Network

3Each Pod gets its own IP

Access Pods from outside k8 on the flannel network

Page 26: Zero downtime-java-deployments-with-docker-and-kubernetes

Docker container

Docker container

Docker container

Docker container

Node

Docker container

Docker container

Docker container

Docker container

Pods

Node

HAProxyHTTPS Virtual IP

Virtual IP

Fixed IP

Pods

HTTP

HTTP

Kubernetes networkpublic addressable network segment

Page 27: Zero downtime-java-deployments-with-docker-and-kubernetes

Docker container

Docker container

Docker container

Docker container

Node

Docker container

Docker container

Docker container

Docker container

Pods

Node

HAProxyHTTPS Virtual IP

Virtual IP

Fixed IP

Pods

HTTP

HTTP

Flannel networkpublic addressable

network segment

Page 28: Zero downtime-java-deployments-with-docker-and-kubernetes

Flannel: easy to setup & fast (on CoreOS)

Weave: userspace implementation is slow, loads of features

Project Calico: promising integration with Kubernetes

Docker libnetwork: batteries included but swappable

SDN - loads of options

Page 29: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Blue / Green deployment

4Auto deploy is great, but downtime not so much

Page 30: Zero downtime-java-deployments-with-docker-and-kubernetes

Step 4 - Blue / Green

Scale up new cluster

Wait until healthy

Switch backend in Load Balancer

Dispose old cluster

Page 31: Zero downtime-java-deployments-with-docker-and-kubernetes

How do we know a Pod is healthy?

Its RUNNING status is not sufficient…

Is the app fully started?

Page 32: Zero downtime-java-deployments-with-docker-and-kubernetes

Introduce App level health checks

Docker container

Docker container

Docker container

Docker container

Node

Docker container

Docker container

Docker container

Docker container

Pods

Node

Deployer

GET /health

GET /healthPods

Deploy Server

Page 33: Zero downtime-java-deployments-with-docker-and-kubernetes

Running a Deployer

Blue/Green deployment requires lots of coordination

Our build server can’t access the Pods

… how do we health check?

Page 34: Zero downtime-java-deployments-with-docker-and-kubernetes

Kubernets API etcd

Deployer Build Server

Start deployment

Kubernets API

Kubernets API

Kubernets APIPods

GET /health Create RC Switch Load Balancer Backend

Page 35: Zero downtime-java-deployments-with-docker-and-kubernetes

Kubernets API

HAProxy

etcd

Deployer Build Server

Start deployment

Kubernets API

Kubernets API

Kubernets APIPods

GET /health Create RC

Proxy Registrator

Watch Create backends Read config

confdWatch

Switch Load Balancer Backend

Page 36: Zero downtime-java-deployments-with-docker-and-kubernetes

Deployment descriptor

{ "useHealthCheck": true, "newVersion": "${bamboo.deploy.version}", "appName": "todo", "replicas": 2, "frontend": "rti-todo.amdatu.com", “podspec": {

…. }

}

Page 37: Zero downtime-java-deployments-with-docker-and-kubernetes

"podspec": { "containers": [{ "image": “amdatu/mycontainer", "name": "todo", "ports": [{ "containerPort": 8080 }], "env": [ { "name": "version", "value": "${bamboo.deploy.version}" } ]}] }

Page 38: Zero downtime-java-deployments-with-docker-and-kubernetes

Deployment demo

Demo

Page 39: Zero downtime-java-deployments-with-docker-and-kubernetes
Page 40: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Canary deployment

5

Page 41: Zero downtime-java-deployments-with-docker-and-kubernetes

Canary deployments

Different strategy for the Deployer

Add Replication Controller

But don’t change the running cluster

Page 42: Zero downtime-java-deployments-with-docker-and-kubernetes

K8 NodeK8 NodeK8 NodeK8 NodeProd pod

Canary

Main Replication Controller

K8 NodeK8 NodeK8 NodeK8 NodeCanary pod

Canary Replication Controller

HAProxy

Page 43: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Persistent data

6How to deploy Mongo/MySQL/ElasticSearch in Kubernetes?

Page 44: Zero downtime-java-deployments-with-docker-and-kubernetes

You don’t

Page 45: Zero downtime-java-deployments-with-docker-and-kubernetes

Kubernetes is great for…

Stateless containers

Running lots of containers together

Moving containers around

Page 46: Zero downtime-java-deployments-with-docker-and-kubernetes

Datastores scaling mechanics

Reactive scaling makes less sense

Cluster should be tuned

Scaling is expensive

Page 47: Zero downtime-java-deployments-with-docker-and-kubernetes

Infra server(s)K8 Master K8 NodeK8 NodeK8 NodeK8 NodeK8 NodeHAProxy

Deployer

Mongo Cluster

ElasticSearch Cluster

… Cluster

Cluster topology

Page 48: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Logging

7kubectl logs mypod?

Page 49: Zero downtime-java-deployments-with-docker-and-kubernetes

Logging

Centralised application logging is key in a dynamic environment

Assume you can’t access a pod

ElasticSearch / LogStash / Kibana or Graylog are very useful for this

Page 50: Zero downtime-java-deployments-with-docker-and-kubernetes

Logging

Docker container

Docker container

Docker container

Docker container

Docker container

Docker container

Docker container

Docker container

LogStash

ElasticSearch

Graylog

Page 51: Zero downtime-java-deployments-with-docker-and-kubernetes

Logging example

OSGi app OSGi

LogService

SLF4J

Kafka Graylog

Graylog Dashboard

Developer

Page 52: Zero downtime-java-deployments-with-docker-and-kubernetes
Page 53: Zero downtime-java-deployments-with-docker-and-kubernetes

Step

Configuration

8Passing config to containers

Page 54: Zero downtime-java-deployments-with-docker-and-kubernetes

Use environment variables

dbName=todo-apphost=${mongo}

myconfig.cfg

"podspec":{"env":[{"name":"mongo","value":"10.100.2.4"},

Deployment descriptor

Approach 1

Page 55: Zero downtime-java-deployments-with-docker-and-kubernetes

Use etcd

etcd=[etcdnode]:2379

myconfig.cfg

/apps/config/demo-app

etcd

Approach 2

[{"name":"mongo","value":"10.100.2.4"}]

Page 56: Zero downtime-java-deployments-with-docker-and-kubernetes

What to learn from all this?

Docker and Kubernetes are awesome

They are building blocks, not solutions

Use the API!

Page 57: Zero downtime-java-deployments-with-docker-and-kubernetes

And if you don’t want to do all this yourself….

Fully managed Kubernetes based clusters

Logging and Monitoring

Automated deployments

Page 58: Zero downtime-java-deployments-with-docker-and-kubernetes

Thank you!

Blog: http://paulbakker.io | https://arjanschaaf.github.io

Twitter: @pbakker | @arjanschaaf

Mail: [email protected] | [email protected]