Docker Swarm pe trei continente: disponibilitate ridicată, proiectată pentru un uptime de 100%

Publicat pe 20 min de citit

Un centru de date este un punct unic de defecțiune. Acest articol construiește un Docker Swarm pe trei continente în care o locație întreagă poate cădea: cvorum de manageri, WireGuard, punct de intrare pe regiune, failover Geo-DNS, replicarea bazei de date și operare.

Un server într-un centru de date este un punct unic de defecțiune, oricât de bune ar fi hardware-ul și rețeaua. Dacă locația cade, de exemplu din cauza unei avarii la alimentarea cu energie sau la rețea ori pur și simplu a unei erori în timpul unei lucrări de întreținere, aplicația nu mai este disponibilă. Docker Swarm în mai multe centre de date rezolvă exact această problemă: containerele rulează în trei locații independente, ideal pe trei continente, iar dacă una dintre ele cade complet, celelalte două preiau sarcina fără ca utilizatorii să observe ceva.

Acest articol arată pas cu pas cum construiți un cluster Docker Swarm proiectat pentru un uptime de 100%: câte un server în America de Nord, Europa și Asia, o rețea WireGuard criptată între noduri, un cvorum de manageri care supraviețuiește căderii unui continent întreg, un punct de intrare pentru fiecare regiune și un failover DNS care îi direcționează automat pe utilizatori către cea mai apropiată locație funcțională. Totodată explicăm sincer ce mai poate cădea chiar și cu această arhitectură și cum contracarați și aceste riscuri.

Se poate obține un uptime de 100% cu Docker Swarm?

Un Docker Swarm pe trei continente este proiectat pentru un uptime de 100%: niciun server, niciun centru de date și niciun continent nu poate opri singur aplicația. Totuși, nimeni nu poate garanta o disponibilitate absolută, nici măcar marii furnizori de cloud, ale căror angajamente maxime se situează între 99,99 și 99,999%. Cauza nu sunt centrele de date, ci lucrurile pe care toate locațiile le au în comun. Tocmai pe acestea le tratează și acest articol, ca să vă apropiați de 100% cât de mult este tehnic posibil.

Ce înseamnă disponibilitatea în cifre

DisponibilitateTimp de nefuncționare pe anTimp de nefuncționare pe lună
99%87,6 ore7,3 ore
99,9%8,76 ore43,8 minute
99,99%52,6 minute4,4 minute
99,999%5,3 minute26 de secunde

Calculul pornește de la 8.760 de ore pe an și 730 de ore pe lună. Fiecare 9 în plus reduce la o zecime timpul de nefuncționare permis, iar exact aici începe munca pe care un singur server nu o mai poate face.

De ce contează atât de mult trei continente

Trei locații independente una de alta, fiecare cu o disponibilitate de 99,9%, cad toate deodată, matematic vorbind, numai dacă toate trei au o problemă în același moment: 0,1% ori 0,1% ori 0,1% înseamnă 0,0000001%. Cu cât locațiile sunt mai îndepărtate una de alta, cu atât sunt mai independente în realitate: rețele electrice proprii, conexiuni de rețea proprii, condiții meteo proprii, ferestre de întreținere proprii. De aceea, distribuirea pe America de Nord, Europa și Asia este cea mai puternică formă de toleranță la defecțiuni care se poate construi cu servere.

Ce poate cădea chiar și cu trei continente

Riscurile rămase sunt dependențele comune ale tuturor locațiilor, iar pentru fiecare există o contramăsură:

  • O actualizare defectă ajunge prin cluster în toate locațiile la fel de sigur ca una bună. Contramăsură: health check-uri și rollback automat, plus actualizări regiune cu regiune.
  • DNS-ul este singurul punct prin care trec toți utilizatorii. Contramăsură: un furnizor DNS cu rețea distribuită la nivel mondial și failover, TTL scurt.
  • Baza de date trebuie să aibă aceleași date în toate locațiile. Contramăsură: replicare cu comutare automată, vedeți secțiunea despre date.
  • Certificatele și domeniile expirate afectează toate locațiile în același timp. Contramăsură: reînnoire automată și monitorizarea datelor de expirare.
  • Comutarea în sine durează până când health check-urile și DNS-ul reacționează, de obicei un minut sau două, timp în care unele cereri pot eșua. Contramăsură: intervale scurte de verificare, TTL scurt și clienți care repetă cererile eșuate.

