Prihvaćamo 10 000 događaja u Yandex.Cloudu. 1. dio

Pozdrav svima, prijatelji!

* Ovaj se članak temelji na otvorenoj radionici REBRAIN & Yandex.Cloud, ako više volite pogledati video, možete ga pronaći na ovoj poveznici - https://youtu.be/cZLezUm0ekE

Nedavno smo imali priliku isprobati Yandex.Cloud uživo. Budući da smo željeli dugo i teško istraživati, odmah smo odustali od ideje pokretanja jednostavnog Wordpress bloga s bazom u oblaku - bilo je previše dosadno. Nakon malo razmišljanja, odlučili smo implementirati nešto slično arhitekturi proizvodnih usluga za primanje i analizu događaja u načinu rada gotovo u stvarnom vremenu.

Apsolutno sam siguran da velika većina online (i ne samo) tvrtki na neki način prikuplja brdo informacija o svojim korisnicima i njihovim postupcima. To je minimalno potrebno za donošenje određenih odluka - primjerice, ako upravljate internetskom igricom, možete pogledati statistiku na kojoj razini korisnici najčešće zapnu i obrišu vašu igračku. Ili zašto korisnici napuštaju vašu stranicu bez da su kupili nešto (pozdrav, Yandex.Metrica).

Dakle, naša priča: kako smo napisali aplikaciju u golangu, testirali kafku vs rabbitmq vs yqs, napisali strujanje podataka u klasteru Clickhouse i vizualizirali podatke koristeći yandex datalens. Naravno, sve je to začinjeno infrastrukturnim užicima u vidu dockera, terraforma, gitlab cija i, naravno, prometheusa. Idemo!

Htio bih odmah napraviti rezervaciju da nećemo moći sve konfigurirati u jednom danu - za to će nam trebati nekoliko članaka u seriji. Malo o strukturi:

1. dio (čitate ga). Odlučit ćemo o specifikacijama i arhitekturi rješenja te napisati aplikaciju u golangu.
2. dio. Puštamo našu aplikaciju u proizvodnju, činimo je skalabilnom i testiramo opterećenje.
dio 3. Pokušajmo shvatiti zašto moramo pohranjivati ​​poruke u međuspremnik, a ne u datoteke, a također usporedimo kafku, rabbitmq i yandex uslugu čekanja.
dio 4 Postavit ćemo Clickhouse klaster, napisati uslugu strujanja za prijenos podataka iz međuspremnika tamo i postaviti vizualizaciju u datalensu.
dio 5 Dovedimo cijelu infrastrukturu u pravi oblik - postavimo ci/cd pomoću gitlab ci, spojimo praćenje i otkrivanje servisa pomoću prometheusa i consul.

TK

Prvo, formulirajmo projektni zadatak - što točno želimo dobiti kao rezultat.

  1. Želimo imati krajnju točku kao što je events.kis.im (kis.im je testna domena koju ćemo koristiti u svim člancima), koja bi trebala primati događaje koristeći HTTPS.
  2. Događaji su jednostavni json poput: {“event”: “view”, “os”: “linux”, “browser”: “chrome”}. U završnoj fazi ćemo dodati još malo polja, ali to neće igrati veliku ulogu. Ako želite, možete se prebaciti na protobuf.
  3. Usluga mora moći obraditi 10 događaja u sekundi.
  4. Trebalo bi biti moguće vodoravno skalirati jednostavnim dodavanjem novih instanci našem rješenju. I bilo bi lijepo ako možemo premjestiti prednji dio na različite geolokacije kako bismo smanjili kašnjenje za zahtjeve klijenata.
  5. Tolerancija kvarova. Otopina mora biti dovoljno stabilna i sposobna preživjeti pad bilo kojeg dijela (do određenog broja, naravno).

arhitektura

Općenito, za ovu vrstu zadatka odavno su izmišljene klasične arhitekture koje omogućuju učinkovito skaliranje. Na slici je prikazan primjer našeg rješenja.

Prihvaćamo 10 000 događaja u Yandex.Cloudu. 1. dio

Dakle, što imamo:

