DockerCon SF 2015: Enabling Microservices @Orbitz

106
Enabling Microservices @Orbitz Steve Hoffman @bacoboy Rick Fast @tortiepoint Senior Principal Engineers

Transcript of DockerCon SF 2015: Enabling Microservices @Orbitz

Page 1: DockerCon SF 2015: Enabling Microservices @Orbitz

Enabling Microservices @OrbitzSteve Hoffman @bacoboyRick Fast @tortiepointSenior Principal Engineers

Page 2: DockerCon SF 2015: Enabling Microservices @Orbitz
Page 3: DockerCon SF 2015: Enabling Microservices @Orbitz
Page 4: DockerCon SF 2015: Enabling Microservices @Orbitz
Page 5: DockerCon SF 2015: Enabling Microservices @Orbitz

Agenda

• Brief Architecture Overview/History

• From Monolithic to Services to Microservices with Docker

• Automated Pipelines

• Questions

Page 6: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2000

Page 7: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2000

Yes, we are STILL hiring!

@OrbitzTalent

Page 8: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2000

Web Layer

Business Layer

Page 9: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2000

Page 10: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2000

Page 11: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2000

Business Layer

Page 12: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Business Layer

20032000

Page 13: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Business Layer

2003

Page 14: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2003

Business Layer

Page 15: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

20042003

Page 16: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2004

Page 17: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

20042012

Page 18: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

2012

• Multiple Brands

• Websites

• Webservices

• Multiple Backends

• 500+ apps / thousands of instances

• Deployments Daily (sometimes more)

2015

Page 19: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Process Overkill

Page 20: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Different Provisioning Tools

DEV OPS

Application Platform!=

Page 21: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

A New Experiment

• Microservices?

• Decompose single “service” into the actual 40+ sub-services - Any change to sub-service was a deployment of many

• Could it be a simple Spring Boot App in Docker (12 factor?)

• Backward compatible with existing service infrastructure.

• Code to Production w/o help from other Humans

Page 22: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

The Docker Slave aka “The Rickbot”

App

App

App

Page 23: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

10.10.10.1010.10.10.10:31002

App

App

App Register & Lookup

Page 24: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

App

App

App

Page 25: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

App

App

App

Page 26: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Page 27: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Page 28: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

http://consul.io

Page 29: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

10.10.10.10

10.10.10.10:51515

App

App

App

Page 30: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

10.10.10.1010.10.10.10:1337

App

App

App

Page 31: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Almost done…

App

App

App

Page 32: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

App

App

App

Page 33: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

App

App

App

VIP

https://github.com/QubitProducts/bamboo

Page 34: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

App

App

App

Page 35: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

App

App

App

Page 36: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

AppApp

App

Page 37: DockerCon SF 2015: Enabling Microservices @Orbitz

A Little More Background

Page 38: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Page 39: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Module

Module

Module Module

Page 40: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Editorial Module

• A Continuously Deployed Microservice

• www.orbitz.com - (scroll down)

Page 41: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

Page 42: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

Hotel Team Search Team Content Team

Page 43: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

Page 44: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

Hotel Team

Search Team

Content Team

Page 45: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Pre-Continuous Delivery

1.2-BETA-20150401-113002

Test Discard

Test Discard1.2-BETA-20150402-093002

Build

Build

And so on…

Page 46: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Pre-Continuous Delivery

1.2-BETA-20150401-113002

Test Discard

Test Discard1.2-BETA-20150402-093002

Build

Build

Test Deploy1.2

Build

Page 47: DockerCon SF 2015: Enabling Microservices @Orbitz

Continuous Delivery with Jenkins, Docker, and Ansible (And then Marathon)

Page 48: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Yorfast-mbp:git rfast$ yo microservice

_-----_ | | .--------------------------. |--(o)--| | Welcome to the kickass | `---------´ | Microservice | ( _´U`_ ) | generator! | /___A___\ '--------------------------' | ~ | __'.___.'__ ´ ` |° ´ Y `

