Akceptujeme 10 000 udalostí v Yandex.Cloud. Časť 1

Ahojte všetci, priatelia!

* Tento článok je založený na otvorenom workshope REBRAIN & Yandex.Cloud, ak si radšej pozriete video, nájdete ho na tomto odkaze - https://youtu.be/cZLezUm0ekE

Nedávno sme mali možnosť vyskúšať si Yandex.Cloud naživo. Keďže sme chceli skúmať dlho a tvrdo, okamžite sme opustili myšlienku spustenia jednoduchého blogu Wordpress s cloudovou základňou - bolo to príliš nudné. Po krátkom premýšľaní sme sa rozhodli nasadiť niečo podobné ako architektúra produkčných služieb na príjem a analýzu udalostí v režime takmer v reálnom čase.

Som si úplne istý, že drvivá väčšina online (nielen) firiem nejakým spôsobom zbiera kopec informácií o svojich užívateľoch a ich činoch. Minimálne je to potrebné pre určité rozhodnutia – ak napríklad spravujete online hru, môžete si pozrieť štatistiky, na akej úrovni sa používatelia najčastejšie zaseknú a vašu hračku vymažú. Alebo prečo používatelia opúšťajú vaše stránky bez toho, aby si niečo kúpili (ahoj, Yandex.Metrica).

Takže náš príbeh: ako sme napísali aplikáciu v golangu, otestovali kafka vs rabbitmq vs yqs, napísali streamovanie dát v klastri Clickhouse a vizualizovali dáta pomocou yandex datalens. Prirodzene, toto všetko bolo okorenené infraštruktúrnymi pôžitkami v podobe docker, terraform, gitlab ci a samozrejme prometheus. Poďme!

Chcel by som okamžite urobiť výhradu, že nebudeme môcť všetko nakonfigurovať na jedno sedenie - na to budeme potrebovať niekoľko článkov v sérii. Trochu o štruktúre:

1. časť (čítate ju). Rozhodneme o špecifikáciách a architektúre riešenia a tiež napíšeme aplikáciu v golangu.
Časť 2. Uvoľňujeme našu aplikáciu do produkcie, robíme ju škálovateľnou a testujeme záťaž.
Časť 3. Pokúsme sa prísť na to, prečo musíme správy ukladať do vyrovnávacej pamäte a nie do súborov, a tiež porovnajme službu fronty kafka, rabbitmq a yandex.
4. časť Nasadíme Clickhouse cluster, napíšeme streamovaciu službu na prenos dát z tam buffera a nastavíme vizualizáciu v datalens.
5. časť Uveďme celú infraštruktúru do správneho tvaru – nastavte ci/cd pomocou gitlab ci, prepojte monitorovanie a vyhľadávanie služieb pomocou prometheus a consul.

TK

Najprv si sformulujme zadávacie podmienky – čo presne chceme ako výsledok získať.

  1. Chceme mať koncový bod ako events.kis.im (kis.im je testovacia doména, ktorú budeme používať vo všetkých článkoch), ktorý by mal prijímať udalosti pomocou HTTPS.
  2. Udalosti sú jednoduchý súbor json ako: {“udalosť“: „zobraziť“, „os“: „linux“, „prehliadač“: „chrome“}. V záverečnej fáze pridáme trochu viac polí, ale to nebude hrať veľkú úlohu. Ak chcete, môžete prejsť na protobuf.
  3. Služba musí byť schopná spracovať 10 000 udalostí za sekundu.
  4. Malo by byť možné horizontálne škálovať jednoduchým pridaním nových inštancií do nášho riešenia. A bolo by pekné, keby sme mohli presunúť prednú časť do rôznych geolokácií, aby sme znížili latenciu požiadaviek klientov.
  5. Odolnosť proti chybám. Riešenie musí byť dostatočne stabilné a schopné prežiť pád akýchkoľvek častí (samozrejme do určitého počtu).

architektúra

Vo všeobecnosti sú pre tento typ úloh už dlho vynájdené klasické architektúry, ktoré umožňujú efektívne škálovanie. Obrázok ukazuje príklad nášho riešenia.

Akceptujeme 10 000 udalostí v Yandex.Cloud. Časť 1

Takže čo máme:

