Prihvatamo 10 događaja u Yandex.Cloud. Dio 000

Pozdrav svima, prijatelji!

* Ovaj članak je baziran na otvorenoj radionici REBRAIN & Yandex.Cloud, ako želite da pogledate video, možete ga pronaći na ovom linku - https://youtu.be/cZLezUm0ekE

Nedavno smo imali priliku isprobati Yandex.Cloud uživo. Pošto smo hteli da ispitujemo dugo i naporno, odmah smo odustali od ideje da pokrenemo jednostavan Wordpress blog sa bazom oblaka - bilo je previše dosadno. Nakon nekog razmišljanja, odlučili smo da implementiramo nešto slično arhitekturi produkcijske usluge za primanje i analizu događaja u režimu skoro realnog vremena.

Apsolutno sam siguran da velika većina online (i ne samo) preduzeća na neki način prikuplja brdo informacija o svojim korisnicima i njihovim akcijama. To je u najmanju ruku neophodno za donošenje određenih odluka – na primjer, ako upravljate online igrom, možete pogledati statistiku na kojoj razini korisnici najčešće zaglave i izbrišu vašu igračku. Ili zašto korisnici napuštaju vašu web lokaciju a da ništa nisu kupili (zdravo, Yandex.Metrica).

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

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

Prvi dio (čitate ga). Odlučit ćemo se o specifikacijama i arhitekturi rješenja, a također ćemo napisati aplikaciju na golangu.
Dio 2. 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 uporedimo kafka, rabbitmq i yandex servis redova čekanja.
dio 4 Mi ćemo postaviti Clickhouse klaster, napisati streaming servis za prijenos podataka iz bafera tamo i postaviti vizualizaciju u datalensu.
dio 5 Dovedite cijelu infrastrukturu u pravi oblik - postavite ci/cd koristeći gitlab ci, povežite praćenje i otkrivanje servisa koristeći prometheus i consul.

TK

Prvo, hajde da formulišemo zadatak - šta tačno želimo da dobijemo kao rezultat.

  1. Želimo imati krajnju tačku kao što je events.kis.im (kis.im je test 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 biti u mogućnosti da obradi 10 događaja u sekundi.
  4. Trebalo bi biti moguće horizontalno 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. Tolerancije grešaka. Rješenje mora biti dovoljno stabilno i sposobno preživjeti pad bilo kojeg dijela (naravno do određenog broja).

arhitektura

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

Prihvatamo 10 događaja u Yandex.Cloud. Dio 000

Dakle, šta imamo:

1. Na lijevoj strani su naši uređaji koji generiraju razne događaje, bilo da igrači završavaju nivo u igrački na pametnom telefonu ili kreiraju narudžbu u online trgovini putem običnog pretraživača. Događaj, kako je navedeno u specifikaciji, je jednostavan json koji se šalje našoj krajnjoj tački - events.kis.im.

2. Prva dva servera 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, prekinut ćemo TLS na njima. Prvo, kako bi naše rješenje bilo u skladu sa tehničkim specifikacijama, a drugo, kako bi se rasteretilo uspostavljanje šifrirane veze sa naših backend servera.
  • Uravnotežite dolazne zahtjeve prema dostupnim backend serverima. Ključna riječ ovdje je dostupna. Na osnovu toga dolazimo do shvaćanja da balanseri opterećenja moraju biti u mogućnosti da nadgledaju naše servere sa aplikacijama i zaustavljaju balansiranje prometa prema neuspjelim čvorovima.

3. Nakon balansera, imamo servere aplikacija koji pokreću prilično jednostavnu aplikaciju. Trebao bi biti u mogućnosti prihvatiti dolazne zahtjeve putem HTTP-a, potvrditi poslani json i staviti podatke u bafer.

4. Dijagram prikazuje kafku kao bafer, iako se, naravno, na ovom nivou mogu koristiti i drugi slični servisi. Uporedićemo Kafku, rabbitmq i yqs u trećem članku.

5. Pretposljednja tačka naše arhitekture je Clickhouse – stupasta baza podataka koja vam omogućava pohranjivanje i obradu ogromne količine podataka. Na ovom nivou, potrebno je da prenesemo podatke iz bafera u sam sistem skladištenja (više o tome u članku 4).

Ovaj dizajn nam omogućava da skaliramo svaki sloj nezavisno horizontalno. Backend serveri se ne mogu nositi - dodajmo još jednu stvar - na kraju krajeva, oni su aplikacije bez stanja, pa se to može učiniti čak i automatski. Međuspremnik u Kafkinom stilu ne radi – dodajmo još servera i prebacimo na njih neke od particija naše teme. Clickhouse to ne može podnijeti - nemoguće je :) Zapravo, spojit ćemo i servere i podijeliti podatke.

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

