Aħna naċċettaw 10 avveniment f'Yandex.Cloud. Parti 000

Hello lil kulħadd, ħbieb!

* Dan l-artikolu huwa bbażat fuq il-workshop miftuħ REBRAIN & Yandex.Cloud, jekk tippreferi tara l-video, tista' ssibu f'din il-link - https://youtu.be/cZLezUm0ekE

Riċentement kellna l-opportunità li nippruvaw Yandex.Cloud live. Peress li ridna nisondaw fit-tul u iebes, immedjatament abbandunajna l-idea li nniedu blog Wordpress sempliċi b'bażi ​​ta 'sħab - kien boring wisq. Wara xi ħsibijiet, iddeċidejna li niskjeraw xi ħaġa simili għal arkitettura ta 'servizz ta' produzzjoni biex nirċievu u janalizzaw avvenimenti fil-modalità kważi f'ħin reali.

Jiena assolutament ċert li l-maġġoranza l-kbira tan-negozji onlajn (u mhux biss) b'xi mod jiġbru muntanja ta 'informazzjoni dwar l-utenti tagħhom u l-azzjonijiet tagħhom. Bħala minimu, dan huwa meħtieġ biex jittieħdu ċerti deċiżjonijiet - pereżempju, jekk timmaniġġja logħba online, tista 'tħares lejn l-istatistika li fiha l-utenti tal-livell l-aktar spiss jeħlu u ħassar il-ġugarell tiegħek. Jew għaliex l-utenti jħallu s-sit tiegħek mingħajr ma jixtru xejn (bonjour, Yandex.Metrica).

Allura, l-istorja tagħna: kif ktibna applikazzjoni fil-golang, ittestjajna kafka vs rabbitmq vs yqs, ktibna streaming tad-dejta fi cluster Clickhouse u viżwalizzajna d-dejta billi tuża yandex datalens. Naturalment, dan kollu kien imħawwar b'delights infrastrutturali fil-forma ta 'docker, terraform, gitlab ci u, ovvjament, prometheus. Tlaqna!

Nixtieq immedjatament nagħmel riżerva li mhux se nkunu nistgħu nikkonfiguraw kollox f'seduta waħda - għal dan ikollna bżonn diversi artikli fis-serje. Ftit dwar l-istruttura:

Parti 1 (qed taqrah). Aħna ser niddeċiedu dwar l-ispeċifikazzjonijiet u l-arkitettura tas-soluzzjoni, u wkoll niktbu applikazzjoni fil-golang.
Parti 2. Aħna nirrilaxxaw l-applikazzjoni tagħna fil-produzzjoni, nagħmluha skalabbli u nittestjaw it-tagħbija.
Parti 3. Ejja nippruvaw insemmu għaliex għandna bżonn naħżnu messaġġi f'buffer u mhux f'fajls, u nqabblu wkoll is-servizz tal-kju kafka, rabbitmq u yandex.
Parti 4 Se niskjeraw cluster Clickhouse, niktbu servizz ta' streaming biex nittrasferixxu d-dejta mill-buffer hemmhekk, u nwaqqfu viżwalizzazzjoni fid-datalens.
Parti 5 Ejja nġibu l-infrastruttura kollha f'forma xierqa - waqqaf ci/cd billi tuża gitlab ci, qabbad il-monitoraġġ u l-iskoperta tas-servizz billi tuża prometheus u konsul.

TK

L-ewwel, ejja nifformulaw it-termini ta 'referenza - dak eżattament irridu nġibu bħala riżultat.

  1. Irridu li jkollna endpoint bħal events.kis.im (kis.im huwa d-dominju tat-test li se nużaw fl-artikoli kollha), li għandu jirċievi avvenimenti billi juża HTTPS.
  2. L-avvenimenti huma json sempliċi bħal: {“avveniment”: “vista”, “os”: “linux”, “browser”: “chrome”}. Fl-aħħar stadju se nżidu ftit aktar oqsma, iżda dan mhux se jkollu rwol kbir. Jekk tixtieq, tista' taqleb għal protobuf.
  3. Is-servizz irid ikun kapaċi jipproċessa 10 avveniment kull sekonda.
  4. Għandu jkun possibbli li tiskala orizzontalment billi sempliċement inżidu każijiet ġodda mas-soluzzjoni tagħna. U se jkun sabiħ jekk nistgħu nimxu l-parti ta 'quddiem għal ġeolokazzjonijiet differenti biex innaqqsu l-latenza għat-talbiet tal-klijenti.
  5. Tolleranza għall-ħsarat. Is-soluzzjoni għandha tkun stabbli biżżejjed u tkun tista 'tgħix il-waqgħa ta' kwalunkwe parti (sa ċertu numru, ovvjament).

