Share
Embed
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
Transcript
44 slides
-
Hardcore Docker Orchestrierung mit Swarm und Compose Dr. Halil-Cem Gürsoy
@hgutwit adesso AG - Dortmund -
Über mich ► Principal Architect @ adesso AG ► seit
> 15 Jahre Software-Entwicklung > davor in wissenschaftlichem Umfeld ► Verteilte Enterprise-Systeme ► Persistenz / Build & Deployment 2 -
„Our highest priority is to satisfy the customer through early
and continuous delivery of valuable software.“ Agile Manifesto Principles -
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 -
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/ -
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/ -
Swarm != Swarm ► Docker Swarm > Standalone-Applikation ► Docker
Engine „Swarm-Mode“ > Swarm in Engine integriert ► Docker „Swarmkit“ > Standalone 17 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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! -
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!