Prihvatamo 10 događaja u Yandex.Cloud. Dio 000

U svakoj geolokaciji postavljamo balansator opterećenja sa aplikacijom i kafkom. Generalno, dovoljna su 2 aplikacijska servera, 3 kafka čvora i cloud balanser, na primjer cloudflare, koji će provjeravati dostupnost aplikacijskih čvorova i balansnih zahtjeva geolokacijom na osnovu izvorne IP adrese klijenta. Tako će podaci koje pošalje američki klijent spustiti na američke servere. A podaci iz Afrike su na afričkom.

Onda je sve prilično jednostavno - koristimo alat za ogledalo iz Kafka seta i kopiramo sve podatke sa svih lokacija u naš centralni data centar koji se nalazi u Rusiji. Interno analiziramo podatke i snimamo ih u Clickhouse za naknadnu vizualizaciju.

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

Pisanje aplikacije

Prije Cloud-a, još uvijek morate biti malo strpljivi i napisati prilično jednostavan servis za obradu dolaznih događaja. Koristit ćemo golang jer se vrlo dobro pokazao kao jezik za pisanje mrežnih aplikacija.

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

Koje su glavne tačke koje bih ovdje htio napomenuti:

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 servera na koji ćemo snimati 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 biblioteku 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 pri izvršavanju zahtjeva (nemogućnost čitanja zahtjeva za post, neispravan json, nemoguće pisati Kafki);
  • vrijeme obrade jednog zahtjeva od klijenta, uključujući vrijeme za pisanje poruke Kafki.

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

  • /status - jednostavno vratite ok da pokažete 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 tačka na koju će se slati POST zahtjevi sa json unutra. Naša aplikacija provjerava valjanost json-a i ako je sve u redu, upisuje podatke u Kafka klaster.

Rezervirat ću da kod nije savršen - može (i treba!) biti popunjen. Na primjer, možete prestati koristiti ugrađeni net/http i prebaciti se na brži fasthttp. Ili možete dobiti vrijeme obrade i resurse procesora premještanjem json provjere valjanosti u kasniju fazu - kada se podaci prenesu iz bafera u klaster za klikanje.

Pored razvojne strane problema, odmah smo razmišljali o našoj budućoj infrastrukturi i odlučili da implementiramo našu aplikaciju putem docker-a. Konačni Dockerfile za izgradnju aplikacije je https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Općenito, prilično je jednostavno, jedina stvar na koju bih želio obratiti pažnju je višestepena montaža, koja nam omogućava da smanjimo konačnu sliku našeg kontejnera.

Prvi koraci u oblaku

Prije svega, registrirajte se cloud.yandex.ru. Nakon popunjavanja svih potrebnih polja, biće nam kreiran nalog i dodeljen nam je grant za određeni iznos novca koji se može koristiti za testiranje cloud servisa. Ako želite da ponovite sve korake iz našeg članka, ova stipendija bi vam trebala biti dovoljna.

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

Prihvatamo 10 događaja u Yandex.Cloud. Dio 000