arkitettura

B'mod ġenerali, għal dan it-tip ta 'kompitu, arkitetturi klassiċi ilhom ivvintati li jippermettu skalar effiċjenti. Il-figura turi eżempju tas-soluzzjoni tagħna.

Aħna naċċettaw 10 avveniment f'Yandex.Cloud. Parti 000

Allura dak li għandna:

1. Fuq ix-xellug hemm apparati tagħna li jiġġeneraw diversi avvenimenti, kemm jekk ikunu plejers li jlestu livell f'ġugarell fuq smartphone jew li joħolqu ordni f'ħanut online permezz ta 'browser regolari. Avveniment, kif speċifikat fl-ispeċifikazzjoni, huwa json sempliċi li jintbagħat lill-endpoint tagħna - events.kis.im.

2. L-ewwel żewġ servers huma bilanċjanti sempliċi, il-kompiti ewlenin tagħhom huma:

  • Kun disponibbli kontinwament. Biex tagħmel dan, tista 'tuża, pereżempju, keepalived, li se taqleb l-IP virtwali bejn in-nodi f'każ ta' problemi.
  • Ittermina TLS. Iva, aħna se nitterminaw TLS fuqhom. L-ewwelnett, sabiex is-soluzzjoni tagħna tikkonforma mal-ispeċifikazzjonijiet tekniċi, u t-tieni, sabiex ittaffi l-piż li tiġi stabbilita konnessjoni kriptata mis-servers backend tagħna.
  • Ibbilanċja t-talbiet deħlin għal servers backend disponibbli. Il-kelma ewlenija hawnhekk hija aċċessibbli. Abbażi ta 'dan, aħna nifhmu li l-bilanċjanti tat-tagħbija għandhom ikunu kapaċi jimmonitorjaw is-servers tagħna b'applikazzjonijiet u jieqfu jibbilanċjaw it-traffiku għal nodi falluti.

3. Wara l-balancers, għandna servers ta 'applikazzjoni li jmexxu applikazzjoni pjuttost sempliċi. Għandu jkun jista 'jaċċetta talbiet deħlin permezz ta' HTTP, jivvalida l-json mibgħut u jpoġġi d-dejta f'buffer.

4. Id-dijagramma turi kafka bħala buffer, għalkemm, ovvjament, servizzi simili oħra jistgħu jintużaw f'dan il-livell. Se nqabblu lil Kafka, rabbitmq u yqs fit-tielet artiklu.

5. Il-punt ta' qabel tal-aħħar tal-arkitettura tagħna huwa Clickhouse - database ta' kolonni li jippermettilek taħżen u tipproċessa ammont kbir ta 'dejta. F'dan il-livell, għandna bżonn nittrasferixxu data mill-buffer għas-sistema tal-ħażna nnifisha (aktar dwar dan fl-artikolu 4).

Dan id-disinn jippermettilna nskala kull saff b'mod indipendenti orizzontalment. Is-servers backend ma jistgħux ilaħħqu - ejja nżidu ħaġa oħra - wara kollox, huma applikazzjonijiet mingħajr stat, u għalhekk, dan jista 'jsir anke awtomatikament. Il-buffer tal-istil Kafka ma jaħdimx—ejja nżidu aktar servers u nittrasferixxu xi wħud mill-ħitan tas-suġġett tagħna lilhom. Clickhouse ma tistax tieħu ħsiebha - huwa impossibbli :) Fil-fatt, aħna se nqabbdu wkoll is-servers u nqattgħu d-dejta.

Mill-mod, jekk trid timplimenta l-parti fakultattiva tal-ispeċifikazzjonijiet tekniċi tagħna u l-iskala f'ġeolokazzjonijiet differenti, allura m'hemm xejn aktar sempliċi:

Aħna naċċettaw 10 avveniment f'Yandex.Cloud. Parti 000