Privire de ansamblu asupra arhitecturii

Un Docker Swarm pe mai multe continente este format din șase componente. Fiecare dintre ele elimină un anumit punct de defecțiune:

ComponentăRolCe cădere acoperă
Trei noduri manager pe trei continenteMențin starea clusterului prin consens RaftCăderea unei locații sau a unui continent întreg
Capacitate worker în fiecare regiuneRulează containerele aproape de utilizatoriCăderea unor servere individuale
Rețea WireGuard între toate nodurileCriptează tot traficul clusterului prin internetInterceptarea și manipularea datelor între centrele de date
Punct de intrare (reverse proxy) pentru fiecare regiunePreia cererile utilizatorilor și le răspunde localCăderea punctului de intrare al unei regiuni
Geo-DNS cu health check-uriTrimite utilizatorii la cea mai apropiată locație funcționalăLocații inaccesibile
Stocare replicată a datelor și backupuriPăstrează bazele de date și fișierele în mai multe locuriPierderea datelor la căderea unei locații

Câți manageri și unde?

Nodurile manager ale unui Swarm administrează starea clusterului cu ajutorul algoritmului de consens Raft. Fiecare modificare are nevoie de acordul majorității managerilor, așa-numitul cvorum. Dacă majoritatea se pierde, containerele existente continuă să ruleze, dar clusterul nu mai poate nici să replanifice, nici să compenseze căderile, nici să distribuie actualizări.

ManageriMajoritateCăderi suportate
321
532
743

Docker recomandă un număr impar de manageri și distribuirea lor în cel puțin trei zone: la trei manageri în raport de 1-1-1, la cinci în raport de 2-2-1. De aici rezultă cea mai importantă regulă a acestui articol: două locații nu sunt suficiente. Cu două locații, într-una dintre ele se află inevitabil mai mulți manageri, iar dacă tocmai aceasta cade, majoritatea se pierde. Abia cu trei locații cvorumul supraviețuiește căderii oricărui centru de date, deci, la trei continente, căderii unui continent întreg.

Trei continente sau un singur continent: compromisul

Fiecare modificare a clusterului, fiecare implementare și fiecare replanificare a unui container așteaptă confirmarea majorității managerilor. Între Europa, America de Nord și Asia, fiecare astfel de confirmare costă o latență de aproximativ 80 până la 250 de milisecunde. Pentru utilizatori acest lucru nu contează, deoarece cererile lor primesc răspuns local; implementările și replanificările durează însă simțitor mai mult decât într-un cluster cu distanțe scurte.

VariantăPuncte fortePrețul plătit
Trei continente (SUA, Europa, Asia)Independență maximă, utilizatori din toată lumea aproape de server, un continent întreg poate cădeaAdministrare mai lentă a clusterului, replicarea bazei de date pe distanțe lungi, cererile trebuie să rămână locale
Trei locații pe un singur continent (de exemplu Frankfurt, Strasbourg, Varșovia)Administrare rapidă a clusterului, replicare sincronă simplăUn eveniment de amploare pe continent afectează toate locațiile, utilizatorii aflați mai departe au drumuri mai lungi

Pentru aplicațiile cu utilizatori pe mai multe continente și cu obiectivul unei disponibilități cât mai ridicate, varianta cu trei continente este cea potrivită, iar pe aceasta o construim în ghid. Importantă este aici o regulă care se regăsește în toți pașii: fiecare cerere primește răspuns în regiunea ei și nu face niciodată naveta între continente.

Ce locații KernelHost sunt potrivite

KernelHost operează servere în centrul de date maincubes din Frankfurt am Main și oferă servere virtuale în alte locații din Europa, America de Nord și Asia-Pacific, printre care trei locații în SUA, precum și Canada, Londra, Strasbourg, Varșovia, Helsinki, Singapore, Japonia, Sydney și Mumbai. Lista completă, cu hartă, se află pe pagina Locații servere. Pentru exemplul din acest articol folosim Frankfurt am Main pentru Europa, Coasta de Est a SUA pentru America de Nord și Singapore pentru Asia.

Ghid: construirea unui Docker Swarm pe trei continente

Exemplul folosește trei servere: swarm-eu în Frankfurt am Main, swarm-us pe Coasta de Est a SUA și swarm-asia în Singapore. Adresele publice provin din rețeaua de documentare 203.0.113.0/24, iar rețeaua WireGuard folosește 10.10.0.0/24. Înlocuiți-le pe amândouă cu valorile dumneavoastră. Toate cele trei noduri îndeplinesc simultan rolul de manager și de worker; pentru mai multă performanță, adăugați ulterior în fiecare regiune noduri exclusiv worker.

