Bei Aktualisieren von Containern via Trigger (vgl. Docker/Tutum-Container aktuell halten) kommt es öfters vor, dass die Trigger sehr häufig hintereinander gefeuert werden. Oft mehrere weitere Trigger während die Aktualisierung des letzten noch läuft… Das ist aus zwei Gründen ungünstig:
- Tutum „verschluckt“ sich dabei ab und zu (oder ist es Docker?) und es entstehen Fehler, die z.B. beim manuellen Neustart (des ganzen Stack) „wundersam“ wieder verschwinden.
- In HA-Umgebungen will man nicht, dass alle Worker-Nodes gleichzeitig neu gestartet werden. Im Gegenteil: Optimal wäre es, wenn immer nur einer neu startet. Erst, wenn dieser wieder Requests bearbeiten kann, dann soll der nächste mit Neustart beginnen.
sequredeploy
Da ich in der Docker-Tutum-Umgebung keine andere Lösung gefunden habe, habe ich (mit Hilfe von Go) ein kleines Tool „seqredeploy“ (https://github.com/dsteinkopf/seqredeploy) geschrieben, welches beide Probleme löst:
- Es stellt einen Web-Server bereit, der als Webhook für Redeploys in andere Services eingetragen werden kann:
- z.B. http://myserver:8080/redeploy/?service=mytutumservice&haproxy=myhaproxy&secret=secret_abc123
- Dies triggert den Redeploy des mytutumservice, den unter dem myhaproxy läuft.
- Es wird die Umgebungsvariable HTTP_CHECK der zu redeployenden Container ausgelesen (=die, die auch tutum/haproxy benutzt) und verwendet, um zu prüfen, ob nach einem Container-Redeploy der Service wieder arbeitet.
- Während ein Redeploy läuft wird maximal ein weiterer Redeploy-Request vorgemerkt – alle weiteren werden ignoriert. Der vorgemerkte Request wird ausgeführt, sobald der laufende fertig ist.
Howto
Um das Ding in Betrieb zu nehmen:
- Service mit Image dsteinkopf/seqredeploy (https://hub.docker.com/r/dsteinkopf/seqredeploy/)
- Tutum-Auth erlauben: Bei „Environment“: „Api Roles“: „Full Access“. Damit der Container auf die Tutum-API zugreifen darf.
- Environment: SEQREDEPLOY_SECRET setzen. Dies sollte nicht zu kurz und einfach sein, weil es die einzige Zugriffsbeschränkung ist.
- ggf. Firewall entsprechend öffnen, sodass Requests an diesen Port „durchkommen“.
- ggf Monitoring einrichten: http://myserver:8080/redeploy/health/?secret=secret_abc123 – Prüft, ob Server läuft und Tutum-Verbindung klappt.
- Zu redeploender Container muss eine health-Check-Umgebungsvariable haben: HTTP_CHECK. Syntax wie von tutum/haproxy definiert (s. dort). Momentan werden nur GET-Checks unterstützt.
- Fertig: Trigger benutzen (URL: s.o.)