Slide 1

Slide 1 text

Hardcore Docker Orchestrierung mit Swarm und Compose Dr. Halil-Cem Gürsoy @hgutwit adesso AG - Dortmund

Slide 2

Slide 2 text

Über mich ► Principal Architect @ adesso AG ► seit > 15 Jahre Software-Entwicklung > davor in wissenschaftlichem Umfeld
 ► Verteilte Enterprise-Systeme ► Persistenz / Build & Deployment 2

Slide 3

Slide 3 text

„Our highest priority is to satisfy the customer through early and continuous delivery of 
 valuable software.“ Agile Manifesto Principles

Slide 4

Slide 4 text

CD + Docker Workflow - supertrivial 4 Build Java Project mvn Repo Server Deploy
 Java App v 1.0.0 Build Docker Image Get Artifact
 v 1.0.0 Docker Registry Push Image
 v 1.0.0 Create & Start Docker Container Docker Host Stop / Kill
 Container Pull Image
 v 1.0.0

Slide 5

Slide 5 text

Build once - 
 deploy many! https://www.flickr.com/photos/jstar/2338025074

Slide 6

Slide 6 text

www.flickr.com/photos/matijagrguric/4437187539/ Deploy
 Dev Deploy Test Deploy UAT Deploy PP Deploy Prod Promote! 6

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

Application „Container“ 8 https://www.flickr.com/photos/matijagrguric/4437187539

Slide 9

Slide 9 text

Eine Anwendung = viele Container ► Eine Applikation besteht nicht nur aus einem Container > ein Container isoliert nur einen Prozess ► Module / Services in eigenen Containern > Stichwort Microservices 9 www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/

Slide 10

Slide 10 text

Warum Orchestrierung? ► Container müssen miteinander kommunizieren ► Was, wenn Container auf verschiedene Server verteilt werden? 10 www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/ www.flickr.com/photos/matijagrguric/4437187539/

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

https://www.flickr.com/photos/tomwahlin/with/3167491292/

Slide 13

Slide 13 text

https://www.flickr.com/photos/ryandesiderio/1023387642

Slide 14

Slide 14 text

14 Quelle: Docker. Inc.

Slide 15

Slide 15 text

15 ?

Slide 16

Slide 16 text

16 !=

Slide 17

Slide 17 text

Swarm != Swarm ► Docker Swarm > Standalone-Applikation ► Docker Engine „Swarm-Mode“ > Swarm in Engine integriert ► Docker „Swarmkit“ > Standalone 17

Slide 18

Slide 18 text

18 https://www.flickr.com/photos/rpenalozan/5832396644

Slide 19

Slide 19 text

19 Quelle: Docker. Inc.

Slide 20

Slide 20 text