Pasul 1: provizionați servere pe trei continente

Comandați trei servere cu Debian 12 sau 13 în trei regiuni și aplicați securizarea de bază: SSH doar cu cheie, actualizări de securitate automate, utilizatori proprii. Lista de verificare pentru servere root noi acoperă toate acestea. Alegeți nume de gazdă sugestive, ca să vedeți imediat în docker node ls care nod unde se află.

hostnamectl set-hostname swarm-eu

Pasul 2: instalați Docker pe toate nodurile

Instalați Docker Engine din depozitul oficial Docker pe toate cele trei servere, așa cum este descris în articolul Instalarea Docker pe Debian și Ubuntu. Verificați apoi versiunea pe fiecare nod; toate trei ar trebui să aibă aceeași versiune majoră:

docker version --format '{{.Server.Version}}'

Pasul 3: construiți o rețea WireGuard între continente

Nodurile comunică între ele prin internetul public. Pentru ca tot traficul clusterului să fie criptat, iar porturile Swarm să nu fie niciodată accesibile public, cele trei servere sunt conectate printr-o rețea WireGuard. Pe fiecare nod generați mai întâi o pereche de chei:

apt-get install -y wireguard
umask 077
wg genkey | tee /etc/wireguard/private.key | wg pubkey > /etc/wireguard/public.key

Apoi fiecare nod primește un fișier /etc/wireguard/wg0.conf. Pe swarm-eu arată astfel, iar pe celelalte două noduri este construit în oglindă:

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = CHEIA_PRIVATA_SWARM_EU
MTU = 1420

[Peer]
PublicKey = CHEIA_PUBLICA_SWARM_US
Endpoint = 203.0.113.12:51820
AllowedIPs = 10.10.0.2/32
PersistentKeepalive = 25

[Peer]
PublicKey = CHEIA_PUBLICA_SWARM_ASIA
Endpoint = 203.0.113.13:51820
AllowedIPs = 10.10.0.3/32
PersistentKeepalive = 25
systemctl enable --now wg-quick@wg0
ping -c 3 10.10.0.2

Dacă toate nodurile răspund pe adresele lor 10.10.0.x, rețeaua este gata. PersistentKeepalive menține conexiunea deschisă și în spatele firewallurilor stateful. Latențele pe care ping le afișează acum între continente sunt exact timpii de așteptare pe care îi costă fiecare modificare a clusterului.

Pasul 4: firewallul lasă să intre doar nodurile Swarm

Între noduri, Docker Swarm are nevoie de portul 2377/TCP pentru administrarea clusterului, de 7946/TCP și UDP pentru comunicarea dintre noduri și de 4789/UDP pentru rețeaua overlay. Permiteți aceste porturi exclusiv pe interfața WireGuard; public rămâne deschis doar WireGuard însuși, și numai pentru celelalte noduri. Cu ufw, pe swarm-eu arată astfel:

ufw allow from 203.0.113.12 to any port 51820 proto udp
ufw allow from 203.0.113.13 to any port 51820 proto udp
ufw allow in on wg0 to any port 2377 proto tcp
ufw allow in on wg0 to any port 7946
ufw allow in on wg0 to any port 4789 proto udp

Important: porturile pe care Docker le publică pentru containere ocolesc ufw, deoarece Docker își setează propriile reguli iptables. De aceea, publicați doar porturile punctului de intrare (80 și 443) și niciodată porturi de baze de date sau de administrare.

Pasul 5: inițializați clusterul Swarm și adăugați managerii

Pe swarm-eu inițializați clusterul Swarm și vă asigurați că administrarea și traficul de date trec prin WireGuard:

docker swarm init --advertise-addr 10.10.0.1 --data-path-addr 10.10.0.1
docker swarm join-token manager

A doua comandă afișează comanda de aderare pentru alți manageri. Pe swarm-us și swarm-asia o rulați cu adresa WireGuard proprie fiecăruia, aici pentru swarm-us:

docker swarm join --token SWMTKN-1-... --advertise-addr 10.10.0.2 --data-path-addr 10.10.0.2 10.10.0.1:2377
docker node ls

