Mēs pieņemam 10 000 notikumu pakalpojumā Yandex.Cloud. 1. daļa

Sveiki visiem, draugi!

* Å is raksts ir balstÄ«ts uz REBRAIN & Yandex.Cloud atvērto darbnÄ«cu, ja vēlaties skatÄ«ties videoklipu, varat to atrast Å”ajā saitē - https://youtu.be/cZLezUm0ekE

Nesen mums bija iespēja izmēģināt Yandex.Cloud tieÅ”raidē. Tā kā mēs vēlējāmies ilgi un cÄ«tÄ«gi pētÄ«t, mēs nekavējoties atteicāmies no idejas izveidot vienkārÅ”u Wordpress emuāru ar mākoņu bāzi - tas bija pārāk garlaicÄ«gi. Pēc pārdomām mēs nolēmām izvietot kaut ko lÄ«dzÄ«gu ražoÅ”anas pakalpojuma arhitektÅ«rai, lai saņemtu un analizētu notikumus gandrÄ«z reāllaika režīmā.

Esmu pilnÄ«gi pārliecināts, ka lielākā daļa tieÅ”saistes (un ne tikai) uzņēmumu kaut kādā veidā savāc informācijas kalnu par saviem lietotājiem un viņu darbÄ«bām. Tas ir nepiecieÅ”ams vismaz noteiktu lēmumu pieņemÅ”anai ā€“ piemēram, ja pārvaldāt tieÅ”saistes spēli, varat apskatÄ«t statistiku, kurā lÄ«menÄ« lietotāji visbiežāk iestrēgst un izdzÄ“Å” jÅ«su rotaļlietu. Vai arÄ« kāpēc lietotāji pamet jÅ«su vietni, neko neiegādājoties (sveicināti, Yandex.Metrica).

Tātad, mÅ«su stāsts: kā mēs uzrakstÄ«jām lietojumprogrammu golangā, pārbaudÄ«jām kafka vs rabbitmq vs yqs, ierakstÄ«jām datu straumÄ“Å”anu Clickhouse klasterÄ« un vizualizējām datus, izmantojot yandex datu objektÄ«vus. Protams, tas viss tika papildināts ar infrastruktÅ«ras priekiem docker, terraform, gitlab ci un, protams, prometeja formā. Ejam!

Es gribētu nekavējoties izdarÄ«t atrunu, ka mēs nevarēsim konfigurēt visu vienā sēdē - Å”im nolÅ«kam mums bÅ«s nepiecieÅ”ami vairāki sērijas raksti. Nedaudz par struktÅ«ru:

1. daļa (jūs to lasāt). Mēs izlemsim par risinājuma specifikācijām un arhitektūru, kā arī uzrakstīsim pieteikumu golangā.
2. daļa. Mēs izlaižam savu lietojumprogrammu ražoÅ”anā, padarām to mērogojamu un pārbaudām slodzi.
3. daļa. Mēģināsim izdomāt, kāpēc ziņojumi jāglabā buferī, nevis failos, kā arī salīdzināt kafka, rabbitmq un yandex rindas pakalpojumu.
4. daļa Mēs izvietosim Clickhouse klasteru, uzrakstÄ«sim straumÄ“Å”anas pakalpojumu, lai pārsÅ«tÄ«tu datus no bufera, un iestatÄ«sim vizualizāciju datu objektos.
5. daļa Sakārtosim visu infrastruktÅ«ru ā€“ iestatÄ«sim ci/cd, izmantojot gitlab ci, savienosim uzraudzÄ«bu un pakalpojumu atklāŔanu, izmantojot Prometheus un Consul.

TK