1. Vľavo sú naše zariadenia, ktoré generujú rôzne udalosti, či už hráči dokončujú úroveň v hračke na smartfóne alebo vytvárajú objednávku v internetovom obchode cez bežný prehliadač. Udalosť, ako je uvedené v špecifikácii, je jednoduchý súbor json, ktorý sa odošle do nášho koncového bodu – events.kis.im.

2. Prvé dva servery sú jednoduché balancéry, ich hlavné úlohy sú:

  • Buďte neustále k dispozícii. Na to môžete použiť napríklad keepalived, ktorý v prípade problémov prepne virtuálnu IP medzi uzlami.
  • Ukončiť TLS. Áno, ukončíme na nich TLS. Po prvé, aby naše riešenie vyhovovalo technickým špecifikáciám, a po druhé, aby sme odbremenili nadväzovanie šifrovaného spojenia z našich backend serverov.
  • Vyvážte prichádzajúce požiadavky na dostupné backend servery. Kľúčové slovo je tu dostupné. Na základe toho sme dospeli k pochopeniu, že nástroje na vyvažovanie záťaže musia byť schopné monitorovať naše servery pomocou aplikácií a zastaviť vyvažovanie prevádzky na zlyhané uzly.

3. Po balancéroch tu máme aplikačné servery, na ktorých beží celkom jednoduchá aplikácia. Mal by byť schopný prijímať prichádzajúce požiadavky cez HTTP, overovať odoslaný json a ukladať dáta do vyrovnávacej pamäte.

4. Diagram zobrazuje kafku ako vyrovnávaciu pamäť, aj keď samozrejme na tejto úrovni možno použiť aj iné podobné služby. Kafku, rabbitmq a yqs porovnáme v treťom článku.

5. Predposledným bodom našej architektúry je Clickhouse – stĺpcová databáza, ktorá umožňuje uchovávať a spracovávať obrovské množstvo dát. Na tejto úrovni potrebujeme preniesť dáta z vyrovnávacej pamäte do samotného úložného systému (viac o tom v článku 4).

Tento dizajn nám umožňuje škálovať každú vrstvu nezávisle horizontálne. Backendové servery si nevedia poradiť – dodajme ešte jednu vec – ide predsa o bezstavové aplikácie, a preto sa to dá robiť aj automaticky. Vyrovnávacia pamäť v štýle Kafka nefunguje – pridajte ďalšie servery a preneste na ne niektoré časti našej témy. Clickhouse to nezvládne – je to nemožné :) V skutočnosti tiež pripojíme servery a údaje rozdelíme.

Mimochodom, ak chcete implementovať voliteľnú časť našich technických špecifikácií a mierky v rôznych geolokáciách, potom nie je nič jednoduchšie:

Akceptujeme 10 000 udalostí v Yandex.Cloud. Časť 1

V každej geolokácii nasadíme load balancer s aplikáciou a kafkou. Vo všeobecnosti stačia 2 aplikačné servery, 3 kafka uzly a cloud balancer, napríklad cloudflare, ktorý skontroluje dostupnosť aplikačných uzlov a vyrovná požiadavky podľa geolokácie na základe zdrojovej IP adresy klienta. Dáta odoslané americkým klientom tak pristanú na amerických serveroch. A údaje z Afriky sú v Afrike.

Potom je už všetko celkom jednoduché – používame zrkadlový nástroj zo sady Kafka a kopírujeme všetky dáta zo všetkých lokalít do nášho centrálneho dátového centra v Rusku. Interne analyzujeme dáta a zaznamenávame ich v Clickhouse pre následnú vizualizáciu.

Takže sme vyriešili architektúru - začnime triasť Yandex.Cloud!

Písanie aplikácie

Pred Cloudom musíte byť ešte trochu trpezlivý a napísať celkom jednoduchú službu na spracovanie prichádzajúcich udalostí. Budeme používať golang, pretože sa veľmi dobre osvedčil ako jazyk na písanie sieťových aplikácií.

Po hodine (možno niekoľkých hodinách) dostaneme niečo takéto: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Aké sú hlavné body, ktoré by som tu rád poznamenal:

1. Pri spustení aplikácie môžete určiť dva príznaky. Jeden je zodpovedný za port, na ktorom budeme počúvať prichádzajúce http požiadavky (-addr). Druhá je pre adresu servera kafka, kde budeme zaznamenávať naše udalosti (-kafka):

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

