Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hardcore Docker Orchestrierung mit Docker Swarm und Docker Compose

Hardcore Docker Orchestrierung mit Docker Swarm und Docker Compose

Presented @ Berlin Expert Days 2016. The slides are in German.

Halil-Cem Gürsoy

September 16, 2016
Tweet

Other Decks in Programming

Transcript

  1. Über mich ► Principal Architect @ adesso AG ► seit

    > 15 Jahre Software-Entwicklung > davor in wissenschaftlichem Umfeld
 ► Verteilte Enterprise-Systeme ► Persistenz / Build & Deployment 2
  2. „Our highest priority is to satisfy the customer through early

    and continuous delivery of 
 valuable software.“ Agile Manifesto Principles
  3. 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
  4. 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/
  5. 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/
  6. Swarm != Swarm ► Docker Swarm > Standalone-Applikation ► Docker

    Engine „Swarm-Mode“ > Swarm in Engine integriert ► Docker „Swarmkit“ > Standalone 17
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 31

  19. 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
  20. 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
  21. 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
  22. Docker Compose - Skalierung ► Skalierung der Services > compose

    scale <service> #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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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!
  28. 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!