Orchestration in Docker · 2017-12-14 · Orchestration in Docker Swarm mode, Docker services and...

Post on 21-Jun-2020

21 views 0 download

Transcript of Orchestration in Docker · 2017-12-14 · Orchestration in Docker Swarm mode, Docker services and...

Orchestration in Docker

Swarm mode, Docker services and declarative application deployment

Mike Goelzer & Victor VieuxDocker

Mike Goelzer / mgoelzer@docker.com / gh: mgoelzer

Orchestration Overview

Orchestration in Docker● Orchestration

○ Swarm Mode○ Docker Services○ Security○ Routing mesh

● Container Healthcheck

Engine

Swarm Mode

$ docker swarm init

Engine

Swarm Mode

$ docker swarm init

$ docker swarm join <IP of manager>:2377

Engine

Engine

Engine

Engine

EngineEngine Engine

Swarm Mode

$ docker swarm init

$ docker swarm join <IP of manager>:2377

Engine

Engine

Engine

EngineEngine Engine

Services

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp frontend_image:latest

mynet

Engine

Engine

Engine

EngineEngine Engine

Services

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp frontend_image:latest

$ docker service create --name redis --network mynet redis:latest

mynet

Engine

Engine

Engine

EngineEngine Engine

Node Failure

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp frontend_image:latest

$ docker service create --name redis --network mynet redis:latest

mynet

Engine

Engine

Engine

EngineEngine Engine

Node Failure

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp frontend_image:latest

$ docker service create --name redis --network mynet redis:latest

mynet

Engine

Engine

Engine

EngineEngine

Desired State ≠ Actual State

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp frontend_image:latest

$ docker service create --name redis --network mynet redis:latest

mynet

Engine

Engine

Engine

EngineEngine

Converge Back to Desired State

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp frontend_image:latest

$ docker service create --name redis --network mynet redis:latest

mynet

Engine

Engine

Engine

EngineEngine

Scaling

$ docker service scale frontend=6

mynet

Engine

Engine

Engine

EngineEngine

Scaling

$ docker service scale frontend=10

mynet

Engine

Engine

Engine

EngineEngine

Global Services

$ docker service create --mode=global --name prometheus prom/prometheus

mynet

Engine

Engine

Engine

EngineEngine

Constraints

Engine

docker daemon --label com.example.storage="ssd"

docker daemon --label com.example.storage="ssd"

Engine

Engine

Engine

EngineEngine

Constraints

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp --constraint engline.labels.com.example.storage==ssd frontend_image:latest

Engine

docker daemon --label com.example.storage="ssd"

docker daemon --label com.example.storage="ssd"

Engine

Engine

Engine

EngineEngine

Constraints

$ docker service create --replicas 3 --name frontend --network mynet

--publish 80:80/tcp --constraint engline.labels.com.example.storage==ssd frontend_image:latest$ docker service scale frontend=10

Engine

docker daemon --label com.example.storage="ssd"

docker daemon --label com.example.storage="ssd"

Services

Services are grouped into stacks

Swarm mode orchestration is optional● You don’t have to use it● 1.12 is fully backwards compatible● Will not break existing deployments and scripts

Routing Mesh• Operator reserves a

swarm-wide ingress port (8080) for myapp

• Every node listens on 8080• Container-aware routing mesh

can transparently reroute traffic from Worker3 to a node that is running container

• Built in load balancing into the Engine

• DNS-based service discovery

Worker 1

:8080

Manager

User accesses myapp.com:8080:8080

Worker 2

:8080

Worker 3

:8080

frontend frontend

$ docker service create --replicas 3 --name frontend --network mynet

-p 8080:80 frontend_image:latest

frontend

Routing Mesh: Published Ports• Operator reserves a

swarm-wide ingress port (8080) for myapp

• Every node listens on 8080• Container-aware routing mesh

can transparently reroute traffic from Worker3 to a node that is running container

• Built in load balancing into the Engine

• DNS-based service discovery

Worker 1

:8080

Manager

User accesses myapp.com:8080:8080

Worker 2

:8080

Worker 3

:8080

frontend frontend

$ docker service create --replicas 3 --name frontend --network mynet

-p 8080:80 frontend_image:latest

frontend

Security out of the box Cryptographic Node Identity

○ Workload segregation (think PCI) There is no “insecure mode”:

○ TLS mutual auth○ TLS encryption○ Certificate rotation

HEALTHCHECK --interval=5m --timeout=3s

--retries 3

CMD curl -f http://localhost/ || exit 1

Checks every 5 minutes that web server can return index page within 3 seconds.

Three consecutive failures puts container in an unhealthy state.

Container Health Check in Dockerfile

Victor Vieux / vieux@docker.com / gh: vieux

Orchestration Deep Dive

+ demo at the end

Node

Node

Node

NodeNode

Node

Swarm Topology

Node

Node

Node

Node

Node

Node

Node

Node

Node

NodeNode

Node

Swarm Topology

Node

Node

Node

Node

Node

Node

Manager

Worker

Node

Node

Node

NodeNode

Node

Swarm Topology

Node

Node

Node

Node

Node

Node

Manager

Worker

● Each Node has a role● Roles are dynamic● Programmable Topology

Manager ManagerManager

Worker WorkerWorkerWorker WorkerWorker Worker

Internal Distributed State Store

Raft consensus group

Docker swarm mode communication internals

Gossip network

gRPC

Manager ManagerManager

Internal Distributed State Store

Raft consensus group

Quorum Layer

● Strongly consistent: Holds desired state● Simple to operate● Blazing fast (in-memory reads, domain specific indexing, ...)● Secure

Worker WorkerWorkerWorker WorkerWorker Worker

Worker-to-Worker Gossip

Gossip network

● Eventually consistent: Routing mesh, load balancing rules, ...● High volume, p2p network between workers● Secure: Symmetric encryption with key rotation in Raft

API

Allocator

Orchestrator

Scheduler

Dispatcher

RAFT

Manager Node

Worker

ExecutorWorker Node

Accepts command from client and creates service object

Reconciliation loop for service objects and creates tasks

Allocates IP addresses to tasks

Assigns nodes to tasks

Checks in on workers

docker service create

Connects to dispatcher to check on assigned tasks

Node Breakdown

Executes the tasks assigned to worker node

Internal Load Balancer

Ingress Load Balancer

Secure by default with end-to-end encryption• Cryptographic node

identity• Automatic encryption

and mutual auth (TLS)• Automatic cert rotation• External CA

integration

Manager Node

CertificateAuthority

TLS

Manager Node

CertificateAuthority

TLS

Manager Node

CertificateAuthority

TLS

Worker

TLS

Worker

TLS

Worker

TLS

DEMO

Questions?

Victor Vieuxvieux@docker.com / @vieux

Mike Goelzermgoelzer@docker.com / @mgoelzer

Victor Vieuxvieux@docker.com / @vieux

Mike Goelzermgoelzer@docker.com / @mgoelzer