Pirmkārt, formulēsim darba uzdevumu ā€“ ko tieÅ”i mēs vēlamies iegÅ«t rezultātā.

  1. Mēs vēlamies, lai būtu galapunkts, piemēram, events.kis.im (kis.im ir testa domēns, ko izmantosim visos rakstos), kuram vajadzētu saņemt notikumus, izmantojot HTTPS.
  2. Notikumi ir vienkārÅ”s JSON, piemēram: {"event": "view", "os": "linux", "browser": "chrome"}. Pēdējā posmā mēs pievienosim nedaudz vairāk lauku, taču tam nebÅ«s lielas nozÄ«mes. Ja vēlaties, varat pārslēgties uz protobuf.
  3. Pakalpojumam jāspēj apstrādāt 10 000 notikumu sekundē.
  4. JābÅ«t iespējai mērogot horizontāli, vienkārÅ”i pievienojot mÅ«su risinājumam jaunus gadÄ«jumus. Un bÅ«tu jauki, ja mēs varam pārvietot priekŔējo daļu uz dažādām Ä£eogrāfiskajām atraÅ”anās vietām, lai samazinātu klientu pieprasÄ«jumu latentumu.
  5. Kļūdu tolerance. Risinājumam jābÅ«t pietiekami stabilam un jāspēj pārdzÄ«vot jebkuru detaļu nokriÅ”anu (protams, lÄ«dz noteiktam skaitam).

Arhitektūra

Kopumā Ŕāda veida uzdevumiem jau sen ir izgudrotas klasiskās arhitektÅ«ras, kas nodroÅ”ina efektÄ«vu mērogoÅ”anu. Attēlā parādÄ«ts mÅ«su risinājuma piemērs.

Mēs pieņemam 10 000 notikumu pakalpojumā Yandex.Cloud. 1. daļa

Tātad, kas mums ir:

1. Kreisajā pusē ir mÅ«su ierÄ«ces, kas Ä£enerē dažādus notikumus, neatkarÄ«gi no tā, vai spēlētāji pabeidz lÄ«meni rotaļlietā viedtālrunÄ« vai veic pasÅ«tÄ«jumu interneta veikalā, izmantojot parasto pārlÅ«kprogrammu. Notikums, kā norādÄ«ts specifikācijā, ir vienkārÅ”s JSON, kas tiek nosÅ«tÄ«ts uz mÅ«su galapunktu ā€” events.kis.im.

2. Pirmie divi serveri ir vienkārŔi balansieri, to galvenie uzdevumi ir:

  • Esiet pastāvÄ«gi pieejams. Lai to izdarÄ«tu, varat izmantot, piemēram, Keepalived, kas problēmu gadÄ«jumā pārslēgs virtuālo IP starp mezgliem.
  • Pārtraukt TLS. Jā, mēs tiem pārtrauksim TLS darbÄ«bu. Pirmkārt, lai mÅ«su risinājums atbilstu tehniskajām specifikācijām, un, otrkārt, lai atbrÄ«votos no Å”ifrēta savienojuma izveides no mÅ«su aizmugures serveriem.
  • LÄ«dzsvarojiet ienākoÅ”os pieprasÄ«jumus pieejamajiem aizmugursistēmas serveriem. Atslēgas vārds Å”eit ir pieejams. Pamatojoties uz to, mēs nonākam pie izpratnes, ka slodzes lÄ«dzsvarotājiem jāspēj pārraudzÄ«t mÅ«su serverus ar lietojumprogrammām un pārtraukt trafika lÄ«dzsvaroÅ”anu uz neveiksmÄ«giem mezgliem.

3. Pēc balansieriem mums ir lietojumprogrammu serveri, kuros darbojas diezgan vienkārÅ”a lietojumprogramma. Tam vajadzētu bÅ«t iespējai pieņemt ienākoÅ”os pieprasÄ«jumus, izmantojot HTTP, apstiprināt nosÅ«tÄ«to JSON un ievietot datus buferÄ«.

4. Diagrammā kafka ir parādÄ«ta kā buferis, lai gan, protams, Å”ajā lÄ«menÄ« var izmantot citus lÄ«dzÄ«gus pakalpojumus. Mēs salÄ«dzināsim Kafka, rabbitmq un yqs treÅ”ajā rakstā.