docker node ls afișează apoi trei noduri, unul cu starea Leader, celelalte două cu Reachable. Tokenul de aderare este un secret: oricine îl cunoaște poate strecura un manager propriu în clusterul dumneavoastră. După configurare, înnoiți-l cu docker swarm join-token --rotate manager.

Pasul 6: activați Autolock

Managerii stochează starea clusterului, împreună cu cheile cu care sunt criptate jurnalele Raft, în /var/lib/docker/swarm/. Cu Autolock, chiar aceste chei sunt criptate, iar un manager repornit revine în cluster abia după introducerea unei chei de deblocare:

docker swarm update --autolock=true
docker swarm unlock

Prima comandă afișează cheia de deblocare, pe care o păstrați într-un manager de parole. Pe a doua o folosiți după fiecare repornire a unui manager. Fără această cheie, clusterul Swarm nu poate fi restaurat nici dintr-un backup, de aceea păstrați-o separat de servere.

Pasul 7: etichetați nodurile după regiune

Etichetele îi spun planificatorului unde se află un nod. Pe ele se bazează regulile de plasare din pașii următori:

docker node update --label-add region=eu swarm-eu
docker node update --label-add region=us swarm-us
docker node update --label-add region=asia swarm-asia

Pasul 8: creați o rețea overlay cu MTU potrivit

Containerele din locații diferite comunică între ele printr-o rețea overlay. Deoarece aceasta trece prin tunelul WireGuard, MTU-ul ei trebuie să fie mai mic: WireGuard lucrează cu 1420 de octeți, rețeaua overlay (VXLAN) are nevoie de 50 de octeți din aceștia pentru propriile antete, deci rămân 1370 de octeți:

docker network create --driver overlay --attachable --opt com.docker.network.driver.mtu=1370 appnet

Un MTU prea mare se manifestă perfid: cererile mici funcționează, răspunsurile mari se blochează. Cine renunță la WireGuard poate cripta în schimb rețeaua overlay cu --opt encrypted; în acest caz, între noduri trebuie permis suplimentar protocolul IP 50 (ESP), iar Docker avertizează explicit asupra unor pierderi de performanță simțitoare. Recomandăm WireGuard, deoarece acoperă tot traficul, inclusiv administrarea.

Pasul 9: rulați aplicația în fiecare regiune

Un serviciu Swarm obișnuit distribuie cererile, prin adresa serviciului, către toate replicile din cluster, deci și către celelalte continente. Cu trei continente, una din două sau din trei cereri ar traversa astfel jumătate de glob. De aceea, fiecare regiune primește un serviciu propriu, care rămâne în regiunea sa printr-o regulă de plasare. Setările de actualizare asigură că versiunile noi sunt lansate container cu container și retrase automat în caz de eroare:

for r in eu us asia; do
  docker service create --name web-$r --replicas 2 --network appnet \
    --constraint node.labels.region==$r \
    --update-parallelism 1 --update-delay 30s \
    --update-failure-action rollback \
    registry.example.com/web:1.0
done

Pentru ca Swarm să recunoască dacă un container chiar funcționează, nu doar rulează, imaginea trebuie să conțină un health check, de exemplu această linie în Dockerfile-ul aplicației dumneavoastră:

HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD wget -qO- http://127.0.0.1:8080/health || exit 1

Un container al cărui health check eșuează de trei ori la rând este înlocuit, iar în timpul unei actualizări un health check eșuat oprește lansarea.

Pasul 10: un punct de intrare pentru fiecare regiune

Rolul de punct de intrare îl preia un reverse proxy precum Caddy, Traefik sau nginx. Și acesta rulează în fiecare regiune ca serviciu separat și redirecționează cererile doar către aplicația din regiunea sa. În modul host, publică porturile 80 și 443 direct pe serverul regiunii sale. O configurație comună este suficientă, deoarece Caddy citește destinația dintr-o variabilă de mediu:

example.com {
    reverse_proxy {$UPSTREAM}:80
}
docker config create caddyfile ./Caddyfile
for r in eu us asia; do
  docker service create --name edge-$r --network appnet \
    --constraint node.labels.region==$r \
    --env UPSTREAM=web-$r \
    --config source=caddyfile,target=/etc/caddy/Caddyfile \
    --publish mode=host,target=80,published=80 \
    --publish mode=host,target=443,published=443 \
    caddy:2
done