1. S lijeve strane su naši uređaji koji generiraju različite događaje, bilo da igrači završavaju razinu u igrački na pametnom telefonu ili kreiraju narudžbu u online trgovini putem uobičajenog preglednika. Događaj, kako je navedeno u specifikaciji, jednostavan je json koji se šalje našoj krajnjoj točki - events.kis.im.

2. Prva dva poslužitelja su jednostavni balanseri, njihovi glavni zadaci su:

  • Budite stalno dostupni. Da biste to učinili, možete koristiti, na primjer, keepalived, koji će prebacivati ​​virtualni IP između čvorova u slučaju problema.
  • Prekini TLS. Da, ukinut ćemo TLS na njima. Prvo, kako bi naše rješenje bilo u skladu s tehničkim specifikacijama, a drugo, kako bismo se oslobodili tereta uspostavljanja šifrirane veze s naših pozadinskih poslužitelja.
  • Uravnotežite dolazne zahtjeve s dostupnim pozadinskim poslužiteljima. Ključna riječ ovdje je pristupačan. Na temelju toga, došli smo do razumijevanja da balanseri opterećenja moraju biti u mogućnosti nadzirati naše poslužitelje s aplikacijama i zaustaviti balansiranje prometa prema neispravnim čvorovima.

3. Nakon balansera, imamo aplikacijske poslužitelje koji pokreću prilično jednostavnu aplikaciju. Trebao bi moći prihvatiti dolazne zahtjeve putem HTTP-a, potvrditi poslani json i staviti podatke u međuspremnik.

4. Dijagram prikazuje kafku kao međuspremnik, iako se, naravno, druge slične usluge mogu koristiti na ovoj razini. Usporedit ćemo Kafku, rabbitmq i yqs u trećem članku.

5. Pretposljednja točka naše arhitekture je Clickhouse - stupčasta baza podataka koja vam omogućuje pohranu i obradu ogromne količine podataka. Na ovoj razini moramo prenijeti podatke iz međuspremnika u sam sustav za pohranu (više o tome u članku 4).

Ovaj nam dizajn omogućuje neovisno vodoravno skaliranje svakog sloja. Pozadinski poslužitelji se ne mogu nositi s tim - dodajmo još jednu stvar - na kraju krajeva, oni su aplikacije bez statusa i stoga se to može učiniti čak i automatski. Međuspremnik u Kafkinom stilu ne radi - dodajmo više poslužitelja i prenesimo neke od particija naše teme na njih. Clickhouse to ne može podnijeti - to je nemoguće :) Zapravo, također ćemo povezati poslužitelje i podijeliti podatke.

Usput, ako želite implementirati izborni dio naših tehničkih specifikacija i mjerila na različitim geolokacijama, onda nema ništa jednostavnije:

Prihvaćamo 10 000 događaja u Yandex.Cloudu. 1. dio

Na svakoj geolokaciji postavljamo balanser opterećenja s aplikacijom i kafkom. Općenito, dovoljna su 2 aplikacijska poslužitelja, 3 kafka čvora i cloud balancer, na primjer, cloudflare, koji će provjeravati dostupnost aplikacijskih čvorova i balansirati zahtjeve geolokacijom na temelju izvorne IP adrese klijenta. Tako će podaci koje pošalje američki klijent sletjeti na američke poslužitelje. A podaci iz Afrike su na afričkom jeziku.

Onda je sve vrlo jednostavno – koristimo se mirror toolom iz Kafkinog skupa i kopiramo sve podatke sa svih lokacija u naš središnji podatkovni centar koji se nalazi u Rusiji. Interno analiziramo podatke i bilježimo ih u Clickhouse za naknadnu vizualizaciju.

Dakle, sredili smo arhitekturu - počnimo tresti Yandex.Cloud!

Pisanje molbe

Prije Clouda ipak morate biti malo strpljivi i napisati prilično jednostavan servis za obradu dolaznih događaja. Koristit ćemo golang jer se jako dobro pokazao kao jezik za pisanje mrežnih aplikacija.

Nakon sat vremena (možda par sati) dobijemo nešto poput ovoga: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Koje su glavne točke koje bih ovdje želio istaknuti:

