Predlažem da se upoznate s transkripcijom izvještaja Aleksandra Sigatcheva o Service Discovery u distribuiranim sustavima na primjeru Consul.
Service Discovery je stvoren kako bi se novo aplikaciju moglo povezati u već postojeće naše okruženje uz minimalne troškove. Koristeći Service Discovery, možemo maksimalno odvojiti bilo koji kontejner kao što je Docker, ili virtualnu uslugu od okruženja u kojem je pokrenuta.

Pozdrav svima! Ja sam Aleksandar Sigachev, radim u tvrtki Inventos. Danas ću vas upoznati s pojmom Service Discovery. Istražit ćemo Service Discovery na primjeru Consul.

Koje probleme rješava Service Discovery? Service Discovery je stvoren kako bi se novo aplikaciju moglo povezati u već postojeće naše okruženje uz minimalne troškove. Koristeći Service Discovery, možemo maksimalno odvojiti bilo koji kontejner kao što je Docker, ili virtualnu uslugu od okruženja u kojem je pokrenuta.
Kako to izgleda? Na klasičnom primjeru u webu – to je frontend koji prima korisnički zahtjev. Zatim izvršava usmjeravanje na backend. U ovom primjeru – load-balancer ravnoteža na dva backend-a.

Ovdje vidimo da pokrećemo treći primjerak aplikacije. Kada se aplikacija pokrene, registrira se u Service Discovery. Service Discovery obavještava load-balancer. Load-balancer automatski mijenja svoju konfiguraciju i novi backend se priključuje u rad. Tako se mogu dodavati backendi ili, suprotno, isključivati iz rada.

Što još može biti korisno pomoću Service Discovery? U Service Discovery mogu se pohranjivati konfiguracije nginx-a, certifikati i popis aktivnih backend poslužitelja.
Također, Service Discovery omogućuje otkrivanje kvarova i neuspjeha. Koje sheme su moguće prilikom otkrivanja kvarova?
- Ova aplikacija, koju smo razvili, sama obavještava Service Discovery da je još uvijek operativna.
- Service Discovery sa svoje strane ispituje aplikaciju o dostupnosti.
- Ili se koristi vanjski skript ili aplikacija koja provjerava našu aplikaciju na dostupnost i obavještava Service Discovery da je sve u redu i može raditi, ili, suprotno, da je sve loše i da je potrebno isključiti ovaj primjerak aplikacije iz ravnoteže.
Svaka od shema može se primijeniti ovisno o tome koje softver koristimo. Na primjer, ako smo tek počeli razvijati novi projekt, možemo lako omogućiti shemu u kojoj naša aplikacija obavještava Service Discovery. Ili možemo povezati da Service Discovery provodi provjeru.
Ako nam je aplikacija ostavljena u nasljedstvo ili je razvijena od strane nekog trećeg, tada dolazi u obzir treća opcija, kada pišemo obrtnik, i sve to automatski dolazi u našu radnu okolinu.

Ovo je jedan od primjera. Load-balancer u obliku nginx se ponovo pokreće. To je dodatni alat koji se isporučuje zajedno s Consulom. To je consul-template. Opisujemo pravilo. Kažemo da koristimo predložak (Golang predložak). Kada se dogode događaji, prilikom obavijesti o promjenama, on se ponovno generira i Service Discovery šalje komandu "reload". Najjednostavniji primjer, kada se na temelju događaja ponovo konfigurira nginx i ponovo pokreće.

Što je Consul?
Prije svega – to je Service Discovery.
Ima mehanizam provjere dostupnosti – Health Checking.
Također ima KV Store.
I u njegovoj osnovi je mogućnost korištenja Multi Datacenter.
Za što možemo koristiti sve ovo? U KV Store možemo pohranjivati primjere konfiguracija. Health Checking možemo provoditi za lokalnu uslugu i obavještavati. Multi Datacenter se koristi kako bi se mogla izgraditi karta usluga. Na primjer, Amazon ima nekoliko zona i usmjerava promet najoptimalnije, kako ne bi bilo suvišnih zahtjeva između podatkovnih centara, koji se posebno naplaćuju od lokalnog prometa, a samim tim imaju manju latenciju.