Toate regiunile au nevoie de un certificat TLS pentru același domeniu. De aceea, obțineți certificatele prin challenge-ul DNS, care funcționează indiferent de regiunea spre care indică în acel moment înregistrarea DNS; pentru aceasta, Caddy are nevoie de modulul furnizorului dumneavoastră de DNS. Noțiunile de bază despre proxy le găsiți în articolul Configurarea nginx ca reverse proxy.

Pasul 11: configurați Geo-DNS cu failover

Ultima componentă îi conduce pe utilizatori către regiunea potrivită. Un serviciu DNS cu rutare geografică și health check-uri trimite utilizatorii din Europa către Frankfurt am Main, pe cei din America către Coasta de Est a SUA și pe cei din Asia către Singapore. Dacă o regiune cade, health check-ul detectează acest lucru în 30 până la 60 de secunde și trimite utilizatorii ei către cea mai apropiată regiune funcțională. Setați durata de valabilitate (TTL) a înregistrărilor la 60 de secunde, pentru ca resolverele să preia rapid o modificare. Mai multe înregistrări A fără health check sunt doar o soluție de avarie: browserele încearcă adesea următoarea adresă, dar nu orice client face asta, iar o regiune căzută rămâne în răspuns.

Faceți un calcul onest: între cădere și comutare trec intervalul de verificare plus TTL-ul, în exemplu deci un minut sau două, timp în care o parte dintre utilizatorii regiunii afectate ajung încă la locația căzută. Aplicațiile, inclusiv cele mobile, care repetă cererile eșuate după o scurtă pauză fac ca acest interval să treacă aproape neobservat.

Pasul 12: testați căderea unei regiuni

Un failover care nu a fost exersat niciodată funcționează rareori atunci când contează. Simulați căderea unei regiuni scoțând nodul ei din funcțiune și urmăriți cum reacționează clusterul și DNS-ul:

docker node update --availability drain swarm-asia
docker node ls
docker service ls
docker node update --availability active swarm-asia

Deoarece serviciile regiunii sunt legate de nodul lor printr-o regulă de plasare, ele nu se mută, ci intră în pauză; utilizatorii regiunii sunt preluați de failoverul DNS. În acest test verificați deci în primul rând dacă health check-ul scoate regiunea din răspunsuri și dacă regiunea vecină face față sarcinii suplimentare. Pentru un test mai dur, deconectați complet nodul de la rețea, de exemplu oprind WireGuard. Repetați testul după modificări mai mari și cel puțin o dată pe trimestru.

Datele: partea cea mai dificilă a disponibilității ridicate

Docker Swarm replică containere, nu date. Un volum se află întotdeauna pe nodul pe care rulează containerul. De aceea, serviciile fără stare, precum interfețele web și API-urile, pot rula fără probleme în fiecare regiune, dar pentru tot ce conține date aveți nevoie de o replicare separată.

Replicarea bazelor de date între continente

Bazele de date au propria replicare, iar aceasta este întotdeauna preferabilă unei stocări partajate între centre de date. Între continente s-a dovedit eficientă o instanță primară într-o regiune, cu replici asincrone în celelalte două: la PostgreSQL, de exemplu, prin Streaming Replication, cu un instrument precum Patroni pentru comutarea automată, la MariaDB și MySQL prin replicarea integrată. Cererile de citire primesc atunci răspuns local în fiecare regiune, iar scrierile merg către instanța primară. Sincer vorbind, asincron înseamnă și următorul lucru: dacă regiunea primară cade, pot lipsi ultimele secunde de scrieri. Cine vrea să scrie la nivel mondial fără să piardă nimic alege baze de date construite pentru mai multe regiuni, precum CockroachDB sau YugabyteDB. Legați ferm nodurile bazei de date de regiunea lor printr-o regulă de plasare, pentru ca Swarm să nu le mute niciodată fără datele lor:

docker service create --name db-asia --constraint node.labels.region==asia ...

Fișiere și încărcări

Fișierele încărcate nu își au locul într-un volum local, ci într-o stocare de obiecte compatibilă S3, cu replicare într-o a doua regiune, sau într-un sistem de stocare propriu, replicat. Sistemele de fișiere în rețea, precum NFS, întinse peste continente sunt lente și reprezintă ele însele un punct unic de defecțiune.

Sesiuni și cache-uri

Dacă aplicația stochează sesiunile în memoria RAM a unui container, utilizatorii sunt deconectați la comutare. Stocați sesiunile într-o bază de date replicată sau într-un cache replicat precum Redis ori folosiți tokenuri semnate, pe care fiecare regiune le poate verifica singură.