2. Aplikácia používa knižnicu sarama ([] github.com/Shopify/sarama) na odosielanie správ do klastra kafka. Okamžite nastavíme nastavenia zamerané na maximálnu rýchlosť spracovania:

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

3. Naša aplikácia má tiež zabudovaného klienta prometheus, ktorý zbiera rôzne metriky, ako napríklad:

  • počet žiadostí do našej aplikácie;
  • počet chýb pri vykonávaní požiadavky (nemožné prečítať požiadavku na príspevok, nefunkčný json, nemožnosť zapísať do Kafky);
  • doba spracovania jednej požiadavky od klienta vrátane času na napísanie správy Kafkovi.

4. Tri koncové body, ktoré naša aplikácia spracováva:

  • /status - jednoducho sa vráti ok, aby sme ukázali, že žijeme. Aj keď môžete pridať nejaké kontroly, ako napríklad dostupnosť klastra Kafka.
  • /metrics - podľa tejto adresy URL klient prometheus vráti metriky, ktoré nazbieral.
  • /post je hlavný koncový bod, kam sa budú odosielať požiadavky POST s json vnútri. Naša aplikácia skontroluje platnosť json a ak je všetko v poriadku, zapíše údaje do klastra Kafka.

Urobím výhradu, že kód nie je dokonalý - môže (a mal by!) byť dokončený. Môžete napríklad prestať používať vstavaný net/http a prejsť na rýchlejší fasthttp. Alebo môžete získať čas spracovania a zdroje procesora presunutím kontroly platnosti json do neskoršej fázy - keď sa údaje prenesú z vyrovnávacej pamäte do klastra clickhouse.

Okrem vývojovej stránky problému sme okamžite mysleli aj na našu budúcu infraštruktúru a rozhodli sme sa nasadiť našu aplikáciu cez docker. Konečným súborom Dockerfile na zostavenie aplikácie je https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Vo všeobecnosti je to celkom jednoduché, jediný bod, ktorému by som chcel venovať pozornosť, je viacstupňová montáž, ktorá nám umožňuje zmenšiť konečný obraz nášho kontajnera.

Prvé kroky v cloude

V prvom rade sa zaregistrujte cloud.yandex.ru. Po vyplnení všetkých potrebných polí nám bude vytvorený účet a pridelený grant na určitú sumu peňazí, ktoré je možné použiť na testovanie cloudových služieb. Ak si chcete zopakovať všetky kroky z nášho článku, tento grant by vám mal stačiť.

Po registrácii sa vám vytvorí samostatný cloud a predvolený adresár, v ktorom môžete začať vytvárať cloudové zdroje. Vo všeobecnosti v Yandex.Cloud vyzerá vzťah zdrojov takto:

Akceptujeme 10 000 udalostí v Yandex.Cloud. Časť 1

Pre jeden účet môžete vytvoriť niekoľko cloudov. A v rámci cloudu vytvorte rôzne adresáre pre rôzne firemné projekty. Viac o tom si môžete prečítať v dokumentácii - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Mimochodom, budem sa na to často odvolávať nižšie v texte. Keď som nastavil celú infraštruktúru od nuly, dokumentácia mi pomohla viac ako raz, takže vám odporúčam, aby ste si ju preštudovali.

Na správu cloudu môžete použiť webové rozhranie aj utilitu konzoly - yc. Inštalácia sa vykonáva jedným príkazom (pre Linux a Mac OS):

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

Ak váš interný bezpečnostný špecialista zúri v spúšťaní skriptov z internetu, tak po prvé, môžete skript otvoriť a prečítať, a po druhé, spustíme ho pod naším používateľom – bez práv root.

Ak chcete nainštalovať klienta pre Windows, môžete použiť pokyny tu a potom vykonať yc initúplne prispôsobiť:

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:~ $

V princípe je proces jednoduchý – najprv je potrebné získať oauth token na správu cloudu, vybrať cloud a priečinok, ktorý budete používať.

Ak máte niekoľko účtov alebo priečinkov v rámci toho istého cloudu, môžete vytvoriť ďalšie profily so samostatnými nastaveniami prostredníctvom vytvorenia profilu yc config a prepínať medzi nimi.