? Enter the name of your service. (E.G. "my-service")

Page 49: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Committer

Pull Request

Page 50: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Committer

Reviewer

Pull Request

Page 51: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Committer

Reviewer

Pull Request

Page 52: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Committer

Reviewer

Pull Request

Page 53: DockerCon SF 2015: Enabling Microservices @Orbitz

Jenkins Pipeline

Page 54: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

if(…) { x ++; }

Merge

Page 55: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Pipeline (Simplified)

build unit test publish

deploy dev

acceptance tests

deploy qa

deploy staging open RFC deploy

prod close RFC

Page 56: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Build

if(…) { x ++; }

1.2

Merge

Page 57: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Build

if(…) { x ++; }

1.2

Merge

1.2.

editorial-module.jar

./gradlew build

{BUILD_NUMBER}

Page 58: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Build

1.2

Merge

editorial-module.jar

if(…) { x ++; }

171.2.

Page 59: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Build

1.2

Merge

editorial-module.jar

FROM orbitz/java-8 ADD build/editorial-module.jar /opt/orbitz CWD /opt/orbitz CMD java -jar editorial-module.jar

if(…) { x ++; }

171.2.

Page 60: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Build

1.2

Merge

editorial-module.jar orbitz/editorial-module:1.2.17

if(…) { x ++; }

171.2.

Page 61: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Build

orbitz/editorial-module:1.2.17

Page 62: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

- hosts: dev - tasks: - name: find previous images docker_facts: image=orbitz/{{application}} register: previous - name: deploy new image docker: image=orbitz/{{application}}:{{version}} … - name: wait for service wait_for: port={{port}} … - name: check health endpoint uri: url="http://{{fqdn}}:{{port}}/health" … - name: kill old image docker: {{previous}}

git pull

playbook.yml (abridged)

Page 63: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

host-001 host-002 host-003 host-004 host-005

- hosts: dev

Page 64: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

host-001

1.2.16

Page 65: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

1.2.16 1.2.17

host-001

Page 66: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

1.2.16 1.2.17

host-001

Deploy

DATABASE_URL=jdbc://whatever/db/stuff CONSUL_HOST={{ansible_fqdn}} LOGSTASH_HOST={{ansible_fqdn}} GRAPHITE_HOST={{ansible_fqdn}}

Page 67: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

1.2.16 1.2.17

/health

host-001

Page 68: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

1.2.16 1.2.17

/health 200 OK

host-001

Page 69: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

1.2.16 1.2.17

host-001

Page 70: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

1.2.17

host-001

Page 71: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy

host-002

1.2.16

And so on…host-001

1.2.17

Page 72: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

What’s next?

Page 73: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

How to handle failure?

Page 74: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

What happens when a VM is moved?

Page 75: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

What if I need to add capacity?

Page 76: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- hosts: dev - tasks: - name: find previous images docker_facts: image=orbitz/{{application}} register: previous - name: deploy new image docker: image=orbitz/{{application}}:{{version}} … - name: wait for service wait_for: port={{port}} … - name: check health endpoint uri: url="http://{{fqdn}}:{{port}}/health" … - name: kill old image docker: {{previous}}

git pull

playbook.yml (abridged)

Page 77: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)- hosts: dev - tasks: - name: find previous images docker_facts: image=orbitz/{{application}} register: previous - name: deploy new image docker: image=orbitz/{{application}}:{{version}} … - name: wait for service wait_for: port={{port}} … - name: check health endpoint uri: url="http://{{fqdn}}:{{port}}/health" … - name: kill old image

git pull

playbook.yml (abridged)

- hosts: localhost - tasks: - name: marathon deploy marathon: image=orbitz/{{application}}:{{version}} instances=3

Page 78: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

New host setup

Page 79: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

Mesos Agent

New host setup