Backupurile rămân obligatorii

Replicarea protejează împotriva căderii unei locații, dar nu și împotriva erorilor: o înregistrare ștearsă accidental este ștearsă câteva secunde mai târziu în toate regiunile. De aceea, orice arhitectură cu disponibilitate ridicată are nevoie de backupuri regulate și testate într-o locație independentă, așa cum este descris în articolul Strategia de backup pentru servere.

Operare: actualizări, întreținere și monitorizare

Actualizări regiune cu regiune

Nu lansați versiunile noi în toate regiunile deodată, ci pe rând, și urmăriți fiecare regiune un scurt timp înainte să treceți la următoarea. Astfel, o eroare pe care niciun health check nu o detectează ajunge în cel mult o regiune, iar celelalte două continuă să deservească utilizatorii acesteia:

for r in asia us eu; do
  docker service update --image registry.example.com/web:1.1 web-$r || break
  sleep 300
done

Dacă o actualizare eșuează, Swarm o anulează automat datorită setărilor din pasul 9, iar || break încheie bucla de îndată ce comanda raportează o eroare. O actualizare ale cărei probleme ies la iveală abia mai târziu o anulați manual cu docker service rollback web-asia.

Întreținerea unei regiuni

Dacă un server trebuie repornit sau actualizat, scoateți-l din funcțiune cu docker node update --availability drain și lăsați în prealabil failoverul DNS să îi redirecționeze utilizatorii către regiunile vecine. După întreținere, îl readuceți în funcțiune cu --availability active. Înainte de următorul manager, așteptați până când docker node ls îi afișează din nou pe toți trei ca accesibili, pentru ca niciodată să nu lipsească doi manageri în același timp.

Monitorizare din exterior

Monitorizați fiecare regiune separat și din afara clusterului: accesibilitatea punctelor de intrare, health check-urile serviciilor, starea managerilor, întârzierea replicării bazei de date și datele de expirare ale certificatelor și domeniilor. O alertă trebuie să ajungă chiar și atunci când o regiune întreagă tace. Cum construiți acest lucru pentru servere individuale arată articolul Configurarea monitorizării serverelor.

Distribuirea sigură a secretelor

Parolele și cheile nu își au locul în variabile de mediu sau în fișiere Compose, ci în Docker Secrets. Acestea sunt stocate criptat în jurnalul Raft și livrate doar serviciilor cărora li le atribuiți explicit:

printf '%s' 'PAROLA_BAZEI_DE_DATE' | docker secret create db_password -
docker service update --secret-add db_password web-eu

De ce KernelHost pentru un Swarm pe mai multe continente

Un cluster pe mai multe continente impune furnizorului alte cerințe decât un singur server. În practică, aceste aspecte sunt decisive:

CerințăDe ce conteazăLa KernelHost
Locații pe mai multe continenteCvorumul are nevoie de trei locații independente, iar utilizatorii vor distanțe scurteFrankfurt am Main plus locații în Europa, America de Nord și Asia-Pacific, de la un singur furnizor
Trafic nelimitatWireGuard, rețeaua overlay și replicarea bazei de date generează permanent trafic între continenteVPS cu trafic nelimitat, fără limită de volum
Protecție DDoSFiecare punct de intrare este accesibil public și, prin urmare, o țintă de atacInclusă în fiecare locație, în locația principală Frankfurt am Main cu filtrare Arbor în timp real de 3,2 Tbps, fără null-routing
Acces root completWireGuard, firewallul și Docker Engine au nevoie de control deplinPe fiecare server root KVM și server dedicat
Provizionare rapidăNodurile de rezervă și regiunile de test trebuie să fie gata în câteva minuteAproximativ 30 de secunde în Frankfurt am Main, în alte locații de obicei câteva minute
Fără angajament contractual per nodNodurile vin și pleacă în funcție de necesarPrePaid, fără durată minimă, fără taxă de configurare
AutomatizareNodurile noi trebuie să poată fi create prin scriptComandă și control prin KernelHost API

O privire de ansamblu asupra tuturor tarifelor cloud, cu prețuri, și o comparație a costurilor cu marii furnizori de cloud găsiți pe pagina Închiriere server cloud.