Docker Swarm ► Wir schauen uns ‚das Original‘ an ► Inzwischen mit Version 1.2.5 „reif“ > es gab diverse schwere oder einfach störende Bugs ► Unterstützung in Docker Machine > gut für eine Demo ;-) ► Sollte noch eine „Weile“ bestehen (Stand 15.09.16):
 „Docker does not currently have a plan to deprecate Docker Swarm.“ (https://github.com/docker/swarm) 20

Slide 21

Slide 21 text

Docker Swarm ► Implementiert Remote API der Docker Engine > incl. kleine Ausnahmen bei den Ausgaben, z.B. 
 docker info oder docker inspect ► Fungiert als Proxy bei Zugriffen durch Clients > Cluster erscheint dabei als ein einzelner Docker-Host ► Unterteilt in Swarm Manager und Swarm Agents > Agents sind optional, es reicht eigentlich ein Docker Daemon 21

Slide 22

Slide 22 text

Docker Swarm - Setup ► Einige (wenige) Voraussetzungen > K/V-Store für den Cluster Discovery – etcd, Consul, Zookeeper – geht aber auch ohne… > K/V-Store für das Overlay-Netzwerk (falls benötigt) > Hardware / VMs – lokal (z.B. VirtualBox) zum Rumspielen geht auch 22

Slide 23

Slide 23 text

Docker Swarm - Setup docker-machine create \ --driver digitalocean\ --swarm \ --swarm-image=$SWARM_IMAGE \ --swarm-master \ --swarm-discovery="consul://${CONSUL_IP}:8500" \ --engine-opt="cluster-advertise=$BIND_INTERFACE:2376" \ --engine-opt="cluster-store=consul://${CONSUL_IP}:8500" \ --engine-label="node=swarm-1" \ swarm-1 23 Welches Image? Bitte sei ein Master! Consul- Koordinaten Eigene Koordinaten Nochmal Consul für Netzwerk

Slide 24

Slide 24 text

Docker Swarm - Setup docker-machine create \ --driver digitalocean\ --swarm \ --swarm-image=$SWARM_IMAGE \ --swarm-discovery="consul://${CONSUL_IP}:8500" \ --engine-opt="cluster-advertise=$BIND_INTERFACE:2376" \ --engine-opt="cluster-store=consul://${CONSUL_IP}:8500" \ --engine-label="node=swarm-1" \ swarm-1 ► Aber natürlich auch „manuell“ möglich $ docker run -d -p 4000:4000 swarm manage -H :4000 
 --advertise $BIND_INTERFACE:2376 consul://${CONSUL_IP}:8500 24 Jetzt nur ein Agent DO braucht paar Parameter mehr Name des Knotens als Docker-Label Name der VM

Slide 25

Slide 25 text

Swarm Manager - Scheduler Strategies ► Scheduler arbeitet auf Basis von Strategies und Filter ► „Strategies“ schauen nach CPU- und Memory-Auslastung der Knoten und was der neue Container benötigt ► Aktuell drei Strategies zur Gewichtung von Knoten: > spread – default, lastet gleichmäßig aus > binpack - macht einen Knoten nach dem anderen voll > random 25

Slide 26

Slide 26 text

Swarm Manager - Scheduler Strategies ► Starten des Managers mit binpack $ docker run -d -p 4000:4000 swarm manage —strategy binpack ...
 $ for ((i = 0; i < max; i++)) do
 docker -H swarm:4000 run -d -P -m 512m apache2:latest
 done ► Aber Achtung: Docker zählt den reservierten Speicher zusammen, nicht den tatsächlich verbrauchten ► „Poor man’s“ Overcommit 
 $… manage … --cluster-opt swarm.overcommit=0.10 26 10% des tatsächlich vorhandenen Speichers

Slide 27

Slide 27 text

Swarm Manager - Scheduler Filter ► Der Scheduler bietet diverse Filter zur Knoten-Auswahl > Constraint - Label auf einer Docker Engine > Affinity - Zusammen mit einer definierten Ressource > Port - Auf welchem Node ist Port xy noch frei? > Dependency - bitte mit Container XY zusammen > Health - nur auf gesunden Nodes $ docker daemon --label storage=ssd $ docker run -d -P -e constraint:storage==ssd --name db mysql 27

Slide 28

Slide 28 text

Swarm HA ► Hochverfügbarkeit über mehrere parallel laufende Manager ► Option --replication und ein K/V-Store benötigt ► Leader / Secondaries > Kommunikation und Arbeiten mit jedem Manager möglich ► Automatic Failover > Cluster wählt einen neuen Leader > --replication-ttl Zeit bis Leader-Neuwahl > --heartbeat - Zeitintervall für Check durch Secondaries 28

Slide 29

Slide 29 text

Swarm mit Overlay-Netzwerk ► Ab Docker 1.9 unterstützt libnetwork ein Overlay-Netzwerk > Netzwerk Node-überspannend möglich ► Virtuelles Netzwerk basierend auf vxlan ► Aktuell Minimum Kernel 4.2.x > Kernel-Upgrade bei Ubuntu 14.04 nötig (oder Debian 8) ► Consul oder Etcd oder ZooKeeper als K/V-Store > Netzwerk-Infos werden dort abgelegt ► ab Docker 1.10.0 gibt es ein ‚embedded DNS‘ 29

Slide 30

Slide 30 text

Swarm - Overlay-Netzwerk $ $DOCKER network create -d overlay multihost
 $ $DOCKER network ls | grep overlay NETWORK ID NAME DRIVER 36935a0674d4 multihost overlay ► Beim Start des Containers Netzwerk mitteilen: $ $DOCKER run -d -P --net="multihost" elasticsearch
 ► libnetwork ist Plugin-basiert > Overlay, Weave, Contiv, Kuryr ► Swarm 1.0.x wird mit unterstützt 30

Slide 31

Slide 31 text

31

Slide 32

Slide 32 text

Docker Compose ► Ehemals ‚Fig‘ ► in Python implementiert > libcompose in Golang, hängt aber hinterher ► Kapselt Docker-Kommandos in einer Konfiguration ► „Compose is a tool for defining and running multi-container applications with Docker.“ ► Gut geeignet um komplexe Infrastruktur nicht nur für Entwickler aufzubauen 32

Slide 33

Slide 33 text

Docker Compose - Basics ► Konfiguration über YAML-Dateien: myapp: image: superapp:1.0.1 ports: - "8080:8080" volumes: - ./conf:/etc/myapp/conf environment: - database=mysql depends-on: - mysql mysql: image: mysql ►docker-compose up 33 Service- Definition Welches Image? mysql muss gestartet worden sein

Slide 34

Slide 34 text

Docker Compose ► Es geht komplexer: Kubernetes auf Swarm etcd: image: gcr.io/google_containers/etcd:2.0.13 container_name: etcd command: ['/usr/local/bin/etcd', '--bind-addr=0.0.0.0:4001', '--data-dir=/var/etcd/ data'] apiserver: image: gcr.io/google_containers/hyperkube:v1.0.7 container_name: apiserver ports: - "8080" command: ["/hyperkube", "apiserver", "--service-cluster-ip-range=172.17.17.1/24", "-- address=0.0.0.0", "--etcd_servers=http://etcd:4001", "--cluster_name=kubernetes", "-- v=2"] controller: image: gcr.io/google_containers/hyperkube:v1.0.7 command: ["/hyperkube", "controller-manager", "--address=0.0.0.0", "--master=http:// apiserver:8080", "--v=2"] environment: - "affinity:container==*apiserver*" ... Quelle 'Swarm Frontend’ (https://github.com/docker/swarm-frontends) 34

Slide 35

Slide 35 text

Docker Compose - Skalierung ► Skalierung der Services > compose scale #anzahl ► Container bekommen entsprechende Namen > elastic_esnode_1 ► Bei Verlust eines Containers kein „rescale“ ► Resheduling von Swarm muss genutzt werden > Env-Variable reschedule:on-node-failure 35

Slide 36

Slide 36 text

Swarm und Compose-Limits ► Kein übergreifendes Monitoring ► Kein ‚Move‘ ohne Plugins möglich ► Auto-Scaling usw.
 ► In Compose kein Warten auf startende Container > daher Compose oft in Wrapper eingebettet 36

Slide 37

Slide 37 text

https://www.flickr.com/photos/schwaber/3238977103

Slide 38

Slide 38 text

Swarm und Compose im Zusammenspiel ► Eine Applikation zum Suchen nach Zitaten aus Shakespeare-Stücken ► Ein Elasticsearch-Cluster enthält die Zitate > Consul wird initial gestartet > Elasticsearch-Knoten werden während des Starts in Consul registriert > Nodes finden sich über Service-Discovery – DNS SRV auf Consul 38

Slide 39

Slide 39 text

Swarm und Compose im Zusammenspiel ► Spring Boot-Applikation mit Spring Data Elasticsearch und Spring Cloud Consul ► Koordinaten des Elasticsearch-Clusters werden aus Consul abgeholt (Abfrage der Services) > ist allerdings (noch) nicht resilient ;-) ► 4 VM’s ► 3 Elasticsearch-Nodes ► 1 Applikation 39