5. MÅ«su arhitektÅ«ras priekÅ”pēdējais punkts ir Clickhouse ā€“ kolonnu datubāze, kas ļauj uzglabāt un apstrādāt milzÄ«gu datu apjomu. Å ajā lÄ«menÄ« mums ir jāpārsÅ«ta dati no bufera uz paÅ”u uzglabāŔanas sistēmu (vairāk par to 4. rakstā).

Å is dizains ļauj mums mērogot katru slāni neatkarÄ«gi horizontāli. Aizmugursistēmas serveri nevar tikt galā - pievienosim vēl vienu lietu - galu galā tās ir bezvalsts lietojumprogrammas, un tāpēc to var izdarÄ«t pat automātiski. Kafkas stila buferis nedarbojas ā€” pievienosim vairāk serveru un pārsÅ«tÄ«sim uz tiem dažus mÅ«su tēmas nodalÄ«jumus. Clickhouse nevar tikt galā - tas nav iespējams :) PatiesÄ«bā mēs arÄ« savienosim serverus un sadalÄ«sim datus.

Starp citu, ja vēlaties ieviest mÅ«su tehnisko specifikāciju un mēroga izvēles daļu dažādās Ä£eogrāfiskās vietās, nekas nav vienkārŔāks:

Mēs pieņemam 10 000 notikumu pakalpojumā Yandex.Cloud. 1. daļa

Katrā Ä£eogrāfiskajā vietā mēs izvietojam slodzes balansētāju ar lietojumprogrammu un kafka. Kopumā pietiek ar 2 lietojumprogrammu serveriem, 3 kafka mezgliem un mākoņa balansētāju, piemēram, cloudflare, kas pārbaudÄ«s lietojumprogrammu mezglu pieejamÄ«bu un lÄ«dzsvaros pieprasÄ«jumus pēc Ä£eogrāfiskās atraÅ”anās vietas, pamatojoties uz klienta avota IP adresi. Tādējādi amerikāņu klienta nosÅ«tÄ«tie dati nonāks Amerikas serveros. Un dati no Āfrikas ir afrikāņu valodā.

Tad viss ir pavisam vienkārÅ”i ā€“ izmantojam spoguļrÄ«ku no Kafka komplekta un kopējam visus datus no visām vietām uz mÅ«su centrālo datu centru, kas atrodas Krievijā. IekŔēji mēs parsējam datus un ierakstām tos Clickhouse vēlākai vizualizācijai.

Tātad, mēs esam sakārtojuÅ”i arhitektÅ«ru - sāksim kratÄ«t Yandex.Cloud!

Pieteikuma rakstīŔana

Pirms Mākoņa jums joprojām ir jābÅ«t nedaudz pacietÄ«gam un jāuzraksta diezgan vienkārÅ”s serviss, lai apstrādātu ienākoÅ”os notikumus. Mēs izmantosim golang, jo tas ir sevi ļoti labi pierādÄ«jis kā tÄ«kla lietojumprogrammu rakstÄ«Å”anas valodu.

Pēc stundas (varbÅ«t pāris stundām) pavadÄ«Å”anas mēs iegÅ«stam kaut ko lÄ«dzÄ«gu: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Kādi ir galvenie punkti, kurus es vēlētos Å”eit atzÄ«mēt:

1. Palaižot lietojumprogrammu, varat norādÄ«t divus karogus. Viens ir atbildÄ«gs par portu, kurā mēs uzklausÄ«sim ienākoÅ”os http pieprasÄ«jumus (-addr). Otrais ir paredzēts kafka servera adresei, kurā mēs ierakstÄ«sim savus notikumus (-kafka):

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

2. Lietojumprogramma izmanto saramas bibliotēku ([] github.com/Shopify/sarama), lai nosūtītu ziņojumus kafka klasterim. Mēs nekavējoties iestatījām iestatījumus, kuru mērķis ir maksimālais apstrādes ātrums:

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