Erori frecvente și cum le evitați

  • Manageri în doar două locații. Dacă locația cu majoritatea cade, clusterul se blochează. Soluție: trei locații, distribuție 1-1-1 sau 2-2-1.
  • Număr par de manageri. Patru manageri nu suportă mai multe căderi decât trei, dar cresc efortul de coordonare. Soluție: 3, 5 sau 7.
  • Cererile circulă între continente. O adresă de serviciu comună tuturor regiunilor trimite utilizatorii pe jumătate de glob. Soluție: un serviciu și un punct de intrare pentru fiecare regiune.
  • Porturile Swarm accesibile public. Portul 2377 și rețeaua overlay nu au ce căuta niciodată în internetul deschis. Soluție: doar prin WireGuard; public doar 80, 443 și WireGuard pentru celelalte noduri.
  • MTU-ul uitat. Răspunsurile mari se blochează, cele mici funcționează. Soluție: MTU overlay 1370 la WireGuard cu 1420.
  • Încrederea în ufw pentru porturile containerelor. Docker ocolește ufw la porturile publicate. Soluție: publicați doar punctul de intrare.
  • Bază de date într-un volum, fără replicare. Dacă regiunea cade, datele nu sunt accesibile. Soluție: replicarea bazei de date, plasare fixă în regiune.
  • Actualizare în toate regiunile deodată. O eroare îi afectează atunci pe toți utilizatorii din lume. Soluție: lansare regiune cu regiune.
  • TTL DNS mare. Cu un TTL de o zi, failoverul intră în acțiune abia a doua zi. Soluție: 60 de secunde.
  • Replicare în loc de backup. O eroare este replicată la fel ca datele bune. Soluție: în plus, backupuri testate într-o locație independentă.

Pe scurt

  • Un Docker Swarm pe trei continente este proiectat pentru un uptime de 100%: o locație sau un continent întreg poate cădea fără ca aplicația să se oprească.
  • Nimeni nu poate garanta absolut o anumită disponibilitate; riscurile rămase sunt DNS-ul, actualizările defecte, baza de date și certificatele, iar pentru fiecare există o contramăsură.
  • Trei manageri în trei locații reprezintă minimul; două locații nu sunt suficiente pentru un cvorum tolerant la defecțiuni.
  • Fiecare cerere rămâne în regiunea ei: un serviciu și un punct de intrare pentru fiecare regiune, plus Geo-DNS cu health check-uri și TTL scurt.
  • WireGuard criptează traficul clusterului, porturile Swarm rămân invizibile, iar MTU-ul rețelei overlay scade la 1370.
  • Swarm replică containere, nu date: bazele de date au nevoie de replicare proprie, iar backupurile rămân obligatorii.
  • KernelHost oferă locații în Europa, America de Nord și Asia-Pacific, trafic nelimitat, protecție DDoS în fiecare locație și facturare PrePaid fără durată minimă.

Întrebări frecvente