F'kull ġeolokazzjoni aħna niskjeraw load balancer b'applikazzjoni u kafka. B'mod ġenerali, 2 servers ta 'applikazzjoni, 3 kafka nodes u cloud balancer, pereżempju, cloudflare, huma biżżejjed, li se jiċċekkja d-disponibbiltà tan-nodi tal-applikazzjoni u t-talbiet tal-bilanċ permezz ta' ġeolokalizzazzjoni bbażati fuq l-indirizz IP tas-sors tal-klijent. Għalhekk, data mibgħuta minn klijent Amerikan se tinżel fuq servers Amerikani. U data mill-Afrika hija Afrikana.

Imbagħad kollox huwa pjuttost sempliċi - nużaw l-għodda tal-mera mis-sett Kafka u nikkopja d-dejta kollha mill-postijiet kollha fiċ-ċentru tad-dejta ċentrali tagħna li jinsab fir-Russja. Internament, aħna naqraw id-dejta u nirreġistrawha f'Clickhouse għal viżwalizzazzjoni sussegwenti.

Allura, aħna rranġajna l-arkitettura - ejja nibdew tħawwad Yandex.Cloud!

Qed niktbu applikazzjoni

Qabel il-Cloud, xorta trid tkun ftit pazjent u tikteb servizz pjuttost sempliċi biex tipproċessa l-avvenimenti deħlin. Se nużaw il-golang għax wera lilu nnifsu tajjeb ħafna bħala lingwa għall-kitba ta' applikazzjonijiet tan-netwerk.

Wara li nqattgħu siegħa (forsi ftit sigħat), ikollna xi ħaġa bħal din: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

X'inhuma l-punti ewlenin li nixtieq ninnota hawn:

1. Meta tibda l-applikazzjoni, tista 'tispeċifika żewġ bnadar. Wieħed huwa responsabbli għall-port li fuqu se nisimgħu talbiet http deħlin (-addr). It-tieni huwa għall-indirizz tas-server kafka fejn se nirreġistraw l-avvenimenti tagħna (-kafka):

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

2. L-applikazzjoni tuża l-librerija sarama ([] github.com/Shopify/sarama) biex tibgħat messaġġi lill-kafka cluster. Immedjatament nissettjaw is-settings immirati lejn il-veloċità massima tal-ipproċessar:

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

3. L-applikazzjoni tagħna għandha wkoll klijent prometheus inkorporat li jiġbor diversi metriċi, bħal:

  • numru ta' talbiet għall-applikazzjoni tagħna;
  • numru ta 'żbalji meta tesegwixxi t-talba (impossibbli li taqra t-talba tal-post, json imkisser, impossibbli li tikteb lil Kafka);
  • ħin tal-ipproċessar għal talba waħda mill-klijent, inkluż il-ħin biex tikteb messaġġ lil Kafka.

4. Tliet punti finali li l-applikazzjoni tagħna tipproċessa:

  • /status - sempliċiment ritorn ok biex turi li aħna ħajjin. Għalkemm tista 'żżid xi kontrolli, bħad-disponibbiltà tal-cluster Kafka.
  • /metrics - skond din l-url, il-klijent prometheus se jirritorna l-metriċi li jkun ġabar.
  • /post huwa l-endpoint ewlieni fejn jintbagħtu t-talbiet POST b'json ġewwa. L-applikazzjoni tagħna tiċċekkja l-json għall-validità u jekk kollox huwa tajjeb, tikteb id-dejta fil-cluster Kafka.

Se nagħmel riżerva li l-kodiċi mhuwiex perfett - jista' (u għandu!) jimtela. Pereżempju, tista 'tieqaf tuża n-net/http integrata u taqleb għall-aktar veloċi http. Jew tista 'tikseb ħin tal-ipproċessar u riżorsi tas-cpu billi tmexxi l-verifika tal-validità json għal stadju aktar tard - meta d-dejta tiġi trasferita mill-buffer għall-cluster tal-clickhouse.

Minbarra l-aspett tal-iżvilupp tal-kwistjoni, ħsibna immedjatament dwar l-infrastruttura futura tagħna u ddeċidejna li niskjeraw l-applikazzjoni tagħna permezz ta 'docker. Il-Dockerfile finali għall-bini tal-applikazzjoni huwa https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. B'mod ġenerali, huwa pjuttost sempliċi, l-uniku punt li nixtieq nagħti attenzjoni huwa l-assemblaġġ f'diversi stadji, li jippermettilna nnaqqsu l-immaġni finali tal-kontenitur tagħna.

