close

Anmelden

Neues Passwort anfordern?

Anmeldung mit OpenID

Deployments mit Docker - SolutionsCamp

EinbettenHerunterladen
DEPLOYMENTS MIT
DOCKER
Created by Wojciech Pietrzak / @astropanic
ÜBER MICH
Angefangen mit PHP, Perl und Bash in einer Werbeagentur
(SEO)
Entwicklung von Webandwendungen mit Ruby on Rails
Softwareentwickler bei AKRA GmbH
Organizator des Docker Hamburg Meetups
MEIN ERSTES DEPLOYMENT
VERSIONSKONTROLLE
CLUSTERSSH / CAPISTRANO
VERSIONSKONTROLLE V2
Ruby
Rails / Sinatra
NodeJS
LibXML
wkhtmltopdf
ImageMagick
C-Extensions
VERSIONSKONTROLLE V3
Webservers (Nginx/Apache)
Application Servers (Passenger/Unicorn)
Session storage (Redis)
Message Bus (RabbitMQ)
Workers
Caching
Queue (Resque/Sidekiq)
Index (Solr/Elasticsearch)
Datenbank (PostgreSQL, MongoDB)
Logging (Logstash, Log4J)
Monitoring (Munin, Nagios)
Prozesssteuerung (Monit, Supervisor)
DAS PROBLEM
Grosse Anzahl an Diensten die laufen müssen
Manche (fast alle) Dienste sind abhängig voneinander
Inkompabilität von development, staging, production
Inkompabilität von Servern (Snowflake)
Deployments dauern lange
Konfigurationsänderungen / Upgrades sind problematisch
INKOMPATIBILTÄT
Developer: "Es funktioniert auf meiner Kiste, blos nicht auf dem
Server."
Chef: "Ok, mach eine Kopie von deinen Emails, dein Laptop get
auf Produktion."
TEORIE
Die Applikation wird in ein Image verpakt.
Das erstellte Image kann transportiert und zum laufen
gebracht werden
Das Image funktioniert genauso auf meinem Laptop, auf
deinem Rechner, und auf dem Server.
Inkompabilität von development, staging, production?!
PRAXIS
Die notwendigen Services werden in Images verpakt.
Die erstellten Images können transportiert und zum laufen
gebracht werden
Ich starte auf meinem Laptop Services welche ich brauche.
Inkompabilität von development, staging, production !!!
Inkompabilität von Servern (Snowflake) !!!
Deployments dauern lange !!!
DAS PROBLEM
Grosse Anzahl an Diensten die laufen müssen
Manche (fast alle) Dienste sind abhängig voneinander
Konfigurationsänderungen / Upgrades sind problematisch
Notwendige Seperation (Elasticsearch / MongoDB)
Cluster
Auf jeder CoreOs Maschine ist Docker installiert
Die Container mit der Applikation und den Services werden
mit "Fleet" auf die jeweiligen Maschinen verteilt und gesteuert
Die Container kommunizieren miteinander durch "etcd", ein
High Available Key Value Store
ETCD
Auf jedem CoreOS Host verfügbar
Verteilte Konfiguration
Service Discovery
curl -L http://127.0.0.1:4001/v2/keys/foo -XPUT -d value="bar"
curl -L http://127.0.0.1:4001/v2/keys/foo
FLEET
Ein Distributed Init System
Systemd für Cluster anstatt einer Maschine
Benutzt Unit Dateien
fleetctl start examples/apache.service
Unit apache.service launched on 113f16a7.../172.17.8.103
UNIT DATEIEN
Definieren was ich will, und wie es Fleet machen soll
[Unit]
Description=My Apache Frontend
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill apache1
ExecStartPre=-/usr/bin/docker rm apache1
ExecStartPre=/usr/bin/docker pull coreos/apache
ExecStart=/usr/bin/docker run -rm --name apache1 -p 80:80 coreos/apache /usr/sbin/apache2
ExecStop=/usr/bin/docker stop apache1
[X-Fleet]
X-Conflicts=apache.*.service
DOCKER AMBASSADOR PATTERN / SIDEKICK
[Unit]
Description=Announce Apache1
BindsTo=apache.1.service
[Service]
ExecStart=/bin/sh -c "while true; do etcdctl set /services/website/apache1 '{ \"host\": \
ExecStop=/usr/bin/etcdctl rm /services/website/apache1
[X-Fleet]
X-ConditionMachineOf=apache.1.service
Konfigurationsänderungen / Upgrades sind problematisch !!!
DEPLOYMENT MÖGLIGKEITEN
Deployment einer Applikation / Service auf eine Maschine
anhand Metadaten
Deployment einer Applikation / Service global auf den ganzen
Cluster
Deployment einer Applikation / Service irgendwo auf den
Cluster
Skalierung anhand der Resourcen
ROLLING DEPLOYMENT / ZERO DOWNTIME
Nicht destruktive Datenbank-Migrationen durchführen
Assets zür Verfügung stellen
Das neue Docker Image aus dem Registry ziehen
Einen Appserver Container aus dem Loadbalancer
rausnehmen (etcd)
Einen Container aus dem neuen Image starten
Nach dem start von dem Container, diesen wieder im
Loadbalancer einbringen (etcd)
Den alten Container beenden
Wiederholen, bis alle Nodes hinter dem Loadbalancer
aktualisiert wurden
GEIGNET FÜR PRODUKTION ?
WIRKLICH GEIGNET FÜR PRODUKTION ?
CANARY RELEASE
DANKE!
Document
Kategorie
Technik
Seitenansichten
102
Dateigröße
3 053 KB
Tags
1/--Seiten
melden