Možete kreirati nekoliko oblaka za jedan nalog. I unutar oblaka napravite različite direktorije za različite projekte kompanije. Više o tome možete pročitati u dokumentaciji - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Inače, često ću se na to pozivati ​​niže u tekstu. Kada sam postavljao kompletnu infrastrukturu od nule, dokumentacija mi je više puta pomogla, pa savjetujem da je proučite.

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

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

Ako vaš stručnjak za internu sigurnost bjesni oko pokretanja skripti s Interneta, onda, prvo, možete otvoriti skriptu i pročitati je, a drugo, pokrećemo je pod našim korisnikom - bez root prava.

Ako želite da instalirate klijenta za Windows, možete koristiti uputstva ovdje a zatim izvršiti yc initda ga u potpunosti prilagodite:

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 morate nabaviti oauth token za upravljanje oblakom, odabrati oblak i mapu koju ćete koristiti.

Ako imate više naloga ili foldera unutar istog oblaka, možete kreirati dodatne profile sa zasebnim postavkama putem yc config profile create i prebacivati ​​se između njih.

Pored gore navedenih metoda, Yandex.Cloud tim je napisao vrlo dobro dodatak za terraform za upravljanje resursima u oblaku. Sa svoje strane, pripremio sam git repozitorijum, gde sam opisao sve resurse koji će biti kreirani u okviru članka - https://github.com/rebrainme/yandex-cloud-events/. Zanima nas master grana, hajde da je kloniramo 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 su zapisane u main.tf datoteci. Da biste započeli, kreirajte datoteku private.auto.tfvars u folderu 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 se mogu preuzeti sa yc config liste, pošto smo već konfigurisali uslužni program za konzolu. Savjetujem vam da odmah dodate private.auto.tfvars u .gitignore, kako slučajno ne biste objavili privatne podatke.

U private.auto.tfvars smo također specificirali podatke iz Cloudflare-a - za kreiranje DNS zapisa i proxy glavnog domena events.kis.im na naše servere. Ako ne želite da koristite cloudflare, uklonite inicijalizaciju cloudflare provajdera u main.tf i datoteku dns.tf, koja je odgovorna za kreiranje potrebnih dns zapisa.

U našem radu ćemo kombinovati sve tri metode - web interfejs, konzolni uslužni program i terraform.

Virtuelne mreže