3. Mūsu lietojumprogrammā ir arī iebūvēts Prometheus klients, kas apkopo dažādus rādītājus, piemēram:

  • pieprasÄ«jumu skaits mÅ«su pieteikumam;
  • kļūdu skaits, izpildot pieprasÄ«jumu (nespēja nolasÄ«t ziņas pieprasÄ«jumu, bojāts json, nav iespējams rakstÄ«t Kafkai);
  • viena klienta pieprasÄ«juma apstrādes laiks, ieskaitot Kafka ziņojuma rakstÄ«Å”anas laiku.

4. TrÄ«s galapunkti, ko apstrādā mÅ«su lietojumprogramma.

  • /statuss - vienkārÅ”i atgriezieties OK, lai parādÄ«tu, ka esam dzÄ«vi. Lai gan jÅ«s varat pievienot dažas pārbaudes, piemēram, Kafka klastera pieejamÄ«bu.
  • /metrics ā€” saskaņā ar Å”o URL Prometheus klients atgriezÄ«s savāktos rādÄ«tājus.
  • /post ir galvenais galapunkts, uz kuru tiks nosÅ«tÄ«ti POST pieprasÄ«jumi ar iekŔēju json. MÅ«su lietojumprogramma pārbauda Json derÄ«gumu un, ja viss ir kārtÄ«bā, tā ieraksta datus Kafka klasterÄ«.

IzdarÄ«Å”u atrunu, ka kods nav ideāls ā€“ to var (un vajag!) aizpildÄ«t. Piemēram, varat pārtraukt izmantot iebÅ«vēto tÄ«klu/http un pārslēgties uz ātrāku fasthttp. Vai arÄ« varat iegÅ«t apstrādes laiku un procesora resursus, pārvietojot json derÄ«guma pārbaudi uz vēlāku posmu ā€” kad dati tiek pārsÅ«tÄ«ti no bufera uz Clickhouse klasteru.

Papildus problēmas izstrādes pusei mēs nekavējoties domājām par savu nākotnes infrastruktÅ«ru un nolēmām izvietot savu lietojumprogrammu, izmantojot doku. Pēdējais Docker fails lietojumprogrammas izveidei ir https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Kopumā tas ir diezgan vienkārÅ”i, vienÄ«gais, kam es gribētu pievērst uzmanÄ«bu, ir daudzpakāpju montāža, kas ļauj samazināt mÅ«su konteinera galÄ«go attēlu.

Pirmie soļi mākonī

Vispirms reÄ£istrējieties cloud.yandex.ru. Pēc visu nepiecieÅ”amo lauku aizpildÄ«Å”anas mums tiks izveidots konts un pieŔķirts grants noteiktai naudas summai, ko varēs izmantot mākoņpakalpojumu testÄ“Å”anai. Ja vēlaties atkārtot visas mÅ«su raksta darbÄ«bas, ar Å”o dotāciju jums vajadzētu pietikt.

Pēc reÄ£istrācijas jums tiks izveidots atseviŔķs mākonis un noklusējuma direktorijs, kurā varēsiet sākt veidot mākoņa resursus. Kopumā Yandex.Cloud resursu attiecÄ«bas izskatās Ŕādi:

Mēs pieņemam 10 000 notikumu pakalpojumā Yandex.Cloud. 1. daļa

Vienam kontam varat izveidot vairākus mākoņus. Un mākonÄ« izveidojiet dažādus direktorijus dažādiem uzņēmuma projektiem. Vairāk par to varat lasÄ«t dokumentācijā - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Starp citu, es uz to bieži atsaukÅ”os tālāk tekstā. Kad es izveidoju visu infrastruktÅ«ru no nulles, dokumentācija man palÄ«dzēja vairāk nekā vienu reizi, tāpēc iesaku to izpētÄ«t.