L-ewwel passi fis-sħaba

L-ewwelnett, irreġistra fuq cloud.yandex.ru. Wara li nimlew l-oqsma kollha meħtieġa, inkunu maħluqa kont u ningħataw għotja għal ċertu ammont ta 'flus, li jistgħu jintużaw biex jiġu ttestjati s-servizzi tal-cloud. Jekk trid tirrepeti l-passi kollha mill-artiklu tagħna, din l-għotja għandha tkun biżżejjed għalik.

Wara r-reġistrazzjoni, se jinħolqu sħaba separata u direttorju default għalik, li fihom tista' tibda toħloq riżorsi tas-sħab. B'mod ġenerali, f'Yandex.Cloud, ir-relazzjoni tar-riżorsi tidher bħal din:

Aħna naċċettaw 10 avveniment f'Yandex.Cloud. Parti 000

Tista 'toħloq diversi sħab għal kont wieħed. U ġewwa l-sħaba, agħmel direttorji differenti għal proġetti ta 'kumpaniji differenti. Tista' taqra aktar dwar dan fid-dokumentazzjoni - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Mill-mod, spiss nirreferi għaliha hawn taħt fit-test. Meta waqqaft l-infrastruttura kollha mill-bidu, id-dokumentazzjoni għenitni aktar minn darba, għalhekk nagħtik parir biex tistudjaha.

Biex timmaniġġja s-sħaba, tista' tuża kemm l-interface tal-web kif ukoll l-utilità tal-console - yc. L-installazzjoni ssir bi kmand wieħed (għal Linux u Mac Os):

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

Jekk l-ispeċjalista tas-sigurtà interna tiegħek qed imexxi skripts mill-Internet, allura, l-ewwelnett, tista 'tiftaħ l-iskript u taqrah, u t-tieni, aħna nħaddmuh taħt l-utent tagħna - mingħajr drittijiet ta' għerq.

Jekk trid tinstalla klijent għall-Windows, tista 'tuża l-istruzzjonijiet hawn u mbagħad tesegwixxi yc initbiex tippersonalizzaha bis-sħiħ:

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

Fil-prinċipju, il-proċess huwa sempliċi - l-ewwel għandek bżonn tikseb token ta 'oauth biex timmaniġġja l-sħaba, agħżel is-sħaba u l-folder li se tuża.

Jekk għandek diversi kontijiet jew folders fl-istess sħaba, tista 'toħloq profili addizzjonali b'settings separati permezz ta' profil yc config toħloq u taqleb bejniethom.

Minbarra l-metodi ta 'hawn fuq, it-tim Yandex.Cloud kiteb tajjeb ħafna plugin għal terraform għall-ġestjoni tar-riżorsi tal-cloud. Min-naħa tiegħi, ħejjejt repożitorju git, fejn iddeskrivejt ir-riżorsi kollha li se jinħolqu bħala parti mill-artiklu - https://github.com/rebrainme/yandex-cloud-events/. Aħna interessati fil-fergħa kaptan, ejja nikklonuha lokalment:


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/

Il-varjabbli ewlenin kollha li jintużaw f'terraform huma miktuba fil-fajl main.tf. Biex tibda, oħloq fajl private.auto.tfvars fil-folder terraform bil-kontenut li ġej:

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

Il-varjabbli kollha jistgħu jittieħdu mil-lista tal-konfigurazzjoni yc, peress li diġà kkonfigurajna l-utilità tal-console. Nagħtik parir biex immedjatament iżżid private.auto.tfvars ma .gitignore, sabiex ma tippubblikax aċċidentalment data privata.

Fil private.auto.tfvars speċifikajna wkoll data minn Cloudflare - biex noħolqu rekords DNS u prokura d-dominju prinċipali events.kis.im għas-servers tagħna. Jekk ma tridx tuża cloudflare, imbagħad neħħi l-inizjalizzazzjoni tal-fornitur cloudflare f'main.tf u l-fajl dns.tf, li huwa responsabbli għall-ħolqien tar-rekords dns meħtieġa.