Pogledajmo malo termine koji se koriste u Consulu.
- Consul je usluga napisana u Go. Jedna od prednosti programa na Go je to što je to jedan binarni datoteka, koju jednostavno preuzmete. Pokrenete je s bilo kojeg mjesta i nemate nikakvih ovisnosti.
- Zatim pomoću ključeva možemo pokrenuti ovu uslugu ili u klijentskom režimu, ili u režimu servera.
- Također atribut "datacenter" omogućuje postavljanje oznake kojem podatkovnom centru pripada ovaj server.
- Consensus se temelji na raft protokolu. Ako vas to zanima, možete pročitati više o tome na web stranici Consul. To je protokol koji omogućuje određivanje vođe i definiranje koje podatke smatrati valjanima i dostupnima.
- Gossip – je protokol koji omogućuje interakciju između nodova. Ovaj sustav je decentraliziran. Unutar jednog data centra, svi nodovi komuniciraju s susjedima. Na taj način, informacije o aktualnom stanju se međusobno prenose. Može se reći da su to nekakve glasine među susjedima.
- LAN Gossip – lokalna razmjena podataka između susjednih nodova unutar jednog data centra.
- WAN Gossip – koristi se kada je potrebno sinkronizirati informacije između dva data centra. Informacije se prenose između nodova označenih kao server.
- RPC – omogućuje izvršavanje zahtjeva putem klijenta na serveru.
Opis RPC-a. Pretpostavimo da je na virtualnoj ili fizičkoj mašini pokrenut Consul kao klijent. Na njega se lokalno obraćamo. Lokalni klijent zatim traži informacije od servera i sinkronizira se. Ovisno o postavkama, informacije se mogu vraćati iz lokalnog keša ili se mogu sinkronizirati s vođom, glavnim serverom.
Ova dva modela imaju svoje prednosti i nedostatke. Ako radimo s lokalnim kešom, to je brzo. Ako radimo s podacima pohranjenim na serveru, to je sporije, ali dobijamo ažuriranije informacije.

Ako ovo prikažemo grafički, dobit ćemo sliku web stranice. Vidimo da imamo tri glavna čvora. Jedan je označen zvijezdom kao vođa. U ovom primjeru, tri klijenta međusobno razmjenjuju informacije lokalno preko UDP/TCP protokola. A informacije između data centara prenose se između servera. Ovdje klijenti međusobno komuniciraju lokalno.

Koji API daje Consul? Da bismo dobili informacije, Consul nudi dva tipa API-a.
To je DNS API. Po defaultu, Consul se pokreće na portu 8600. Možemo postaviti proksiranje zahtjeva i osigurati pristup putem lokalnog razrješavanja, preko lokalnog DNS-a. Možemo zatražiti po domeni i dobiti informacije o IP adresi kao odgovor.
HTTP API – ili možemo lokalno na portu 8500 zatražiti informacije o određenoj usluzi i dobiti JSON odgovor koji sadrži koji IP ima server, koji host, koji port je registriran. Dodatne informacije mogu biti proslijeđene putem tokena.

Što je potrebno za pokretanje Consula?
U prvoj opciji u načinu razvoja postavljamo zastavicu da je ovo način razvoja. Agent se pokreće kao server. I cijelu funkciju obavlja samostalno na jednom računalu. Povoljno, brzo i praktički ne zahtijeva dodatna podešavanja za prvo pokretanje.
Drugi način je pokretanje u produkciji. Ovdje se pokretanje malo komplicira. Ako nemamo nijednu verziju konzola, moramo pokrenuti prvu mašinu u bootstrap-u, tj. ovu mašinu koja će preuzeti obaveze vođe. Dižemo je, zatim podižemo drugi primjerak servera, predajući mu informacije o tome gdje se nalazi master. Podižemo treći. Nakon što smo podigli tri mašine, na prvoj mašini iz pokrenutog bootstrap-a, ponovo je pokrećemo u normalnom režimu. Podaci se sinkroniziraju i početni klaster je već podignut.
Preporučuje se pokretanje od tri do sedam primjeraka u režimu servera. To je zbog toga što ako se broj servera povećava, vrijeme za sinkronizaciju informacija između njih se povećava. Broj nodova treba biti neparan kako bi se osigurao kvorum.

Kako se osiguravaju provjere zdravstvenog stanja? U direktorij za konfiguraciju Consul u obliku Json-a pišemo pravilo provjere. Prva opcija je dostupnost u ovom primjeru domene google.com. I kažemo da na intervalu od 30 sekundi treba izvršiti ovu provjeru. Tako provjeravamo da naš nod ima pristup vanjskoj mreži.
Druga opcija je samoprovjera. Običnim curl-om pozivamo localhost na navedenom portu s intervalom od 10 sekundi.
Ove provjere se zbrajaju i ulaze u Otkriće usluga. Na temelju dostupnosti, ti nodovi ili se isključuju ili se pojavljuju na popisu dostupnih i ispravno funkcionirajućih mašina.

Također, Consul pruža UI sučelje, koje se pokreće s posebnom zastavicom i bit će dostupno na mašini. To omogućava pregledavanje informacija, a također se mogu unositi neka podešavanja.
U ovom primjeru otvorena je kartica „Usluga”. Prikazano je da su pokrenuta tri servisa, jedan od njih je Consul. Broj izvršenih provjera. I postoje tri data centra u kojima se nalaze mašine.