Lai pārvaldÄ«tu mākoni, varat izmantot gan tÄ«mekļa saskarni, gan konsoles utilÄ«tu - yc. InstalÄ“Å”ana tiek veikta ar vienu komandu (Linux un Mac OS):

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

Ja jÅ«su iekŔējās droŔības speciālists plosās par skriptu palaiÅ”anu no interneta, tad, pirmkārt, jÅ«s varat atvērt skriptu un to izlasÄ«t, un, otrkārt, mēs to palaižam zem sava lietotāja - bez root tiesÄ«bām.

Ja vēlaties instalēt Windows klientu, varat izmantot instrukcijas Å”eit un tad izpildÄ«t yc initlai to pilnÄ«bā pielāgotu:

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

Principā process ir vienkārÅ”s ā€“ vispirms jāiegÅ«st oauth marÄ·ieris, lai pārvaldÄ«tu mākoni, jāizvēlas mākonis un mape, kuru izmantosit.

Ja jums ir vairāki konti vai mapes vienā mākonÄ«, varat izveidot papildu profilus ar atseviŔķiem iestatÄ«jumiem, izmantojot yc config profile create un pārslēgties starp tiem.

Papildus iepriekÅ”minētajām metodēm Yandex.Cloud komanda uzrakstÄ«ja ļoti labu spraudnis terraform mākoņa resursu pārvaldÄ«bai. Es no savas puses sagatavoju git repozitoriju, kurā aprakstÄ«ju visus resursus, kas tiks izveidoti raksta ietvaros - https://github.com/rebrainme/yandex-cloud-events/. MÅ«s interesē galvenā filiāle, klonēsim to lokāli:


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/

Visi galvenie mainÄ«gie, kas tiek izmantoti terraformā, ir ierakstÄ«ti main.tf failā. Lai sāktu, izveidojiet failu private.auto.tfvars terraform mapē ar Ŕādu saturu:

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

Visus mainÄ«gos var ņemt no yc konfigurāciju saraksta, jo mēs jau esam konfigurējuÅ”i konsoles utilÄ«tu. Iesaku .gitignore uzreiz pievienot private.auto.tfvars, lai nejauÅ”i nepublicētu privātos datus.

Vietnē private.auto.tfvars mēs norādÄ«jām arÄ« datus no Cloudflare ā€” lai izveidotu DNS ierakstus un starpniekserveri galveno domēnu events.kis.im uz mÅ«su serveriem. Ja nevēlaties izmantot cloudflare, tad noņemiet cloudflare nodroÅ”inātāja inicializÄ“Å”anu main.tf un dns.tf failā, kas ir atbildÄ«gs par nepiecieÅ”amo DNS ierakstu izveidi.

Savā darbā mēs apvienosim visas trīs metodes - tīmekļa saskarni, konsoles utilītu un terraformu.

Virtuālie tīkli

GodÄ«gi sakot, jÅ«s varētu izlaist Å”o darbÄ«bu, jo, izveidojot jaunu mākoni, jums automātiski tiks izveidots atseviŔķs tÄ«kls un 3 apakÅ”tÄ«kli ā€” viens katrai pieejamÄ«bas zonai. Bet mēs tomēr vēlētos savam projektam izveidot atseviŔķu tÄ«klu ar savu adresāciju. Vispārējā diagramma par tÄ«kla darbÄ«bu Yandex.Cloud ir parādÄ«ta zemāk esoÅ”ajā attēlā (godÄ«gi ņemta no https://cloud.yandex.ru/docs/vpc/concepts/)

Mēs pieņemam 10 000 notikumu pakalpojumā Yandex.Cloud. 1. daļa

Tātad jÅ«s izveidojat kopÄ«gu tÄ«klu, kurā resursi var sazināties viens ar otru. Katrai pieejamÄ«bas zonai tiek izveidots apakÅ”tÄ«kls ar savu adresāciju un savienots ar vispārējo tÄ«klu. Rezultātā visi tajā esoÅ”ie mākoņu resursi var sazināties, pat ja tie atrodas dažādās pieejamÄ«bas zonās. Resursi, kas savienoti ar dažādiem mākoņu tÄ«kliem, var redzēt viens otru tikai caur ārējām adresēm. Starp citu, kā Ŕī maÄ£ija darbojas iekŔā, bija labi aprakstÄ«ts HabrĆ©.

TÄ«kla izveide ir aprakstÄ«ta repozitorija failā network.tf. Tur mēs izveidojam vienu kopÄ«gu privāto tÄ«klu iekŔējo un pievienojam tam trÄ«s apakÅ”tÄ«klus dažādās pieejamÄ«bas zonās - iekŔējais-a (172.16.1.0/24), iekŔējais-b (172.16.2.0/24), iekŔējais-c (172.16.3.0/24). ).