Da budemo iskreni, mogli biste preskočiti ovaj korak, jer kada kreirate novi oblak, automatski ćete imati kreiranu zasebnu mrežu i 3 podmreže – po jednu za svaku zonu dostupnosti. Ali mi bismo ipak željeli napraviti zasebnu mrežu za naš projekat sa vlastitim adresiranjem. Opšti dijagram kako mreža radi u Yandex.Cloudu prikazan je na donjoj slici (iskreno preuzeto sa https://cloud.yandex.ru/docs/vpc/concepts/)

Prihvatamo 10 događaja u Yandex.Cloud. Dio 000

Dakle, stvarate zajedničku mrežu unutar koje resursi mogu međusobno komunicirati. Za svaku zonu dostupnosti kreira se podmreža sa sopstvenim adresiranjem i povezuje se na opštu mrežu. Kao rezultat toga, svi resursi oblaka u njemu mogu komunicirati, čak i ako se nalaze u različitim zonama dostupnosti. Resursi povezani na različite mreže u oblaku mogu se vidjeti samo preko vanjskih adresa. Usput, kako ova magija funkcionira unutra, je dobro opisan na Habréu.

Kreiranje mreže je opisano u datoteci network.tf iz spremišta. Tamo kreiramo 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 kreirajte 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.

Odlično! Stvorili smo našu mrežu i sada smo spremni za kreiranje naših internih usluga.

Kreiranje virtuelnih mašina

Da bismo testirali aplikaciju, trebaćemo samo da kreiramo dve virtuelne mašine – prva će nam trebati da napravimo i pokrenemo aplikaciju, druga da pokrenemo kafku, koju ćemo koristiti za skladištenje dolaznih poruka. I kreiraćemo još jednu mašinu na kojoj ćemo konfigurisati prometheusa da nadgleda aplikaciju.

Virtuelne mašine će biti konfigurisane pomoću ansible-a, tako da pre nego što započnete terraform, proverite da li imate jednu od najnovijih verzija ansible-a. I instalirajte potrebne uloge s ansible galaksijom:

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 ansible foldera nalazi se primjer konfiguracijske datoteke .ansible.cfg koju koristim. Moglo bi dobro doći.

Prije kreiranja virtuelnih mašina, uvjerite se da je pokrenut ssh-agent i da je dodat ssh ključ, inače terraform neće moći da se poveže sa kreiranim mašinama. Naravno, naišao sam na grešku u os x-u: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Kako biste spriječili da se ovo ponovi, dodajte malu varijablu u env prije pokretanja Terraforma:

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

U fascikli sa terraformom kreiramo 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 se sve završi uspješno (a trebalo bi), tada ćemo imati tri virtuelne mašine:

  1. build - mašina za testiranje i izgradnju aplikacije. Docker je automatski instalirao Ansible.
  2. monitoring - mašina za nadzor - prometheus & grafana instalirana na njoj. Standardna prijava/lozinka: admin/admin
  3. kafka je mala mašina sa instaliranom kafkom, dostupna na portu 9092.

Uvjerimo se da su svi na svom 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 svom 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 kreirana DNS imena.
Inače, prilikom kreiranja virtuelne mašine daje se interni IP i interno DNS ime, tako da možete pristupiti serverima 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 tačku pomoću kafk-a.

Sastavljanje aplikacije

Super, postoje serveri, postoji aplikacija - ostaje samo sastaviti je i objaviti. Za build ćemo koristiti uobičajenu docker build, ali kao skladište slika koristit ćemo uslugu iz Yandex - registra kontejnera. Ali prvo stvari.

Kopiramo aplikaciju na build mašinu, logujemo se preko ssh-a i sastavljamo 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 urađeno - sada možemo provjeriti funkcionalnost naše aplikacije pokretanjem i slanjem 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 sa uspjehom snimanja i naznakom ID-a particije i pomaka u koji je poruka uključena. Sve što je ostalo da uradite je da kreirate registar u Yandex.Cloud i tamo učitate našu sliku (kako to učiniti pomoću tri reda opisano je u datoteci registry.tf). Kreirajte skladište:

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 provjeru autentičnosti u registru kontejnera - korištenjem oauth tokena, iam tokena 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č servisnog računa, tako da 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 ostaje samo da napravite 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

Primamo informacije o ID-u naše pohrane, prenosimo ključ i prijavljujemo 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 učitavanje slike u registar, potreban nam je ID registra kontejnera, 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 je slika uspješno učitana:

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

Usput, ako instalirate yc uslužni program na Linux mašinu, možete koristiti naredbu

yc container registry configure-docker

da konfigurišete docker.

zaključak

Uradili smo mnogo napornog rada i kao rezultat toga:

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

U sljedećem dijelu ćemo prijeći na zanimljive stvari - pustit ćemo našu aplikaciju u proizvodnju i konačno pokrenuti opterećenje na njoj. Ne menjaj se!

Ovaj materijal se nalazi u video snimku otvorene radionice REBRAIN & Yandex.Cloud: Prihvatamo 10 zahtjeva u sekundi na Yandex Cloud - https://youtu.be/cZLezUm0ekE

Ako ste zainteresovani da prisustvujete takvim događajima online i postavljate pitanja u realnom vremenu, povežite se na DevOps po kanalu REBRAIN.

Želimo da se posebno zahvalimo Yandex.Cloud-u na prilici da budemo domaćini ovakvog događaja. Link do njih - https://cloud.yandex.ru/prices

Ako trebate preći na oblak ili imate pitanja o svojoj infrastrukturi, Slobodno podnesite zahtjev.

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

izvor: www.habr.com

Dodajte komentar