Jak jsme postavili clusterové řešení pro desítky malých Django/Python aplikací.
Dlouho jsme řešili otázku, jak hostovat naše projekty v Pythonu/Djangu, tak aby to bylo snadné na údržbu, bezpečné a samozřejmě hlavně stabilní. Začínali jsme s klasickou VPS, na které byly nainstalované všechny závislosti, databáze, webserver a prostě vše, co aplikace potřebuje pro svůj běh. Jak projekty přibývaly, tak jsme VPS vertikálně škálovaly. Postupem času jsme zjistili, že jedno VPS je nedostatečné a tak jsme přidali další dvě instance (testovací prostředí a produkční prostředí). Nové VPSky se již instalovali pomocí ansible skriptů, které měly zajistit naprosto stejné testovací prostředí jako produkční. Kromě našich vlastních VPS jsme měli pod správou i několik další VPS klientů, na kterých běžely naše aplikace a které byly s různými OS (Ubuntu, Debian, Centos) a různého stáří. To vše dohromady způsobovalo velkou nekonzistentnost v jednotlivých řešení a náročnost při správě a údržbě.
Problémy VPS hostingů:
- Různé verze OS mají různé verze balíčků v repozitářích. Automatické skripty nemusí fungovat všude stejně správně ( částečně tento problém řeší ansible, ale ne 100%).
- Použití různých serverových aplikací (Apache, Nginx, MySQL, Postgres) vyžaduje různé konfigurace, backup skripty apod.
- VPS má omezenou storage. Sice můžete přidávat nebo rozšiřovat disky, ale vždy je to dost manuální práce, kterou nechcete dělat.
- Výpadek serveru způsobí výpadek všech projektů na daném serveru.
- Bojíte se aktualizovat VPS, aby se něco nepokazilo a upgrade na vyšší verzi je noční můra.
- VPS můžete škálovat jen vertikálně. Přifávání dalších VPS přináší starosti o další systémy.
- Na různé VPS u nás probíhal deploy různě (poloautomaticky pomocí fabfile, ansible).
- Každý projekt sebou přináší další a další závislosti, které je nutné instalovat na server a které ve finále spolu můžou i konfliktit.
Výše uvedené problémy nás dovedly ke změně hostingu na jedno univerzální, škálovatelné, dlouhodobě udržitelné a stabilní řešení v podobě Docker Swarm clusteru.
Aktuální konfigurace našeho clusterové řešení
Pro hosting stále využíváme VPS servery (4) nad kterými je postavený Docker Swarm, který všechny VPS obaluje do jednoho clusteru, ve kterém mohou jednotlivé aplikace běžet na libovolných VPS bez omezení. Kvůli tomu, že aplikace mohou migrovat mezi VPSkama, tak je nutné přejít na "bez stavové" aplikace (všechna persistentní data musí být uložena mimo aplikaci/VPS). Kvůli tomuto požadavku a zároveň kvůli snadnější správě jsme přešli na co nejvíce managed služeb (PostgreSQL, MySQL, Redis, storage S3, Sendgrid SMTP).
Vstupní branou do clusteru je Traefik (webserver), který ví o všech aplikacích v rámci clusteru a který funguje jako reverse proxy pro aplikační servery. Na jednotlivých nodech pak běží Docker kontejnery a v nich aplikace (aplikační server gunicorn, Django).
Traefik mimo jiné řeší:
- routování HTTP requestů v rámci clusteru
- SSL certifikace
- redirecty
- HTTP hlavičky
Traefik se dozví o aplikaci pomocí labels, které jsou součástí deployment configu pro Docker Swarm v rámci každé aplikace. Výhodou je, že tyto konfigurační soubory leží u zdrojového kódu aplikace a vy tak máte vše týkající se aplikace na jednom místě.
labels:
- traefik.http.routers.vistacredit-web-develop-http.entrypoints=http
- traefik.http.services.vistacredit-web-develop.loadbalancer.server.port=80
- traefik.http.routers.vistacredit-web-develop-http.middlewares=non-www-redirect-secure
- traefik.http.routers.vistacredit-web-develop-https.middlewares=non-www-redirect-secure
- traefik.http.routers.vistacredit-web-develop-https.entrypoints=https
- traefik.http.routers.vistacredit-web-develop-https.tls=true
- traefik.http.routers.vistacredit-web-develop-https.tls.certresolver=le
- traefik.http.routers.vistacredit-web-develop-http.rule=Host(`vista.doc.endevel.cz`)
- traefik.http.routers.vistacredit-web-develop-https.rule=Host(`vista.doc.endevel.cz`)
Výhody současného řešení:
- Snadné horizontální škálování přidáním nového Node a zavoláním jediného příkazu (docker swarm init).
- Při výpadku jednoho VPS (node) automatický přesun kontejnerů na jiný node.
- Neomezená storage (díky využití S3)
- Managed DB (opravdu se o ty DB starat nechcete i když si myslíte, že se o to starat není potřeba).
- Automatický deploy pomocí GitLab Pipelines.
- Dockerizované prostředí pro aplikace.
- Naprosto stejné testovací prostředí jako produkční.
- Snadné přidání dalších prostředí (stage, dev) pouze přidáním deployment configu.
- Snadné aktualizace a upgrade jednotlivých VPS.
- On-demand testovací aplikace (aplikace se spustí pouze na vyžadání - při requestu).