Inicializējiet terraformu un izveidojiet tīklus:

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.

Lieliski! Mēs esam izveidojuÅ”i savu tÄ«klu un tagad esam gatavi izveidot savus iekŔējos pakalpojumus.

Virtuālo maŔīnu izveide

Lai pārbaudÄ«tu lietojumprogrammu, mums bÅ«s jāizveido tikai divas virtuālās maŔīnas - pirmā mums bÅ«s nepiecieÅ”ama, lai izveidotu un palaistu lietojumprogrammu, otra, lai palaistu kafka, kuru izmantosim ienākoÅ”o ziņojumu glabāŔanai. Un mēs izveidosim citu maŔīnu, kurā konfigurēsim Prometheus, lai uzraudzÄ«tu lietojumprogrammu.

Virtuālās maŔīnas tiks konfigurētas, izmantojot ansible, tāpēc pirms terraformas palaiÅ”anas pārliecinieties, vai jums ir kāda no jaunākajām ansible versijām. Un instalējiet nepiecieÅ”amās lomas ar 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) $

Ansible mapē ir .ansible.cfg konfigurācijas faila piemērs, ko izmantoju. Tas varētu noderēt.

Pirms virtuālo maŔīnu izveides pārliecinieties, vai darbojas ssh-agent un ir pievienota ssh atslēga, pretējā gadÄ«jumā terraform nevarēs izveidot savienojumu ar izveidotajām maŔīnām. Es, protams, saskāros ar kļūdu operētājsistēmā OS x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Lai tas neatkārtotos, pirms Terraform palaiÅ”anas pievienojiet env nelielu mainÄ«go:

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

Mapē ar terraformu mēs izveidojam nepiecieÅ”amos resursus:

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

Ja viss beidzās veiksmÄ«gi (un tam vajadzētu bÅ«t), tad mums bÅ«s trÄ«s virtuālās maŔīnas:

  1. build - maŔīna lietojumprogrammas testÄ“Å”anai un veidoÅ”anai. Ansible automātiski instalēja Docker.
  2. monitorings - uz tā uzstādīta uzraudzības maŔīna - prometheus & grafana. PieteikŔanās / paroles standarts: admin / admin
  3. kafka ir maza iekārta ar instalētu kafka, kas pieejama portā 9092.

Pārliecināsimies, ka tie visi ir savās vietās:

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 ir pieejami, un no Å”ejienes mēs varam iegÅ«t viņu IP adreses. Tālāk es izmantoÅ”u IP adreses, lai izveidotu savienojumu, izmantojot ssh, un pārbaudÄ«tu lietojumprogrammu. Ja jums ir cloudflare konts, kas ir saistÄ«ts ar terraform, izmantojiet tikko izveidotos DNS nosaukumus.
Starp citu, veidojot virtuālo maŔīnu, tiek pieŔķirts iekŔējais IP un iekŔējais DNS nosaukums, lai jÅ«s varētu piekļūt tÄ«kla serveriem pēc nosaukuma:

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

Tas mums noderēs, lai norādītu lietojumprogrammai beigu punktu ar kafk.