Slide 40

Slide 40 text

Die Beispiel-Applikation - Compose networks: elasticnet: driver: overlay consul: image: ${CONSUL_IMAGE} container_name: discoverer environment: - "constraint:node==swarm-1" command: -bootstrap-expect 1 -advertise 10.0.0.2 ports: - "8500:8500" - "8400:8400" - "8600:8600/tcp" networks: - elasticnet 40 Hier eine Annahme getroffen… geht bestimmt besser! Netzwerk des Containers Netzwerk- Definition mit Overlay- Treiber

Slide 41

Slide 41 text

Die Beispiel-Applikation - Compose command: /bin/bash -c "ES_IP=$$(ip addr | awk '/inet/ && /eth0/{sub(/\/.*$$/,\"\",$$2); print $$2}') && CONSDATA='{\"Node\":\"'$${HOSTNAME}'\",\"Address\":\"'$$ES_IP'\",\"Service \":{\"ID\":\"elastic-'$${HOSTNAME}'\",\"Service\":\"elastic\",\"ServiceAddress\":\"'$$ {ES_IP}'\",\"Port\":9300}}' && echo \"Data to send to Consul to register service $$CONSDATA \" && curl -X PUT -d $$CONSDATA http://discoverer:8500/v1/catalog/register && plugin install karmi/elasticsearch-paramedic || { echo Error installing plugin install srv-discovery --url https://github.com/github/elasticsearch-srv-discovery/ releases/download/1.5.1/elasticsearch-srv-discovery-1.5.1.zip || { echo Error installing plugin. Maybe it is allready installed. ;} && elasticsearch \ -Des.node.name=$${HOSTNAME} -Des.discovery.srv.query=${SRV_DISCOVERY_QUERY} \ -Des.discovery.srv.servers=discoverer:8600 \ -Des.discovery.srv.protocol=tcp \ -Des.logger.discovery=TRACE" environment: - "reschedule:on-node-failure" restart: always depends_on: - consul 41 Magic zum registrieren im Consul Und DNS SRV für Cluster Wenn Knoten ausfällt auf anderem Neustarten!

Slide 42

Slide 42 text

Die Beispiel-Applikation - Compose elasticshakespeare: image: ${ELASTICSHAKESPEARE_IMAGE} container_name: elasticshakespeare ports: - 8080 environment: - "constraint:node==swarm-1" - "reschedule:on-node-failure" - spring.cloud.consul.host=discoverer - spring.cloud.consul.port=8500 depends_on: - consul - esnode networks: - elasticnet 42 Consul!

Slide 43

Slide 43 text

http://www.flickr.com/photos/an_untrained_eye/6630719431

Slide 44

Slide 44 text

http://www.flickr.com/photos/tcmorgan/7372944070 [email protected] https://twitter.com/hgutwit