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Ä -
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Ä.
- 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.
- 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.
- Pakalpojumam jÄspÄj apstrÄdÄt 10 000 notikumu sekundÄ.
- 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.
- 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.
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:
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:
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 (
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
Pirmie soļi mÄkonÄ«
Vispirms reÄ£istrÄjieties
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:
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Ä -
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 yc init
lai 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
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
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Å”Ä,
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:
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:
- build - maŔīna lietojumprogrammas testÄÅ”anai un veidoÅ”anai. Ansible automÄtiski instalÄja Docker.
- monitorings - uz tÄ uzstÄdÄ«ta uzraudzÄ«bas maŔīna - prometheus & grafana. PieteikÅ”anÄs / paroles standarts: admin / admin
- 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Ä.
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Ä:
- MÄs izdomÄjÄm sava nÄkotnes pakalpojuma arhitektÅ«ru.
- MÄs uzrakstÄ«jÄm pieteikumu golangÄ, kas Ä«steno mÅ«su biznesa loÄ£iku.
- 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 -
Ja vÄlaties apmeklÄt Å”Ädus pasÄkumus tieÅ”saistÄ un uzdot jautÄjumus reÄllaikÄ, izveidojiet savienojumu ar
ÄŖpaÅ”u paldies vÄlamies teikt Yandex.Cloud par iespÄju rÄ«kot Å”Ädu pasÄkumu. Saite uz tiem -
Ja jums ir jÄpÄriet uz mÄkoni vai jums ir jautÄjumi par savu infrastruktÅ«ru,
PS Mums ir 2 bezmaksas auditi mÄnesÄ«, iespÄjams, ka jÅ«su projekts bÅ«s viens no tiem.
Avots: www.habr.com