Aplikācijas salikŔana

Lieliski, ir serveri, ir aplikācija - atliek tikai to samontēt un publicēt. BÅ«vÄ“Å”anai izmantosim parasto docker bÅ«vējumu, bet kā attēlu krātuvi izmantosim pakalpojumu no Yandex - konteineru reÄ£istra. Bet vispirms vispirms.

Mēs nokopējam lietojumprogrammu bÅ«vÄ“Å”anas maŔīnā, piesakāmies caur ssh un saliekam attēlu:

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

Puse cīņas ir paveikta - tagad mēs varam pārbaudīt mūsu lietojumprogrammas funkcionalitāti, palaižot to un nosūtot to uz 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) $

Lietojumprogramma atbildēja ar veiksmÄ«gu ierakstÄ«Å”anu un norādÄ«ja nodalÄ«juma ID un nobÄ«di, kurā ziņojums tika iekļauts. Viss, kas jādara, ir izveidot reÄ£istru pakalpojumā Yandex.Cloud un augÅ”upielādēt tur mÅ«su attēlu (kā to izdarÄ«t, izmantojot trÄ«s rindiņas, ir aprakstÄ«ts failā registry.tf). Izveidojiet krātuvi:

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.

Ir vairāki veidi, kā autentificēties konteinera reÄ£istrā ā€” izmantojot oauth pilnvaru, iam pilnvaru vai pakalpojuma konta atslēgu. SÄ«kāka informācija par Ŕīm metodēm ir atrodama dokumentācijā. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Mēs izmantosim pakalpojuma konta atslēgu, tāpēc izveidosim kontu:

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.

Tagad atliek tikai izveidot tai atslēgu:

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

Saņemam informāciju par mūsu krātuves ID, nododam atslēgu un piesakāmies:

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

Lai augÅ”upielādētu attēlu reÄ£istrā, mums ir nepiecieÅ”ams konteinera reÄ£istra ID, mēs to ņemam no yc utilÄ«ta:

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

Pēc tam mēs atzÄ«mējam savu attēlu ar jaunu nosaukumu un augÅ”upielādējam:

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ēs varam pārbaudīt, vai attēls ir veiksmīgi ielādēts:

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

Starp citu, ja instalējat yc utilÄ«tu Linux maŔīnā, varat izmantot komandu

yc container registry configure-docker

lai konfigurētu docker.

Secinājums

Mēs esam paveikuÅ”i daudz smaga darba, un rezultātā:

  1. Mēs izdomājām sava nākotnes pakalpojuma arhitektūru.
  2. Mēs uzrakstījām pieteikumu golangā, kas īsteno mūsu biznesa loģiku.
  3. Mēs to savācām un iebērām privātā konteineru reģistrā.

Nākamajā daļā mēs pāriesim pie interesantajām lietām ā€” mēs izlaidÄ«sim savu lietojumprogrammu ražoÅ”anā un beidzot sāksim tās ielādi. Nepārslēdzies!

Šis materiāls ir atvērtā semināra REBRAIN & Yandex.Cloud video ierakstā: Mēs pieņemam 10 000 pieprasījumu sekundē Yandex Cloud - https://youtu.be/cZLezUm0ekE

Ja vēlaties apmeklēt Ŕādus pasākumus tieÅ”saistē un uzdot jautājumus reāllaikā, izveidojiet savienojumu ar DevOps no REBRAIN kanāla.

ÄŖpaÅ”u paldies vēlamies teikt Yandex.Cloud par iespēju rÄ«kot Ŕādu pasākumu. Saite uz tiem - https://cloud.yandex.ru/prices

Ja jums ir jāpāriet uz mākoni vai jums ir jautājumi par savu infrastruktūru, Jūtieties brīvi iesniegt pieprasījumu.

PS Mums ir 2 bezmaksas auditi mēnesī, iespējams, ka jūsu projekts būs viens no tiem.

Avots: www.habr.com

Pievieno komentāru