• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    ALMADDocker a kontejnery
    ADMIX
    ADMIX --- ---
    DOKIS: ono lightsail v tom bude nejspis mit nejakej balancer, kterej vyrazne srazi cenu outbound trafficu, ne? zaklad cloudu je mit cisla o svym deploymentu, a pak se kouknout kde chci veci behat, jak kriticky jsou a tak - treba co se tyce trafficu, tak servirovat outbound do internetu z EC2 je pravdepodobne nejdrazsi cesta jak to delat :D
    DOKIS
    DOKIS --- ---
    QUICK: Pokud nepotrebujes primo EC2, tak AWS LightSail ma 3TB transfer zahrnuty uz v $10/mesic planu. Ale tam je zase otazka, jestli ti staci jeden virtualni procesor, 2GB RAM a 60 GB SSD, ktere ten konkretni plan nabizi. Co jsem to kdysi pocital, tak LightSail vychazel podobne jako EC2, jen s vyrazne vetsim objemem dat v cene. Jen tam mas o hodne mensi moznosti konfigurace oproti "plnemu" EC2...
    QUOING
    QUOING --- ---
    QUICK: ja treba resim dynamicky routovani v nginxu (tedy s forkem openresty) + redis

    Zalozeno na:
    OpenResty - Dynamic Routing Based On Redis
    https://openresty.org/en/dynamic-routing-based-on-redis.html

    Pres redis-cli pak proste prepises klic v DB a routuje se tam kam potrebujes..
    KING
    KING --- ---
    QUICK: preklep, melo to byt git pull, pardon. Uz jsem v hlave premyslel nad tou druhou casti :)

    dynamicky udpdate resit nginx plus (komercni), ale v tomhle pripade bych se nebal ansiblem pregenerovat konfiigurak a dat reload, nginx to provede bezvypadkove a tak jako tak chces mit ten konfigurak spravovany ansiblem
    QUICK
    QUICK --- ---
    KING: mate mě, že píšeš, že to používáš bez dockeru a první příkaz máš docker pull. Můžeš to rozvést?

    Moc díky za doporučení. Ohledně toho přepnutí nginxu aby ukazoval na nový docker, jde to vyřešit nějak jednoduše, abych nemusel lézt do konfigurace nginxu, změnit tam adresu a restartovat ho?
    KING
    KING --- ---
    QUICK: Ja mam stejny setup (Django, Postgres a Elastic) a pouzivam to bez dockeru protoze mi to prislo jednodussi, jak to delam ja:
    * docker pull
    * pip install -r requirements.txt
    * migrate/collectstatic/...
    * restart gunicorn

    Postgres i Elastic (take jeden node, kdyz neni potreba vic, tak je za nej zbytecne platit, nikoho zabijet nebudu :) ) mam na cloudu protoze to nechci resit (RDS a Elastic Cloud). Celkovy naklady na provoz jsou hluboko pod $100 mesicne na AWS (t4g.micro, t2.micro RDS a 1 node na elastic cloudu, mame ale zatim maly traffic).

    Pokud uz to mas dockerizovany tak bych doporucil:
    * nahrat novou image s novou verzi aplikace
    * pustit docker
    * idealne pustit nejaky smoke test
    * prepnout nginx aby ukazoval na novy docker
    * zabit stary docker

    Budes to mit uplne bezvypadkove pokud ti to logika dovoli - nekde budes muset prizpusobit jak delas napriklad migrace aby sli delat tak, ze stara verze bude moct stale mluvit s novou DB.
    QUICK
    QUICK --- ---
    KING: FALLENANGEL: Rád bych to rozebral konkrétněji. Provozuju střední web, historicky to běží na třech VPS instancích - jedna pro web (Django), jedna pro Postgres, třetí Elasticsearch (KINGu ty mě asi nakope za provoz elasticu na jednom nodu, ale pro ty objemy vyhledávání co mám je to zatím v poho)

    Všechno teď mám nainstalované přímo v systému bez dockeru. Nasazení nové verze jsou v zásadě tři příkazy:
    - git pull
    - případná aktualizace db přes python manage.py migrate
    - restart gunicornu

    Což je pro mě docela jednoduchý na nasazení nové verze aplikace, a když se všechno povede, tak návštěvníci výpadek nezaznamenají. Ale uvědomuji si, že to není správný řešení. Nedá se spolehnout, že na devu a produkci se používají stejné verze všech balíků a knihoven. Updatu systému (apt get) / restart mašiny není bezvýpadkový a je potřeba se předtím pokřižovat, aby se nic nevysypalo. atp.

    Lokální vývojové prostředí už do mám dockerizované, ale pořád se odhodlávám, jak to úspěšně převést na produkci. CI, Kubernetes a většina devops věci jde tak nějak mimo mě. Dokázali byste mě navést jaký zvolit postup?

    Hlavně bych chtěl aby výsledný řešení bylo tak akorát robustní, nasazení bylo rychlý, předcházelo se výpadkům při nasazení a případný rollback, šel udělat rychle. V úplně nejdivočejších snech bych v budoucnu chtěl ještě spustit jeden extra cluster v Americe (django, postgres jako slave), aby dokázal pokrýt read-only requesty z Ameriky.

    A AWS/Google cloud jsem nikdy nepoužíval, ale asi při mém trafficu (2-3 TB měsíční outbound) by to asi lezlo do peněz.
    KING
    KING --- ---
    FALLENANGEL: Ja bych to asi resil jednoduchym ansible playbookem, prijde mi to o rad jednodussi nez nejake platformy. Ty bych mel v zaloze az by moje aplikace prerostla stav "v nekolika kontejnerech."
    FALLENANGEL
    FALLENANGEL --- ---
    QUICK: Dobra otazka. Predpokladam, ze existuji i jine orchestracni platformy nez Kubernetes, ale vsechno co me ted napada jsou vlastne platformy postaveny prave na Kubernetesu (Rancher, Tanzu, GKE).

    KING: Myslel jsem to tak, ze jedna aplikace ma vice komponent, kazdou v jinym kontejneru. Takze spis jde o to spustit kontejnery s novou verzi, presmerovat na ne ingress a smazat stare kontejner.
    KING
    KING --- ---
    QUICK: samozrejme, stejne jako slo resit zero downtime deployment bez kontejneru. Typicky proste staci neshodit vsechny kontejnery najednou, ale jeden po druhym a nahradit je novym. Pokud je tam zabudovana redundance, tak to staci. Konkretni provedeni zalezi na zpusobu orchestrace
    QUICK
    QUICK --- ---
    FALLENANGEL: pokud mám "appku v pár kontejnerech", jde řešit zero downtime deployment bez Kubernetes?
    FALLENANGEL
    FALLENANGEL --- ---
    JON: :P 'jako jo, no...'
    FALLENANGEL
    FALLENANGEL --- ---
    REFLEX: Jako jo, Kubernetes zvlada orchestrovat opravdu velky prostredi, takze pokud mas jednu malou appku v par kontejnerech, je to trochu overkill. Na druhou stranu kdyz tomu venujes cas a naucis se to, tak s nim muzes delat opravdu zajimavy veci. Nemluve o tom, o kolik stoupne tvoje cena na trhu prace ;)

    Jenom si ted nejsem jistej, jestli porad podporujou Docker jako container runtime.
    JON
    JON --- ---
    REFLEX: jako jo, a ne - kdyz chces jen pustit par apek v kontejnerech je to nesmysl.
    Ale jakmile nad tim chces nejake blue-green, canary deploymenty, nebo rolling update / zero downtime, pripadne testy celeho deploymentu usetri to fakt hrozne moc prcani.
    Proste to tam uz je vymysleny a udelany, a kdyz to budes chtit zorchestrovat nejak jinak, tak to budes muset napsat nejak sam.
    REFLEX
    REFLEX --- ---
    FALLENANGEL: ale kubernetes zas je takovej kanon na vrabce :)
    FALLENANGEL
    FALLENANGEL --- ---
    REFLEX: Asi jdu s krizkem po funuse, ale tohle velmi dobre zvlada Kubernetes, jak psal MUXX.

    Deployments | Kubernetes
    https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

    Pokud by te zajimaly blue/green nebo canary deploymenty, tak si mysli, ze bys potreboval ke Kubernetu nasadit Istio, ktery to zvlada velmi dobre.
    JON
    JON --- ---
    A este jeden dotaz - na fyzickem stroji si spoustim LXD container, uvnitr nainstaluju docker, v docker neco spustim - potud krasa nadhere, presne to co jsem hledal. ALE:
    Pokud je LXD container ubuntu/18.04, ubuntu/20.10 nebo debian/9 (z ofiko image repa) tak to bezi OK.
    Kdyz je ale LXD container debian/10, tak sam se na internet dostane, uvnitr nej bezici docker kontejnery se ale na internet dostanou jen kdyz jsou privileged. Hazi to (pro me) dost nezvyklou hlasku:

    root@test-lxc-d10:~# docker run --rm busybox ping -c 4 8.8.8.8
    ping: can't create raw socket: Permission denied
    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    


    K internetu se nedostane ani ping, ani wget, ani nic jinyho (jako ze to neni problem s pingem).
    Nenapada vas, cim to muze bejt?
    Pripadne jak nejak low-level debugovat networking?
    JON
    JON --- ---
    Nevite o nejakem lightweight nastroji, ktery by mi usnadnil startovani N LXC kpntejneru a nejaky sitovani kolem toho? Neco jako docker-compose.
    Vsechno co jsem nasel je bud kanon na vrabce, nebo dyl jak rok neudrzovany.
    MUXX
    MUXX --- ---
    REFLEX: Docker-compose umi scale ne? Zvednes na dva, pockas, snizis na jeden. Samozrejme kubernetes ti to udela samo, ale to nechces pro jeden docker-compose
    DWICH
    DWICH --- ---
    REFLEX: Záleží, kde to provozuješ a jak moc ten systém řídí raketoplány nebo ne :)

    Je třeba dobrý mít možnost se okamžitě vrátit zpátky. Nebo když si to představíš jako šavli na mixáku, kde necháš hrát tu původní písničku a trochu už tu novou. Když se ti to začne srát, tak šavli stáhneš zpátky. Např. tím, že sleduješ nějaký error rate, kterej je běžně třeba ve tvym případě 2 %, dáš split traffic na pár procent a novej release hlásí 5 % error rate, tak to stáhneš. To stejný můžeš sledovat i se zátěží. Novější release nemá vyšší chybovost, ale z nějakýho důvodu ti ta nová super featura zatěžuje systémy násobně, než jsi očekával.

    Různý prostředí pro provoz kontejnerů na to mají různý metodiky a nástroje, ale nejdřív si rozmysli, jak moc sofistikovaný to _ne_potřebuješ :)

    blue green deployment - Google Search
    https://www.google.com/search?q=blue+green+deployment&hl=en
    canary deployment - Google Search
    https://www.google.com/search?q=canary+deployment&hl=en
    zero downtime deployment - Google Search
    https://www.google.com/search?q=zero+downtime+deployment&hl=en
    Kliknutím sem můžete změnit nastavení reklam