Fix-xogħol tagħna se ngħaqqdu t-tliet metodi - l-interface tal-web, l-utilità tal-console, u terraform.

Netwerks virtwali

Biex tkun onest, tista' taqbeż dan il-pass, peress li meta toħloq sħaba ġdida, awtomatikament ikollok netwerk separat u 3 subnets maħluqa - wieħed għal kull żona ta' disponibbiltà. Iżda xorta nixtiequ nagħmlu netwerk separat għall-proġett tagħna bl-indirizzar tiegħu stess. Id-dijagramma ġenerali ta 'kif jaħdem in-netwerk f'Yandex.Cloud tidher fil-figura hawn taħt (onestament meħuda minn https://cloud.yandex.ru/docs/vpc/concepts/)

Aħna naċċettaw 10 avveniment f'Yandex.Cloud. Parti 000

Għalhekk, inti toħloq netwerk komuni li fih ir-riżorsi jistgħu jikkomunikaw ma 'xulxin. Għal kull żona ta 'disponibbiltà, tinħoloq subnet bl-indirizzar tagħha stess u konness man-netwerk ġenerali. Bħala riżultat, ir-riżorsi kollha tas-sħab fiha jistgħu jikkomunikaw, anke jekk ikunu f'żoni ta 'disponibbiltà differenti. Riżorsi konnessi ma 'netwerks sħab differenti jistgħu jaraw lil xulxin biss permezz ta' indirizzi esterni. Mill-mod, kif taħdem din il-maġija ġewwa, kien deskritt tajjeb fuq Habré.

Il-ħolqien tan-netwerk huwa deskritt fil-fajl network.tf mir-repożitorju. Hemmhekk noħolqu netwerk privat komuni wieħed intern u qabbad tliet subnets miegħu f'żoni ta' disponibbiltà differenti - intern-a (172.16.1.0/24), intern-b (172.16.2.0/24), intern-c (172.16.3.0/24). ).

Inizjalizza terraform u oħloq netwerks:

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.

Kbir! Ħloqna n-netwerk tagħna u issa lesti noħolqu s-servizzi interni tagħna.

Ħolqien ta 'magni virtwali

Biex nittestjaw l-applikazzjoni, ser ikollna bżonn biss li noħolqu żewġ magni virtwali - ikollna bżonn l-ewwel biex nibnu u tħaddem l-applikazzjoni, it-tieni biex tħaddem kafka, li se nużaw biex naħżnu messaġġi deħlin. U noħolqu magna oħra fejn nikkonfiguraw prometheus biex jimmonitorja l-applikazzjoni.

Il-magni virtwali se jiġu kkonfigurati bl-użu ta 'ansible, għalhekk qabel ma tibda terraform, kun żgur li għandek waħda mill-aħħar verżjonijiet ta' ansible. U installa r-rwoli meħtieġa ma 'galaxie ansible:

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

Ġewwa l-fowlder ansible hemm eżempju ta 'fajl ta' konfigurazzjoni .ansible.cfg li nuża. Jista 'jkun utli.

Qabel ma toħloq magni virtwali, kun żgur li għandek ssh-agent taħdem u ċavetta ssh miżjuda, inkella terraform ma jkunx jista 'jikkonnettja mal-magni maħluqa. Jien, ovvjament, iltqajt ma' bug f'os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Biex tevita li dan jerġa' jiġri, żid varjabbli żgħira ma' env qabel ma tniedi Terraform:

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

Fil-folder b'terraform noħolqu r-riżorsi meħtieġa:

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

Jekk kollox spiċċa b'suċċess (u għandu jkun), allura jkollna tliet magni virtwali:

  1. tibni - magna għall-ittestjar u l-bini ta 'applikazzjoni. Docker ġie installat awtomatikament minn Ansible.
  2. monitoraġġ - magna tal-monitoraġġ - prometheus & grafana installati fuqha. Login / password standard: admin / admin
  3. kafka hija magna żgħira b'kafka installata, aċċessibbli fuq il-port 9092.

Ejja niżguraw li huma kollha f'posthom:

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