1. Prilikom pokretanja aplikacije možete odrediti dvije zastavice. Jedan je odgovoran za port na kojem ćemo slušati dolazne http zahtjeve (-addr). Drugi je za adresu kafka poslužitelja gdje ćemo bilježiti naše događaje (-kafka):

addr     = flag.String("addr", ":8080", "TCP address to listen to")
kafka    = flag.String("kafka", "127.0.0.1:9092", "Kafka endpoints”)

2. Aplikacija koristi knjižnicu sarama ([] github.com/Shopify/sarama) za slanje poruka kafka klasteru. Odmah postavljamo postavke usmjerene na maksimalnu brzinu obrade:

config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForLocal
config.Producer.Compression = sarama.CompressionSnappy
config.Producer.Return.Successes = true

3. Naša aplikacija također ima ugrađen prometheus klijent koji prikuplja različite metrike, kao što su:

  • broj zahtjeva za našu aplikaciju;
  • broj grešaka prilikom izvršavanja zahtjeva (nemoguće čitati post zahtjev, pokvaren json, nemoguće pisati u Kafku);
  • vrijeme obrade jednog zahtjeva klijenta, uključujući i vrijeme pisanja poruke Kafki.

4. Tri krajnje točke koje naša aplikacija obrađuje:

  • /status - jednostavno vrati ok da pokaže da smo živi. Iako možete dodati neke provjere, kao što je dostupnost Kafka klastera.
  • /metrics - prema ovom url-u, prometheus klijent će vratiti metriku koju je prikupio.
  • /post je glavna krajnja točka gdje će se slati POST zahtjevi s jsonom. Naša aplikacija provjerava valjanost jsona i ako je sve u redu, zapisuje podatke u Kafka klaster.

Napravit ću rezervu da kod nije savršen - može se (i treba!) dovršiti. Na primjer, možete prestati koristiti ugrađeni net/http i prebaciti se na brži fasthttp. Ili možete dobiti vrijeme obrade i procesorske resurse pomicanjem provjere valjanosti jsona u kasniju fazu - kada se podaci prenesu iz međuspremnika u klaster clickhouse.

Uz razvojnu stranu problema, odmah smo razmišljali o našoj budućoj infrastrukturi i odlučili implementirati našu aplikaciju putem dockera. Konačna Dockerfile za izradu aplikacije je https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Općenito, prilično je jednostavno, jedina točka na koju bih želio obratiti pozornost je višestupanjska montaža, koja nam omogućuje smanjenje konačne slike našeg spremnika.

Prvi koraci u oblaku

Prije svega, registrirajte se na oblak.yandex.ru. Nakon što ispunimo sva potrebna polja, bit će nam kreiran račun i dodijeljena nam je bespovratna sredstva u određenom novčanom iznosu, koja se može koristiti za testiranje cloud servisa. Ako želite ponoviti sve korake iz našeg članka, ova bi vam potpora trebala biti dovoljna.

Nakon registracije, za vas će se kreirati zaseban oblak i zadani direktorij u kojem možete početi kreirati resurse oblaka. Općenito, u Yandex.Cloudu odnos resursa izgleda ovako:

Prihvaćamo 10 000 događaja u Yandex.Cloudu. 1. dio

Možete stvoriti nekoliko oblaka za jedan račun. A unutar oblaka napravite različite direktorije za različite projekte tvrtke. Više o tome možete pročitati u dokumentaciji - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Usput, često ću se pozivati ​​na njega u nastavku teksta. Kada sam postavljao cijelu infrastrukturu od nule, dokumentacija mi je više puta pomogla, pa vam savjetujem da je proučite.

Za upravljanje oblakom možete koristiti i web sučelje i uslužni program konzole - yc. Instalacija se izvodi jednom naredbom (za Linux i Mac Os):

curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash

Ako vaš stručnjak za unutarnju sigurnost bjesni zbog pokretanja skripti s interneta, onda, prvo, možete otvoriti skriptu i pročitati je, a drugo, mi je pokrećemo pod našim korisničkim imenom - bez root prava.

Ako želite instalirati klijent za Windows, možete koristiti upute здесь a zatim izvršiti yc initda biste ga u potpunosti prilagodili:

vozerov@mba:~ $ yc init
Welcome! This command will take you through the configuration process.
Please go to https://oauth.yandex.ru/authorize?response_type=token&client_id= in order to obtain OAuth token.

Please enter OAuth token:
Please select cloud to use:
 [1] cloud-b1gv67ihgfu3bp (id = b1gv67ihgfu3bpt24o0q)
 [2] fevlake-cloud (id = b1g6bvup3toribomnh30)
Please enter your numeric choice: 2
Your current cloud has been set to 'fevlake-cloud' (id = b1g6bvup3toribomnh30).
Please choose folder to use:
 [1] default (id = b1g5r6h11knotfr8vjp7)
 [2] Create a new folder
Please enter your numeric choice: 1
Your current folder has been set to 'default' (id = b1g5r6h11knotfr8vjp7).
Do you want to configure a default Compute zone? [Y/n]
Which zone do you want to use as a profile default?
 [1] ru-central1-a
 [2] ru-central1-b
 [3] ru-central1-c
 [4] Don't set default zone
Please enter your numeric choice: 1
Your profile default Compute zone has been set to 'ru-central1-a'.
vozerov@mba:~ $

U principu, proces je jednostavan – prvo je potrebno nabaviti oauth token za upravljanje oblakom, odabrati oblak i mapu koju ćete koristiti.

Ako imate nekoliko računa ili mapa unutar istog oblaka, možete stvoriti dodatne profile s odvojenim postavkama putem yc config profile create i prebacivati ​​se između njih.

Osim gore navedenih metoda, Yandex.Cloud tim je napisao vrlo dobar dodatak za terraform za upravljanje resursima u oblaku. Sa svoje strane sam pripremio git repozitorij, gdje sam opisao sve resurse koji će biti kreirani kao dio članka - https://github.com/rebrainme/yandex-cloud-events/. Zanima nas glavna grana, klonirajmo je lokalno:


vozerov@mba:~ $ git clone https://github.com/rebrainme/yandex-cloud-events/ events
Cloning into 'events'...
remote: Enumerating objects: 100, done.
remote: Counting objects: 100% (100/100), done.
remote: Compressing objects: 100% (68/68), done.
remote: Total 100 (delta 37), reused 89 (delta 26), pack-reused 0
Receiving objects: 100% (100/100), 25.65 KiB | 168.00 KiB/s, done.
Resolving deltas: 100% (37/37), done.
vozerov@mba:~ $ cd events/terraform/

Sve glavne varijable koje se koriste u terraformu zapisane su u datoteci main.tf. Za početak stvorite datoteku private.auto.tfvars u mapi terraform sa sljedećim sadržajem:

# Yandex Cloud Oauth token
yc_token = ""
# Yandex Cloud ID
yc_cloud_id = ""
# Yandex Cloud folder ID
yc_folder_id = ""
# Default Yandex Cloud Region
yc_region = "ru-central1-a"
# Cloudflare email
cf_email = ""
# Cloudflare token
cf_token = ""
# Cloudflare zone id
cf_zone_id = ""

Sve varijable mogu se preuzeti s popisa yc konfiguracije, budući da smo već konfigurirali uslužni program konzole. Savjetujem vam da private.auto.tfvars odmah dodate u .gitignore, kako slučajno ne biste objavili privatne podatke.

U private.auto.tfvars također smo naveli podatke iz Cloudflarea - za stvaranje DNS zapisa i proxy glavne domene events.kis.im našim poslužiteljima. Ako ne želite koristiti cloudflare, uklonite inicijalizaciju cloudflare providera u main.tf i datoteci dns.tf koja je odgovorna za stvaranje potrebnih dns zapisa.

U našem radu ćemo kombinirati sve tri metode - web sučelje, uslužni program konzole i terraform.

Virtualne mreže

Da budemo iskreni, možete preskočiti ovaj korak, jer kada kreirate novi oblak, automatski ćete imati zasebnu mrežu i 3 stvorene podmreže - po jednu za svaku zonu dostupnosti. Ali ipak bismo željeli napraviti zasebnu mrežu za naš projekt s vlastitim adresiranjem. Opći dijagram rada mreže u Yandex.Cloudu prikazan je na donjoj slici (iskreno preuzeto iz https://cloud.yandex.ru/docs/vpc/concepts/)

Prihvaćamo 10 000 događaja u Yandex.Cloudu. 1. dio

Dakle, stvarate zajedničku mrežu unutar koje resursi mogu međusobno komunicirati. Za svaku zonu dostupnosti stvara se podmreža s vlastitim adresiranjem i povezuje se s općom mrežom. Kao rezultat toga, svi resursi oblaka u njemu mogu komunicirati, čak i ako su u različitim zonama dostupnosti. Resursi povezani na različite mreže u oblaku mogu vidjeti jedni druge samo putem vanjskih adresa. Usput, kako ova magija djeluje unutra, je dobro opisano na Habréu.

Stvaranje mreže opisano je u datoteci network.tf iz repozitorija. Tamo stvaramo jednu zajedničku privatnu internu mrežu i na nju povezujemo tri podmreže u različitim zonama dostupnosti - interna-a (172.16.1.0/24), interna-b (172.16.2.0/24), interna-c (172.16.3.0/24 ).

Inicijalizirajte terraform i stvorite mreže:

vozerov@mba:~/events/terraform (master) $ terraform init
... skipped ..

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_vpc_subnet.internal-a -target yandex_vpc_subnet.internal-b -target yandex_vpc_subnet.internal-c

... skipped ...

Plan: 4 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

yandex_vpc_network.internal: Creating...
yandex_vpc_network.internal: Creation complete after 3s [id=enp2g2rhile7gbqlbrkr]
yandex_vpc_subnet.internal-a: Creating...
yandex_vpc_subnet.internal-b: Creating...
yandex_vpc_subnet.internal-c: Creating...
yandex_vpc_subnet.internal-a: Creation complete after 6s [id=e9b1dad6mgoj2v4funog]
yandex_vpc_subnet.internal-b: Creation complete after 7s [id=e2liv5i4amu52p64ac9p]
yandex_vpc_subnet.internal-c: Still creating... [10s elapsed]
yandex_vpc_subnet.internal-c: Creation complete after 10s [id=b0c2qhsj2vranoc9vhcq]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Sjajno! Stvorili smo našu mrežu i sada smo spremni za stvaranje naših internih usluga.

Stvorite virtualne strojeve

Za testiranje aplikacije trebat ćemo samo izraditi dva virtualna računala – prvo će nam trebati za izgradnju i pokretanje aplikacije, drugo za pokretanje kafke koju ćemo koristiti za pohranjivanje pristiglih poruka. Napravit ćemo još jedan stroj na kojem ćemo konfigurirati prometheus da nadzire aplikaciju.

Virtualni strojevi bit će konfigurirani pomoću ansiblea, stoga prije pokretanja terraforma provjerite imate li jednu od najnovijih verzija ansiblea. I instalirajte potrebne uloge s ansible galaxy:

vozerov@mba:~/events/terraform (master) $ cd ../ansible/
vozerov@mba:~/events/ansible (master) $ ansible-galaxy install -r requirements.yml
- cloudalchemy-prometheus (master) is already installed, skipping.
- cloudalchemy-grafana (master) is already installed, skipping.
- sansible.kafka (master) is already installed, skipping.
- sansible.zookeeper (master) is already installed, skipping.
- geerlingguy.docker (master) is already installed, skipping.
vozerov@mba:~/events/ansible (master) $

Unutar mape ansible nalazi se primjer konfiguracijske datoteke .ansible.cfg koju koristim. Moglo bi dobro doći.

Prije kreiranja virtualnih strojeva provjerite je li pokrenut ssh-agent i dodan ssh ključ, inače se terraform neće moći spojiti na stvorene strojeve. Naravno, naišao sam na grešku u OS X: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Kako biste spriječili da se ovo opet dogodi, dodajte malu varijablu u env prije pokretanja Terraforma:

vozerov@mba:~/events/terraform (master) $ export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES

U mapi s terraformom stvaramo potrebne resurse:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_compute_instance.build -target yandex_compute_instance.monitoring -target yandex_compute_instance.kafka
yandex_vpc_network.internal: Refreshing state... [id=enp2g2rhile7gbqlbrkr]
data.yandex_compute_image.ubuntu_image: Refreshing state...
yandex_vpc_subnet.internal-a: Refreshing state... [id=e9b1dad6mgoj2v4funog]

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

... skipped ...

Plan: 3 to add, 0 to change, 0 to destroy.

... skipped ...

Ako je sve uspješno završilo (a trebalo bi biti), tada ćemo imati tri virtualna računala:

  1. build - stroj za testiranje i izgradnju aplikacije. Docker je automatski instalirao Ansible.
  2. monitoring - stroj za nadzor - prometheus & grafana instaliran na njemu. Standardna prijava / lozinka: admin / admin
  3. kafka je mali stroj s instaliranom kafkom, dostupan na portu 9092.

Provjerimo jesu li sve na mjestu:

vozerov@mba:~/events (master) $ yc compute instance list
+----------------------+------------+---------------+---------+---------------+-------------+
|          ID          |    NAME    |    ZONE ID    | STATUS  |  EXTERNAL IP  | INTERNAL IP |
+----------------------+------------+---------------+---------+---------------+-------------+
| fhm081u8bkbqf1pa5kgj | monitoring | ru-central1-a | RUNNING | 84.201.159.71 | 172.16.1.35 |
| fhmf37k03oobgu9jmd7p | kafka      | ru-central1-a | RUNNING | 84.201.173.41 | 172.16.1.31 |
| fhmt9pl1i8sf7ga6flgp | build      | ru-central1-a | RUNNING | 84.201.132.3  | 172.16.1.26 |
+----------------------+------------+---------------+---------+---------------+-------------+

Resursi su na mjestu i odavde možemo dobiti njihove IP adrese. U nastavku ću koristiti IP adrese za povezivanje putem ssh-a i testiranje aplikacije. Ako imate cloudflare račun povezan s terraformom, slobodno koristite svježe stvorena DNS imena.
Usput, prilikom kreiranja virtualnog stroja daju se interni IP i interni DNS naziv, tako da možete pristupiti poslužiteljima unutar mreže po imenu:

ubuntu@build:~$ ping kafka.ru-central1.internal
PING kafka.ru-central1.internal (172.16.1.31) 56(84) bytes of data.
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=1 ttl=63 time=1.23 ms
64 bytes from kafka.ru-central1.internal (172.16.1.31): icmp_seq=2 ttl=63 time=0.625 ms
^C
--- kafka.ru-central1.internal ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.625/0.931/1.238/0.308 ms

Ovo će nam biti korisno da aplikaciji naznačimo krajnju točku pomoću kafk.

Sastavljanje aplikacije

Super, postoje serveri, postoji aplikacija - još samo ju složiti i objaviti. Za izgradnju koristit ćemo uobičajenu docker izgradnju, ali kao pohranu slika koristit ćemo uslugu iz Yandexa - registar spremnika. Ali prvo o svemu.

Kopiramo aplikaciju na build stroj, logiramo se preko ssh-a i asembleramo sliku:

vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ [email protected]:app/

... skipped ...

sent 3849 bytes  received 70 bytes  7838.00 bytes/sec
total size is 3644  speedup is 0.93

vozerov@mba:~/events (master) $ ssh 84.201.132.3 -l ubuntu
ubuntu@build:~$ cd app
ubuntu@build:~/app$ sudo docker build -t app .
Sending build context to Docker daemon  6.144kB
Step 1/9 : FROM golang:latest AS build
... skipped ...

Successfully built 9760afd8ef65
Successfully tagged app:latest

Pola bitke je gotovo - sada možemo provjeriti funkcionalnost naše aplikacije tako da je pokrenemo i pošaljemo kafki:

ubuntu@build:~/app$ sudo docker run --name app -d -p 8080:8080 app /app/app -kafka=kafka.ru-central1.internal:9092</code>

С локальной машинки можно отправить тестовый event и посмотреть на ответ:

<code>vozerov@mba:~/events (master) $ curl -D - -s -X POST -d '{"key1":"data1"}' http://84.201.132.3:8080/post
HTTP/1.1 200 OK
Content-Type: application/json
Date: Mon, 13 Apr 2020 13:53:54 GMT
Content-Length: 41

{"status":"ok","partition":0,"Offset":0}
vozerov@mba:~/events (master) $

Aplikacija je odgovorila s uspjehom snimanja i navođenjem ID-a particije i offseta u kojem je poruka bila uključena. Sve što je preostalo učiniti je stvoriti registar u Yandex.Cloudu i tamo prenijeti našu sliku (kako to učiniti pomoću tri retka opisano je u datoteci registry.tf). Stvorite pohranu:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_container_registry.events

... skipped ...

Plan: 1 to add, 0 to change, 0 to destroy.

... skipped ...

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Postoji nekoliko načina za autentifikaciju u registru spremnika - pomoću tokena oauth, tokena iam ili ključa računa usluge. Više detalja o ovim metodama možete pronaći u dokumentaciji. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Koristit ćemo ključ računa usluge, pa kreiramo račun:

vozerov@mba:~/events/terraform (master) $ terraform apply -target yandex_iam_service_account.docker -target yandex_resourcemanager_folder_iam_binding.puller -target yandex_resourcemanager_folder_iam_binding.pusher

... skipped ...

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Sada preostaje samo napraviti ključ za to:

vozerov@mba:~/events/terraform (master) $ yc iam key create --service-account-name docker -o key.json
id: ajej8a06kdfbehbrh91p
service_account_id: ajep6d38k895srp9osij
created_at: "2020-04-13T14:00:30Z"
key_algorithm: RSA_2048

Dobivamo informaciju o id-u našeg skladišta, prenosimo ključ i logiramo se:

vozerov@mba:~/events/terraform (master) $ scp key.json [email protected]:
key.json                                                                                                                    100% 2392   215.1KB/s   00:00

vozerov@mba:~/events/terraform (master) $ ssh 84.201.132.3 -l ubuntu

ubuntu@build:~$ cat key.json | sudo docker login --username json_key --password-stdin cr.yandex
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
ubuntu@build:~$

Za prijenos slike u registar potreban nam je ID registra spremnika, preuzimamo ga iz uslužnog programa yc:

vozerov@mba:~ $ yc container registry get events
id: crpdgj6c9umdhgaqjfmm
folder_id:
name: events
status: ACTIVE
created_at: "2020-04-13T13:56:41.914Z"

Nakon toga, našu sliku označimo novim imenom i učitamo:

ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946

Možemo potvrditi da se slika uspješno učitala:

vozerov@mba:~/events/terraform (master) $ yc container repository list
+----------------------+-----------------------------+
|          ID          |            NAME             |
+----------------------+-----------------------------+
| crpe8mqtrgmuq07accvn | crpdgj6c9umdhgaqjfmm/events |
+----------------------+-----------------------------+

Usput, ako instalirate uslužni program yc na Linux stroj, možete koristiti naredbu

yc container registry configure-docker

za konfiguriranje dockera.

Zaključak

Obavili smo puno napornog rada i kao rezultat toga:

  1. Osmislili smo arhitekturu naše buduće usluge.
  2. Napisali smo aplikaciju u golangu koja implementira našu poslovnu logiku.
  3. Sakupili smo ga i pretočili u privatni registar kontejnera.

U sljedećem dijelu ćemo prijeći na zanimljive stvari - pustiti ćemo našu aplikaciju u produkciju i konačno pokrenuti njeno učitavanje. Ne mijenjaj se!

Ovaj materijal je u video zapisu otvorene radionice REBRAIN & Yandex.Cloud: Prihvaćamo 10 000 zahtjeva u sekundi na Yandex Cloudu - https://youtu.be/cZLezUm0ekE

Ako ste zainteresirani za prisustvovanje takvim događajima online i postavljanje pitanja u stvarnom vremenu, povežite se na kanal DevOps by REBRAIN.

Željeli bismo posebno zahvaliti Yandex.Cloudu na prilici da ugostimo ovakav događaj. Link na njih - https://cloud.yandex.ru/prices

Ako se trebate preseliti u oblak ili imate pitanja o svojoj infrastrukturi, slobodno ostavite zahtjev.

PS Imamo 2 besplatne revizije mjesečno, možda će vaš projekt biti jedna od njih.

Izvor: www.habr.com

Dodajte komentar