Poate Docker Swarm să garanteze un uptime de 100%?
Un Docker Swarm pe trei continente este proiectat pentru un uptime de 100%, deoarece niciun server, niciun centru de date și niciun continent nu poate opri singur aplicația. Totuși, nimeni nu poate garanta o disponibilitate absolută, nici măcar marii furnizori de cloud. Riscurile rămase sunt dependențele comune, precum DNS-ul, actualizările defecte, baza de date și certificatele. Împotriva lor ajută health check-urile cu rollback automat, actualizările regiune cu regiune, replicarea bazei de date și monitorizarea.
De câte noduri manager are nevoie un Docker Swarm cu disponibilitate ridicată?
De cel puțin trei, distribuite în trei locații independente. Managerii mențin starea clusterului prin consens Raft și au nevoie de o majoritate pentru fiecare modificare: trei manageri suportă o cădere, cinci suportă două, șapte suportă trei. Docker recomandă un număr impar și distribuirea în cel puțin trei zone, la trei manageri în raport de 1-1-1.
De ce nu sunt suficiente două centre de date pentru Docker Swarm?
Pentru că, la două locații, într-una dintre ele se află inevitabil mai mulți manageri. Dacă tocmai acea locație cade, lipsește majoritatea managerilor, iar clusterul nu mai poate nici să replanifice, nici să compenseze căderile, nici să distribuie actualizări. Containerele care rulează continuă să funcționeze, dar clusterul nu mai poate acționa. Abia cu trei locații cvorumul supraviețuiește căderii oricărui centru de date.
Se pot distribui managerii Swarm pe continente diferite?
Da. Un Swarm cu câte un manager în America de Nord, Europa și Asia supraviețuiește căderii unui continent întreg. Prețul este o administrare mai lentă a clusterului, deoarece fiecare modificare așteaptă confirmarea pe distanțe lungi, cu o latență de 80 până la 250 de milisecunde. Pentru utilizatori acest lucru nu contează, atâta timp cât fiecare cerere primește răspuns în regiunea ei, adică cu un serviciu și un punct de intrare pentru fiecare regiune.
De ce porturi are nevoie Docker Swarm?
Între noduri, Docker Swarm are nevoie de portul 2377/TCP pentru administrarea clusterului, de portul 7946/TCP și UDP pentru comunicarea dintre noduri și de portul 4789/UDP pentru rețeaua overlay. Dacă rețeaua overlay folosește criptarea integrată, trebuie permis suplimentar protocolul IP 50 (ESP). Niciunul dintre aceste porturi nu are ce căuta în internetul deschis; cel mai sigur este ca ele să fie accesibile exclusiv printr-o rețea WireGuard între noduri.
Am nevoie de WireGuard sau este suficientă rețeaua overlay criptată?
Rețeaua overlay criptată (--opt encrypted) protejează doar traficul de date al containerelor și, potrivit Docker, costă simțitor din performanță. WireGuard, în schimb, criptează tot traficul dintre noduri, inclusiv administrarea și comunicarea dintre noduri, și ține toate porturile Swarm departe de internet. Pentru un cluster în mai multe centre de date recomandăm WireGuard cu un MTU overlay de 1370 de octeți.
Cum funcționează failoverul între continente?
Un serviciu DNS cu rutare geografică și health check-uri trimite fiecare utilizator către cea mai apropiată regiune și verifică la fiecare 30 până la 60 de secunde dacă punctul ei de intrare răspunde. Dacă o regiune cade, serviciul nu îi mai returnează adresa și îi direcționează pe utilizatori către următoarea regiune funcțională. Cu un TTL de 60 de secunde, comutarea se încheie de obicei după un minut sau două.
Cum rămân disponibile bazele de date la căderea unei locații?
Prin replicarea bazei de date înseși, nu prin Docker. Swarm replică containere, nu volume. S-a dovedit eficientă o instanță primară într-o regiune, cu replici în celelalte, la PostgreSQL de exemplu cu Patroni pentru comutarea automată. Între continente, replicarea este asincronă, iar în caz de incident pot lipsi ultimele secunde de scrieri. Cine trebuie să scrie la nivel mondial fără pierderi folosește baze de date pentru mai multe regiuni, precum CockroachDB sau YugabyteDB.
Docker Swarm sau Kubernetes pentru mai multe locații?
Docker Swarm este mult mai simplu de construit și de operat și este pe deplin suficient pentru multe aplicații. Kubernetes oferă mai multe posibilități în privința automatizării, scalării și ecosistemului, dar cere mai multe cunoștințe. Între continente, Kubernetes rulează de obicei ca un cluster separat în fiecare regiune, iar implementările ajung în toate clusterele împreună prin GitOps, în timp ce un singur cluster Swarm poate fi întins peste mai multe continente.
Ce locații KernelHost sunt potrivite pentru un Swarm pe trei continente?
KernelHost oferă servere în Frankfurt am Main, precum și în alte locații din Europa, America de Nord și Asia-Pacific, printre care trei locații în SUA, Canada, Londra, Strasbourg, Varșovia, Helsinki, Singapore, Japonia, Sydney și Mumbai. O combinație verificată pentru trei continente este Frankfurt am Main, Coasta de Est a SUA și Singapore. Toate locațiile sunt disponibile de la un singur furnizor, cu protecție DDoS și facturare PrePaid.
Cât costă un Docker Swarm pe trei continente?
În esență, trei servere, câte unul pentru fiecare regiune, plus un serviciu DNS cu health check-uri. Deoarece WireGuard, rețeaua overlay și replicarea bazei de date generează permanent trafic între locații, tarifele cu trafic nelimitat sunt decisive: la mulți dintre marii furnizori de cloud, tocmai acest trafic se plătește suplimentar per gigaoctet. La KernelHost, VPS-urile cu trafic nelimitat funcționează fără limită de volum, PrePaid, fără durată minimă și fără taxă de configurare.

Docker Swarm Disponibilitate ridicată Multi-regiune WireGuard Geo-DNS Failover Docker Cloud