Ir-riżorsi huma fis-seħħ, u minn hawn nistgħu niksbu l-indirizzi IP tagħhom. F'dak li ġej se nuża indirizzi IP biex nikkonnettja permezz ta' ssh u nittestja l-applikazzjoni. Jekk għandek kont cloudflare konness ma 'terraform, tħossok liberu li tuża ismijiet DNS maħluqa friski.
Mill-mod, meta tinħoloq magna virtwali, jingħataw IP intern u isem DNS intern, sabiex tkun tista' taċċessa servers fin-netwerk bl-isem:

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

Dan se jkun utli għalina biex nindikaw lill-applikazzjoni l-endpoint b'kafk.

Armar tal-applikazzjoni

Kbir, hemm servers, hemm applikazzjoni - li jibqa 'huwa li tiġborha u tippubblikaha. Għall-bini se nużaw il-bini tas-soltu docker, iżda bħala ħażna ta 'immaġni se nużaw servizz minn Yandex - reġistru tal-kontejners. Imma l-ewwel affarijiet l-ewwel.

Aħna nikkopjaw l-applikazzjoni għall-magna tal-bini, illoggja permezz ssh u niġbru l-immaġni:

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

Nofs il-battalja lesta - issa nistgħu niċċekkjaw il-funzjonalità tal-applikazzjoni tagħna billi nnieduha u nibagħtuha lil 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) $

L-applikazzjoni wieġbet b'suċċess tar-reġistrazzjoni u indikat l-id tal-partizzjoni u l-offset li fih kien inkluż il-messaġġ. Kulma fadal hu li toħloq reġistru f'Yandex.Cloud u ttella' l-immaġni tagħna hemmhekk (kif tagħmel dan billi tuża tliet linji huwa deskritt fil-fajl registry.tf). Oħloq ħażna:

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.

Hemm diversi modi kif tivverifika fir-reġistru tal-kontejners - bl-użu ta' token tal-oauth, token iam, jew ċavetta tal-kont tas-servizz. Aktar dettalji dwar dawn il-metodi jistgħu jinstabu fid-dokumentazzjoni. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Aħna se nużaw iċ-ċavetta tal-kont tas-servizz, għalhekk noħolqu kont:

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.

Issa li jibqa' biss li tagħmel ċavetta għaliha:

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

Nirċievu informazzjoni dwar l-id tal-ħażna tagħna, ittrasferixxi ċ-ċavetta u illoggja:

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

Biex ittella 'l-immaġni fir-reġistru, neħtieġu l-ID tar-reġistru tal-kontejners, neħduha mill-utilità yc:

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

Wara dan, aħna tikketta l-immaġni tagħna b'isem ġdid u ntellgħu:

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

Nistgħu nivverifikaw li l-immaġni tagħbija b'suċċess:

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

Mill-mod, jekk tinstalla l-utilità yc fuq magna Linux, tista 'tuża l-kmand

yc container registry configure-docker

biex tikkonfigura docker.

Konklużjoni

Għamilna ħafna xogħol iebes u bħala riżultat:

  1. Ħriġna bl-arkitettura tas-servizz futur tagħna.
  2. Aħna ktibna applikazzjoni fil-golang li timplimenta l-loġika tan-negozju tagħna.
  3. Ġbarnieha u tferragħha f'reġistru tal-kontejners privat.

Fil-parti li jmiss, se ngħaddu għall-affarijiet interessanti - aħna nirrilaxxaw l-applikazzjoni tagħna fil-produzzjoni u fl-aħħar inniedu t-tagħbija fuqha. Taqlibx!

Dan il-materjal jinsab fir-reġistrazzjoni bil-vidjo tal-workshop miftuħ REBRAIN & Yandex.Cloud: Aħna naċċettaw 10 talba kull sekonda fuq Yandex Cloud - https://youtu.be/cZLezUm0ekE

Jekk inti interessat li tattendi avvenimenti bħal dawn online u tistaqsi mistoqsijiet f'ħin reali, qabbad ma' kanal DevOps minn REBRAIN.

Nixtiequ ngħidu grazzi speċjali lil Yandex.Cloud għall-opportunità li tospita avveniment bħal dan. Link magħhom - https://cloud.yandex.ru/prices

Jekk għandek bżonn timxi lejn il-cloud jew ikollok mistoqsijiet dwar l-infrastruttura tiegħek, tħossok liberu li tħalli talba.

PS Għandna 2 verifiki b'xejn kull xahar, forsi l-proġett tiegħek se jkun wieħed minnhom.

Sors: www.habr.com

Żid kumment