Enabling Microservices @Orbitz - DevOpsDays Chicago 2015

89
#devopsdays Chicago 2015 Enabling Microservices @Orbitz Steve Hoffman Senior Principal Engineer @bacoboy

Transcript of Enabling Microservices @Orbitz - DevOpsDays Chicago 2015

#devopsdaysChicago 2015

Enabling Microservices

@Orbitz

Steve HoffmanSenior Principal Engineer

@bacoboy

#devopsdaysChicago 2015

#devopsdaysChicago 2015

Outline

• Brief Architecture Overview/History

• From Monolithic to Services to Microservices/Docker

• Automated Pipelines

• Questions

#devopsdaysChicago 2015

#devopsdaysChicago 2015

2000

#devopsdaysChicago 2015

2000

Yes, we are STILL hiring!

#devopsdaysChicago 2015

2000

Yes, we are STILL hiring!@OrbitzTalent

#devopsdaysChicago 2015

2000

Web Layer

Business Layer

#devopsdaysChicago 2015

2000

#devopsdaysChicago 2015

2000

#devopsdaysChicago 2015

2000

Business Layer

#devopsdaysChicago 2015

2000

Business Layer

#devopsdaysChicago 2015

Business Layer

2000

#devopsdaysChicago 2015

Business Layer

2003

#devopsdaysChicago 2015

Business Layer

2003

#devopsdaysChicago 2015

Business Layer

2003

#devopsdaysChicago 2015

2003

#devopsdaysChicago 2015

2004

#devopsdaysChicago 2015

2004

#devopsdaysChicago 2015

2004

#devopsdaysChicago 2015

2012

#devopsdaysChicago 2015

2012

#devopsdaysChicago 2015

2012• Multiple Brands

• Websites

• Webservices

• Multiple Backends

• 500+ apps / thousands of instances

• Deployments Daily (sometimes more)

#devopsdaysChicago 2015

2015• Multiple Brands

• Websites

• Webservices

• Multiple Backends

• 500+ apps / thousands of instances

• Deployments Daily (sometimes more)

#devopsdaysChicago 2015

Process Overkill

#devopsdaysChicago 2015

Different Provisioning Tools

DEV OPS

#devopsdaysChicago 2015

Different Provisioning Tools

DEV OPS

Application Platform!=

#devopsdaysChicago 2015

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 - Minutes not Days

#devopsdaysChicago 2015

#devopsdaysChicago 2015

Module

Module

Module Module

#devopsdaysChicago 2015

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

#devopsdaysChicago 2015

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

Hotel Team Search Team Content Team

#devopsdaysChicago 2015

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

#devopsdaysChicago 2015

OrbitzContent

Orchestration Service

Content (Solr)

Editorial Module

Search Module

Hotel Module

Hotel Team

Search Team

Content Team

#devopsdaysChicago 2015

Pre-Continuous Delivery

1.2-­‐BETA-­‐20150401-­‐113002

Test Discard

Test Discard1.2-­‐BETA-­‐20150402-­‐093002

Build

Build

And so on…

#devopsdaysChicago 2015

Pre-Continuous Delivery

1.2-­‐BETA-­‐20150401-­‐113002

Test Discard

Test Discard1.2-­‐BETA-­‐20150402-­‐093002

Build

Build

Test Deploy1.2

Build

#devopsdaysChicago 2015

App

App

App

#devopsdaysChicago 2015

App

App

App

#devopsdaysChicago 2015

AppApp

App

xN

#devopsdaysChicago 2015

AppApp

App

xN

#devopsdaysChicago 2015

Continuous Delivery with Jenkins, Docker, Ansible

and Marathon

#devopsdaysChicago 2015

Committer

Pull Request

#devopsdaysChicago 2015

Committer

Reviewer

Pull Request

#devopsdaysChicago 2015

Committer

Reviewer

Pull Request

#devopsdaysChicago 2015

Committer

Reviewer

Pull Request

#devopsdaysChicago 2015

Jenkins Pipeline

#devopsdaysChicago 2015

if(…) { x ++; }

Merge

#devopsdaysChicago 2015

build unit test publish

deploy dev

acceptance tests

deploy qa

deploy staging open RFC deploy

prod close RFC