Ovo je primjer kartice "Nodes". Vidimo da imaju složena imena koja uključuju podatkovne centre. Također je prikazano koji su servisi aktivni, tj. vidimo da oznake nisu postavljene. U ovim dodatnim oznakama možemo unijeti informacije koje programer može koristiti za postavljanje dodatnih parametara.
Također se može prenijeti informacija u Consul o stanju diskova, o prosječnoj opterećenosti.
Pitanja
Pitanje: Imamo Docker kontejner, kako ga koristiti s Consul?
Odgovor: Za Docker kontejner postoji nekoliko pristupa. Jedan od najraširenijih je korištenje vanjskog Docker kontejnera odgovornog za registraciju. Prilikom pokretanja proslijedimo socket Docker-a. Svi događaji vezani za registraciju i odjavu kontejnera se upisuju u Consul.
Pitanje: Znači Consul sam pokreće Docker kontejner?
Odgovor: Ne. Mi pokrećemo Docker kontejner. A pri konfiguraciji navodimo – slušaj taj socket. To je otprilike isto kao kada radimo s certifikatom i prosljeđujemo informacije o tome gdje i što imamo.
Pitanje: Izgleda da unutar Docker kontejnera koji pokušavamo povezati s Service Discovery mora postojati neka logika koja može dostaviti podatke Consul-u?
Odgovor: Ne baš. Kada se pokrene, mi putem varijanti okruženja šaljemo varijable. Recimo, naziv servisa, port servisa. U registru se ta informacija sluša i upisuje u Consul.
Pitanje: Imam još jedno pitanje o UI-u. Postavili smo UI, recimo, na produkcijskom serveru. Što je s sigurnošću? Gdje se pohranjuju podaci? Možemo li na neki način akumulirati podatke?
Odgovor: U UI-u su upravo podaci iz baze i iz Service Discovery. Lozinke postavljamo u postavkama sami.
Pitanje: Je li to moguće objaviti na internetu?
Odgovor: Prema zadanim postavkama Consul se pokreće na localhost-u. Da bismo to objavili na internetu, potrebno je postaviti neki proxy. Za pravila sigurnosti odgovaramo sami.
Pitanje: Da li iz kutije daje povijesne podatke? Zanimljivo je vidjeti statistiku o Health Checks. Može li se dijagnosticirati problemi kada server često ispada?
Odgovor: Nisam siguran da li tamo postoje detalji provjera.
Pitanje: Nije toliko važno trenutno stanje, koliko je važna dinamika.
Odgovor: Za analizu – da.
Pitanje: Za Docker se Consul ne preporučuje koristiti za Service Discovery?
Odgovor: Ne bih preporučio njegovo korištenje. Cilj izvještaja je upoznati se s pojmom. Povijesno gledano, prošao je put do prve verzije. Sada postoje cjelovitija rješenja, poput Kubernetesa, koja sve to imaju ispod haube. U okviru Kubernetesa, Service Discovery zaostaje za Etcd-om. No, nisam s njim toliko upoznat kao s Consul-om. Stoga sam se odlučio napraviti primjer Service Discovery na temelju Consul-a.
Pitanje: Da li shema s lider-serverom usporava pokretanje aplikacije u cjelini? I kako Consul određuje novog lidera ako je trenutni nedostupan?
Odgovor: Oni imaju opisanu cijelu protokol. Ako vas zanima, možete pročitati.
Pitanje: Da li Consul služi kao potpuno funkcionalni server dok svi zahtjevi prolaze kroz njega?
Odgovor: On nije potpuno funkcionalni server, već preuzima određenu zonu. Ta zona obično završava s service.consul. I dalje idemo logikom. Ne koristimo domene u produkciji, već internu infrastrukturu koja se obično skriva iza keširanja servera kada radimo preko DNS-a.
Pitanje: Dakle, ako se želimo obratiti bazi podataka, u svakom slučaju ćemo morati konzultirati Consul da prvo pronađemo tu bazu, je li tako?
Odgovor: Da. Kada radimo preko DNS-a, to funkcionira kao bez Consul-a kada koristimo DNS imena. Obično moderni programi ne traže domensko ime u svakom zahtjevu, jer kada uspostavimo vezu, sve funkcionira i u bliskoj budućnosti to ne koristimo. Ako se veza prekine, onda – da, opet pitamo gdje se nalazi baza i idemo prema njoj.
— Chat korisnika Hashicorp: Consul, Nomad, Terraform
P.S. O zdravstvenim provjerama. U Consul-u, kao i u Kubernetesu, koristi se isti sustav provjere stanja održivosti servisa temeljen na statusnom kodu.
200 OK za zdrave
503 Servis nedostupan za bolesneIzvori:
Izvor: habr.com
