Docker Swarm prin VPN: sarcinile rulează, apelurile între servicii eșuează
Sarcinile rulează în ambele locații, iar apelurile între servicii expiră. Overlay-ul are nevoie de rute de la nod la nod, adrese netraduse și spațiu pentru 50 de octeți de VXLAN.
Trei manageri și cinci lucrători în două locații, unite printr-un tunel, și docker service ls arată sarcini care rulează pe ambele părți în timp ce apelurile între servicii expiră. Nimic din jurnalele Swarm nu pare greșit. Combinația aceea este semnătura unei probleme în planul de date: planul de control a găsit nodurile, iar cadrele încapsulate nu au făcut niciodată drumul.
Rețeaua trebuie să existe înaintea overlay-ului
Overlay-ul Swarm împinge cadrele încapsulate direct între adresele nodurilor, ceea ce înseamnă că fiecare nod are nevoie de o adresă la care fiecare alt nod poate ajunge fără traducere, pe interfața oferită de tunel. Un tunel care duce doar clienți la un port publicat nu este suficient. Stratul inferior trebuie să ruteze de la nod la nod în ambele direcții.
Testați asta înainte de a atinge Swarm. Din fiecare nod, verificați ruta către adresa de tunel a unui partener, faceți ping și apoi testați portul de control. Dacă ping-ul funcționează și portul nu, tunelul este în regulă și un filtru stă în cale.
ip -brief address
ip route get 10.20.0.12
ping -c3 10.20.0.12
nc -vz 10.20.0.12 2377
Dacă ruta indică interfața fizică în loc de tun0 sau wg0, overlay-ul va încapsula spre o adresă pe care locația îndepărtată nu o poate atinge, iar simptomul va arăta ca pierdere de pachete.
Verificați ce adresă anunță fiecare nod
Daemonul anunță o adresă, iar partenerii o folosesc pentru planul de date. Pe un gazdă cu mai multe rețele este ușor să anunți adresa LAN sau publică în timp ce tunelul transportă altceva. Inspectați-o în loc să presupuneți, și fixați-o la alăturare cu --advertise-addr când valoarea implicită este greșită. Un nod care anunță o adresă doar el poate atinge tot se alătură swarm-ului, iar defecțiunea apare mai târziu ca servicii care nu pot comunica între locații.
Schimbarea adresei anunțate mai târziu nu este o editare de configurație, pentru că nodul trebuie să plece și să se alăture din nou.
Notați adresa anunțată pentru fiecare nod, pentru că explică majoritatea defecțiunilor asimetrice.
Masquerade este vinovatul obișnuit
Când o poartă stă între noduri și tunel, greșeala obișnuită este să aplici masquerade la tot ce iese din interfața fizică. Aceasta rescrie și adresele interne ale overlay-ului, așa că fiecare partener pare să vină din poartă, iar partenerii VXLAN nu se mai recunosc. Rezultatul este trafic încapsulat lipsă sau unidirecțional în timp ce ping-urile obișnuite încă funcționează.
Rutați prefixul overlay-ului prin poartă și lăsați-l netradus. Dacă traducerea este cu adevărat necesară pentru alt prefix, limitați-o acolo și niciodată la intervalul folosit de overlay.
ip route add 172.16.0.0/22 via 10.20.0.1
iptables -t nat -I POSTROUTING -o tun0 -s 172.16.0.0/22 -j ACCEPT
Verificați ordinea regulilor, precum și textul lor, pentru că un MASQUERADE larg mai devreme în lanț învinge o excepție îngustă mai târziu.
VXLAN are nevoie de spațiu în pachet
VXLAN adaugă 50 de octeți cadrelor pe care le transportă. Un strat inferior de 1500 de octeți care transportă un cadru intern de 1500 de octeți produce un pachet încapsulat pe care nicio cale nu îl va livra, iar defecțiunea arată ca o descoperire de servicii intermitentă, nu ca o problemă de dimensiune. Fie coborâți MTU-ul tunelului la ambele capete, fie setați MTU-ul overlay-ului astfel încât driverul să anunțe o încărcătură utilă care încape.
docker network create --driver overlay --attachable --opt com.docker.network.driver.mtu=1400 swarm-overlay
Rețeaua ingress este creată automat, așa că schimbarea ei înseamnă ștergere și recreare, nu editare la fața locului.
Dacă reparați doar o parte a tunelului, MTU-ul mai mic rămâne tot cel care contează.
Urmăriți planul de date, nu jurnalele
Capturați portul VXLAN la ambele capete. Cadrele care pleacă de pe o parte și ajung pe cealaltă înseamnă că stratul inferior este în regulă și problema este în interiorul overlay-ului. Cadrele care pleacă și nu ajung niciodată înseamnă o rută sau un filtru. Cadrele care nu pleacă deloc înseamnă că adresa sursă este greșită.
Defecțiunile de descoperire a serviciilor care dispar după câteva secunde indică de obicei bugetul de pachete sau o cale instabilă, nu cvorumul raft.
Păstrați captura dintr-o fereastră funcțională, pentru că a o compara cu cea defectă este mai rapid decât a reciti configurația.