1.2.16

Page 80: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

playbook.yml

1.2.16 1.2.16

1.2.16

Page 81: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

1.2.16 1.2.16

1.2.16

Page 82: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

PUT /apps/editorial-module { “image”: “orbitz/editorial-module:1.2.17” … }

1.2.16 1.2.16

1.2.16

Page 83: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

PUT /apps/editorial-module { “image”: “orbitz/editorial-module:1.2.17” … }

- tasks: marathon: …

1.2.16 1.2.16

1.2.16

app = GET /v2/apps/editorial-module

if not app then deploy_id = POST /v2/apps { “image”: “orbitz/editorial-module:1.2.17”, “id”: “editorial-module” } else deploy_id = PUT /v2/apps/editorial-module { “image”: “orbitz/editorial-module:1.2.17” } end if

while GET /v2/deployments contains deploy_id // still deploying end

// deploy complete

Page 84: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

PUT /apps/editorial-module { “image”: “orbitz/editorial-module:1.2.17” … }

1.2.16 1.2.16

1.2.16

Page 85: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

1.2.16 1.2.16

1.2.16

Page 86: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

1.2.16 1.2.16

1.2.16

1.2.17 1.2.17

1.2.17

Page 87: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

/health

1.2.16 1.2.16

1.2.16

1.2.17 1.2.17

1.2.17

Page 88: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Deploy (Second Attempt)

- tasks: marathon: …

/health

200 OK 200 OK

200 OK

1.2.16 1.2.16

1.2.16

1.2.17 1.2.17

1.2.17

Page 89: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

- tasks: marathon: …

1.2.17 1.2.17

1.2.17

Page 90: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

And off to the next environment…

1.2.17 1.2.17

1.2.17

Page 91: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

1.2.17 1.2.17

1.2.17

What if?

Page 92: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

1.2.17 1.2.17

Page 93: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

1.2.17 1.2.17

Page 94: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

1.2.17 1.2.17 1.2.17

Page 95: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

/health

200 OK

1.2.17 1.2.17 1.2.17

Page 96: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

1.2.17 1.2.17 1.2.17

Page 97: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Smoke/Acceptance Testing

1.2.17

1.2.17

1.2.17

Page 98: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Paper Trail

create

tickets

commit(s)

Page 99: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Paper Trail

fail!

close/fail

Page 100: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Paper Trail

ok

close

Page 101: DockerCon SF 2015: Enabling Microservices @Orbitz

Build Unit Test

Deploy Dev

Deploy Prod

Deploy Staging

Acceptance TestCode

Review & Push

Production

Pre-Production

Open RFC

Close RFC

Page 102: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

What’s inside the containers?

• Spring Boot

• Dropwizard Metrics (formerly Coda Hale, Yammer)

• Consul Registration/Discovery

• Logstash + Logback

• Swagger

• Hystrix

• Retrofit + Consul

OrbitzWorldwide/consul-client

Page 103: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

–You

“Why didn’t you use {{.x}}?”

Page 104: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Keeping an eye on…

Kubernetes Amazon Elastic Container

Service

Docker Swarm

Page 105: DockerCon SF 2015: Enabling Microservices @Orbitz

#dockercon

Summary

• Create a shared platform for docker deployments using shared and app-specific “localhost” helpers — this was ours, yours SHOULD look different — adapt to change, don’t fight it.

• Take people out of the release process - Docker - repeatable applications

- Chef - repeatable infrastructure — Environment aware

- Jenkins - repeatable releases

• Delineate configuration concerns: - Known at Compile time — Bake into Docker image

- Known at Boot time — Bake into Playbook/Launcher - parameter to Docker run

- Changes Anytime — Externalize (consul K/V, etcd, zookeeper)

Page 106: DockerCon SF 2015: Enabling Microservices @Orbitz

Thanks!Steve Hoffman

@bacoboy

Rick Fast

@tortiepoint