Okrem vyššie uvedených metód napísal tím Yandex.Cloud veľmi dobrý plugin pre Terraform pre správu cloudových zdrojov. Z mojej strany som pripravil git repozitár, kde som opísal všetky zdroje, ktoré budú vytvorené ako súčasť článku - https://github.com/rebrainme/yandex-cloud-events/. Máme záujem o hlavnú vetvu, naklonujme ju lokálne:


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/

Všetky hlavné premenné, ktoré sa používajú v terraforme, sú zapísané v súbore main.tf. Ak chcete začať, vytvorte súbor private.auto.tfvars v priečinku terraform s nasledujúcim obsahom:

# 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 = ""

Všetky premenné je možné prevziať zo zoznamu konfigurácií yc, pretože sme už nakonfigurovali pomôcku konzoly. Odporúčam vám okamžite pridať private.auto.tfvars do .gitignore, aby ste náhodou nezverejnili súkromné ​​údaje.

V private.auto.tfvars sme tiež špecifikovali údaje z Cloudflare - na vytvorenie DNS záznamov a proxy hlavnej domény events.kis.im na naše servery. Ak nechcete používať cloudflare, odstráňte inicializáciu poskytovateľa cloudflare v main.tf a súbor dns.tf, ktorý je zodpovedný za vytvorenie potrebných záznamov dns.

V našej práci skombinujeme všetky tri metódy – webové rozhranie, konzolovú utilitu a terraform.

Virtuálne siete

Úprimne povedané, tento krok môžete preskočiť, pretože keď vytvoríte nový cloud, automaticky sa vám vytvorí samostatná sieť a 3 podsiete – jedna pre každú zónu dostupnosti. Ale aj tak by sme pre náš projekt chceli urobiť samostatnú sieť s vlastným adresovaním. Všeobecná schéma fungovania siete v Yandex.Cloud je znázornená na obrázku nižšie (úprimne prevzaté z https://cloud.yandex.ru/docs/vpc/concepts/)

Akceptujeme 10 000 udalostí v Yandex.Cloud. Časť 1

Takže vytvoríte spoločnú sieť, v rámci ktorej môžu zdroje navzájom komunikovať. Pre každú zónu dostupnosti sa vytvorí podsieť s vlastným adresovaním a pripojí sa k všeobecnej sieti. Vďaka tomu môžu všetky cloudové zdroje v ňom komunikovať, aj keď sú v rôznych zónach dostupnosti. Zdroje pripojené k rôznym cloudovým sieťam sa môžu navzájom vidieť iba prostredníctvom externých adries. Mimochodom, ako táto mágia funguje vo vnútri, bol dobre opísaný na Habré.

Vytvorenie siete je popísané v súbore network.tf z úložiska. Tam vytvoríme jednu spoločnú privátnu sieť internú a pripojíme k nej tri podsiete v rôznych zónach dostupnosti - interná-a (172.16.1.0/24), interná-b (172.16.2.0/24), interná-c (172.16.3.0/24 ).

Inicializujte terraform a vytvorte siete:

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.

Skvelé! Vytvorili sme našu sieť a teraz sme pripravení vytvoriť naše interné služby.

Vytváranie virtuálnych strojov

Na testovanie aplikácie nám bude stačiť vytvoriť dva virtuálne stroje – prvý budeme potrebovať na zostavenie a spustenie aplikácie, druhý na spustenie kafka, ktorý použijeme na ukladanie prichádzajúcich správ. A vytvoríme ďalší stroj, kde nakonfigurujeme prometheus na monitorovanie aplikácie.

Virtuálne počítače budú nakonfigurované pomocou ansible, takže pred spustením terraformu sa uistite, že máte jednu z najnovších verzií ansible. A nainštalujte potrebné role s ansible galaxiou:

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) $

V priečinku ansible je príklad konfiguračného súboru .ansible.cfg, ktorý používam. Môže sa to hodiť.

Pred vytvorením virtuálnych počítačov sa uistite, že máte spusteného agenta ssh a pridaný kľúč ssh, inak sa terraform nebude môcť pripojiť k vytvoreným počítačom. Samozrejme som narazil na chybu v OS x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Aby sa to neopakovalo, pred spustením Terraformu pridajte do env malú premennú:

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

V priečinku s terraformom vytvoríme potrebné zdroje:

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 ...

