Docker swarm-mike-goelzer-mv-meetup-45min-workshop 02242016 (1)

22
Swarm: Docker Native Clustering Mike Goelzer [email protected] GH: @mgoelzer Freenode/Twitter: @mikegoelzer

Transcript of Docker swarm-mike-goelzer-mv-meetup-45min-workshop 02242016 (1)

Swarm:DockerNativeClustering

[email protected]:@mgoelzerFreenode/Twitter:@mikegoelzer

Swarm:Simplicity,Flexibility,EaseofSetup

• WhatisSwarm?• SetupaSwarmcluster• Samplemicroservice applicationonSwarmwithdemo

SwarmturnsmultipleDockerhostsintoasingle,virtualDockerhost.

dockerdaemon(node-1)

Container

Container

>_Docker CLI

dockerDockerComposeKitematicJenkinsplugin

dockerdaemon(node-1)

Container

Container

>_Docker CLI

SwarmmanagerdockerDockerComposeKitematicJenkinsplugin

dockerdaemon(node-0)

Container

Container

dockerdaemon(node-2)

Container

Container

SwarmFeatures

• Scheduling• Reschedulingonfailure• HA(multiplemasters)• Labels,affinitiesandconstraintstocontrolschedulingdecisions• DNS-basedservicediscovery

SwarmCluster

Threestepstocreateacluster

1. CreateaKV(Consul,etcd,zk)2. RunSwarmManagercontainer3. RestartyourDockerdaemonswithclusterarguments

Step1:CreateaKVKVisfornodediscoveryandlibnetwork IPallocation(Consul,etcd,orzk)

docker run

--restart=unless-stopped

-d

-p 8500:8500

--name consul

-h consul

progrium/consul -server -bootstrap

-ui-dir /ui

Refs:https://www.consul.io/docs/agent/options.html

WebUIon:http://192.168.33.11:8500/ui/

Single-node Consul cluster

HostnameContainernameMap Consul port to hostDaemonize container processRestart policy

Step2:StartSwarmmanager

docker run -d -p 3375:2375 swarm manage --discovery-opt="kv.path=docker/nodes"consul://192.168.33.10:8500/

Refs:https://docs.docker.com/swarmhttps://docs.docker.com/swarm/install-manual/

Step3:Addsomeargstoyourdaemons

RestartDockerdaemonswith:

DOCKER_OPTS=-H=tcp://0.0.0.0:2375--cluster-store=consul://192.168.33.10:8500--cluster-advertise=eth1:2375

Refs:https://docs.docker.com/swarmhttps://docs.docker.com/swarm/install-manual/

ExampleRepo:MicroserviceApponSwarm

https://github.com/mgoelzer/swarm-demo-voting-app(thenfollowHOWTO.txt)

Demonstratesamicroservice apponSwarmincluding:• Vagrantfile +AWSCloudFormationtemplatetodeploythecluster• Loadbalancedwebfrontend• DNS-basedservicediscovery

Interlock(nginxorha_proxy)

web01

redis01

web02

redis02

web03

redis03

web04

redis04

web05

redis05

pg results-app

ClusteredVotingApp

Repo:https://github.com/mgoelzer/swarm-demo-voting-app

ClusteredVotingApp

Repo:https://github.com/mgoelzer/swarm-demo-voting-app

Interlock(nginxorha_proxy)

web01

redis01

web02

redis02

web03

redis03

web04

redis04

web05

redis05

pg results-app

Interlock(nginxorha_proxy)

web01

redis01

web02

redis02

web03

redis03

web04

redis04

web05

redis05

pg results-app

10.0.0.4

10.0.0.3

36.36.36.36

10.0.0.100

10.0.0.6

10.0.0.5

10.0.0.7

10.0.0.6

10.0.0.9

10.0.0.8

10.0.0.11

10.0.0.10

10.0.0.101

Interlock(nginxorha_proxy)

web01

redis01

web02

redis02

web03

redis03

web04

redis04

web05

redis05

pg results-app

10.0.0.4

10.0.0.3

36.36.36.36

10.0.0.100

10.0.0.6

10.0.0.5

10.0.0.7

10.0.0.6

10.0.0.9

10.0.0.8

10.0.0.11

10.0.0.10

10.0.0.101

192.168.33.11 192.168.33.12

.20 .21 .22 .23 .24

.200 .201

.251

Consul

Manager

Host

Container

10.0.0.4 ContainerIPs192.168.33.11 NodeIP

for (int i = min; i <= max; i++) {

String hostname = String.format(“redis%02d.mynet”,i);

try {

InetAddress inetAddress = InetAddress.getByName(hostname);

String addr = inetAddress.getHostAddress();

queues.add(new RedisQueue(hostname, addr));

} catch (UnknownHostException e) {

// No such host

}

}

return queues;

“redis01.mynet””redis02.mynet”etc.

e.g.,“10.0.0.23”

WorkerdiscoversRedis’satruntimebyDNS

queuesredis01.mynet 10.0.0.23

redis02.mynet 10.0.0.24

redis03.mynet 10.0.0.25

DemoTofollowalongathome:1. Clonehttps://github.com/mgoelzer/swarm-demo-voting-app2. FollowinstructionsinHOWTO.txt file(inrootofrepo).3. Screencastsofthedemo:

• Step1:VagrantUp(https://www.youtube.com/watch?v=gKiEveAjgU8)• Step2:CreateSwarmCluster(https://www.youtube.com/watch?v=IskSZC5wv7A)• Step3:Builddemoappimages(https://www.youtube.com/watch?v=ZRFtNQB-VY8)• Step4:Startdemoappcontainers(https://www.youtube.com/watch?v=jlrpWrsvB2Q)• Step5:Usethedemoapp(https://www.youtube.com/watch?v=_Pc07ThTbzs)

Jérôme’sExample:CoinMiner

Slides:http://view.dckr.info/Repo:https://github.com/jpetazzo/orchestration-workshop

Demonstrates:• Chaos-monkeyproofcluster• HowtodobatchworkloadsonSwarm• ELKstackforlogging andmetrics• Otherloadbalancingpatternsbeyond Interlock

(anotherSwarmexampleapp)

MikeGoelzer|[email protected] | GH:@mgoelzer |@mikegoelzer