Pipeline (Simplified)

#devopsdaysChicago 2015

if(…) { x ++; }

1.2

MergeBuild

#devopsdaysChicago 2015

if(…) { x ++; }

1.2

Merge

1.2.

editorial-module.jar

./gradlew build

{BUILD_NUMBER}

Build

#devopsdaysChicago 2015

1.2

Merge

editorial-module.jar

if(…) { x ++; }

171.2.

Build

#devopsdaysChicago 2015

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.

Build

#devopsdaysChicago 2015

1.2

Merge

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

if(…) { x ++; }

171.2.

Build

#devopsdaysChicago 2015

orbitz/editorial-module:1.2.17

Build

#devopsdaysChicago 2015

Master

MasterSlave

Commit/Push or Pull Request/Merge

#devopsdaysChicago 2015

Master

MasterSlave

Poll or Push Trigger

Commit/Push or Pull Request/Merge

#devopsdaysChicago 2015

Master

Master

Slave

Slave

Poll or Push Trigger

Commit/Push or Pull Request/Merge

#devopsdaysChicago 2015

Master

Master

Slave

Slave

Poll or Push Trigger

Commit/Push or Pull Request/Merge

#devopsdaysChicago 2015

Master

Master

Slave

Slave

Poll or Push Trigger

Commit/Push or Pull Request/Merge

Clone & Build Push Artifacts

#devopsdaysChicago 2015

Master

MasterSlave

#devopsdaysChicago 2015

Jenkins on Docker on MesosSlides: http://bit.ly/oww-mesoscon2015-slides

Video: Coming to YouTube

#devopsdaysChicago 2015

git pull

playbook.yml (abridged)

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

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

playbook.yml1.2.16

1.2.16

1.2.16

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

1.2.16

1.2.16

1.2.16

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

1.2.16

1.2.16

1.2.16

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

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

1.2.16

1.2.16

1.2.16

Deploy

#devopsdaysChicago 2015

Deploy

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

#devopsdaysChicago 2015

- tasks: marathon: …

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

1.2.16

1.2.16

1.2.16

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

1.2.16

1.2.16

1.2.16

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

1.2.16

1.2.16

1.2.16

1.2.17

1.2.17

1.2.17

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

/health

1.2.16

1.2.16

1.2.16

1.2.17

1.2.17

1.2.17

Deploy

#devopsdaysChicago 2015

- 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

Deploy

#devopsdaysChicago 2015

- tasks: marathon: …

1.2.17

1.2.17

1.2.17

Deploy

#devopsdaysChicago 2015

And off to the next environment…

1.2.17

1.2.17

1.2.17

Deploy

#devopsdaysChicago 2015

1.2.17

1.2.17

1.2.17

What if?

#devopsdaysChicago 2015

1.2.17

1.2.17

#devopsdaysChicago 2015

1.2.17

1.2.17

#devopsdaysChicago 2015

1.2.17 1.2.17

1.2.17

#devopsdaysChicago 2015

/health

200 OK

1.2.17 1.2.17

1.2.17

#devopsdaysChicago 2015

1.2.17 1.2.17

1.2.17

#devopsdaysChicago 2015

Smoke/Acceptance Testing

1.2.17

1.2.17

1.2.17

#devopsdaysChicago 2015

Paper Trail

create

tickets

commit(s)

#devopsdaysChicago 2015

Paper Trail

fail!

close/fail

#devopsdaysChicago 2015

Paper Trail

ok

close

#devopsdaysChicago 2015

Build Unit Test

Deploy Dev

Deploy Prod

Deploy Staging

Acceptance TestCode

Review & Push

Production

Pre-Production

Open RFC

Close RFC

#devopsdaysChicago 2015

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

#devopsdaysChicago 2015

Keeping an eye on…

Hashicorp Vault Rancher Convoy

Kubernetes Amazon Elastic Container

Service

Docker Swarm + Machine

#devopsdaysChicago 2015

Summary• Create a 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.

• People don’t scale, use automation

• Docker - repeatable applications (environment portable apps)

• Chef - repeatable infrastructure (environment aware services)

• Jenkins - repeatable releases (pipelines)

• 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)

#devopsdaysChicago 2015

Questions?

@bacoboy