Ak všetko skončilo úspešne (a malo by byť), potom budeme mať tri virtuálne stroje:

  1. build – stroj na testovanie a zostavovanie aplikácie. Docker bol nainštalovaný automaticky spoločnosťou Ansible.
  2. monitoring - na ňom nainštalovaný monitorovací stroj - prometheus & grafana. Štandardné prihlasovacie meno / heslo: admin / admin
  3. kafka je malý stroj s nainštalovanou kafkou, prístupný na porte 9092.

Uistite sa, že sú všetky na svojom mieste:

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 |
+----------------------+------------+---------------+---------+---------------+-------------+

Zdroje sú na mieste a odtiaľto môžeme získať ich IP adresy. V nasledujúcom texte budem používať IP adresy na pripojenie cez ssh a testovanie aplikácie. Ak máte účet cloudflare pripojený k terraformu, pokojne použite čerstvo vytvorené názvy DNS.
Mimochodom, pri vytváraní virtuálneho počítača sa zadáva interná IP a interný názov DNS, takže môžete pristupovať k serverom v sieti podľa názvu:

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

Bude to pre nás užitočné, aby sme aplikácii označili koncový bod s kafk.

Zostavenie aplikácie

Skvelé, existujú servery, existuje aplikácia - zostáva len zostaviť a zverejniť. Na zostavenie použijeme obvyklú zostavu dockerov, ale ako úložisko obrázkov použijeme službu od Yandex - register kontajnerov. Ale prvé veci.

Skopírujeme aplikáciu do zostavovacieho stroja, prihlásime sa cez ssh a zostavíme obrázok:

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

Polovica bitky je hotová - teraz môžeme skontrolovať funkčnosť našej aplikácie jej spustením a odoslaním do kafka:

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) $

Aplikácia odpovedala úspešnosťou záznamu a uvedením ID oddielu a posunu, v ktorom bola správa zahrnutá. Zostáva len vytvoriť register v Yandex.Cloud a nahrať tam náš obrázok (ako to urobiť pomocou troch riadkov je popísané v súbore registry.tf). Vytvorte úložisko:

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.

Existuje niekoľko spôsobov autentifikácie v registri kontajnerov – pomocou tokenu auth, tokenu iam alebo kľúča účtu služby. Viac podrobností o týchto metódach nájdete v dokumentácii. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Použijeme kľúč servisného účtu, preto vytvoríme účet:

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.

Teraz už zostáva len vytvoriť kľúč:

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

Dostaneme informácie o ID nášho úložiska, prenesieme kľúč a prihlásime sa:

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:~$

Ak chcete nahrať obrázok do registra, potrebujeme ID registra kontajnera, berieme ho z pomôcky yc:

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

Potom označíme náš obrázok novým názvom a nahráme:

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

Môžeme overiť, či sa obrázok úspešne načítal:

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

Mimochodom, ak nainštalujete nástroj yc na počítač so systémom Linux, môžete použiť príkaz

yc container registry configure-docker

na konfiguráciu dockeru.

Záver

Urobili sme veľa tvrdej práce a výsledkom je:

  1. Prišli sme s architektúrou našej budúcej služby.
  2. Napísali sme aplikáciu v golangu, ktorá implementuje našu obchodnú logiku.
  3. Zozbierali sme to a naliali do súkromnej registra kontajnerov.

V ďalšej časti prejdeme k zaujímavostiam – uvoľníme našu aplikáciu do produkcie a nakoniec ju spustíme. Neprepínajte sa!

Tento materiál je vo videozázname otvorenej dielne REBRAIN & Yandex.Cloud: Na Yandex Cloud prijímame 10 000 žiadostí za sekundu - https://youtu.be/cZLezUm0ekE

Ak máte záujem zúčastniť sa takýchto podujatí online a klásť otázky v reálnom čase, pripojte sa na kanál DevOps od REBRAIN.

Radi by sme sa špeciálne poďakovali spoločnosti Yandex.Cloud za možnosť usporiadať takúto udalosť. Odkaz na ne - https://cloud.yandex.ru/prices

Ak potrebujete prejsť do cloudu alebo máte otázky týkajúce sa vašej infraštruktúry, pokojne zanechajte žiadosť.

PS Máme 2 bezplatné audity mesačne, možno aj váš projekt bude jedným z nich.

Zdroj: hab.com

Pridať komentár