Við tökum við 10 viðburði í Yandex.Cloud. 000. hluti

Halló allir, vinir!

* Þessi grein er byggð á REBRAIN & Yandex.Cloud opna verkstæði, ef þú vilt frekar horfa á myndbandið geturðu fundið það á þessum hlekk - https://youtu.be/cZLezUm0ekE

Við fengum nýlega tækifæri til að prófa Yandex.Cloud í beinni. Þar sem við vildum kanna lengi og vel, hættum við strax hugmyndinni um að setja af stað einfalt Wordpress blogg með skýjagrunni - það var of leiðinlegt. Eftir nokkra umhugsun ákváðum við að setja upp eitthvað svipað og framleiðsluþjónustuarkitektúr til að taka á móti og greina atburði í næstum rauntímaham.

Ég er alveg viss um að langflest fyrirtæki á netinu (og ekki aðeins) safna á einhvern hátt fjall af upplýsingum um notendur sína og aðgerðir þeirra. Að minnsta kosti er þetta nauðsynlegt til að taka ákveðnar ákvarðanir - til dæmis, ef þú stjórnar netleik, geturðu skoðað tölfræðina á hvaða stigi notendur festast og eyða leikfanginu þínu. Eða hvers vegna notendur yfirgefa síðuna þína án þess að kaupa neitt (halló, Yandex.Metrica).

Svo, sagan okkar: hvernig við skrifuðum forrit í golang, prófuðum kafka vs rabbitmq vs yqs, skrifuðum gagnastreymi í Clickhouse þyrping og sýndum gögnin með því að nota yandex datalens. Auðvitað var allt þetta kryddað með innviðagleði í formi docker, terraform, gitlab ci og auðvitað prometheus. Förum!

Ég vil strax gera fyrirvara um að við munum ekki geta stillt allt í einni lotu - til þess þurfum við nokkrar greinar í röðinni. Smá um uppbygginguna:

Part 1 (þú ert að lesa hann). Við munum ákveða forskriftir og arkitektúr lausnarinnar og einnig skrifa umsókn í golang.
2. hluti. Við sleppum forritinu okkar í framleiðslu, gerum það skalanlegt og prófum álagið.
3. hluti. Við skulum reyna að reikna út hvers vegna við þurfum að geyma skilaboð í biðminni en ekki í skrám, og einnig bera saman kafka, rabbitmq og yandex biðröð þjónustu.
4. hluti Við munum setja upp Clickhouse þyrping, skrifa streymisþjónustu til að flytja gögn úr biðminni þangað og setja upp sjónræna mynd í gagnasöfnum.
5. hluti Við skulum koma öllum innviðum í rétt form - setja upp ci/cd með gitlab ci, tengja vöktun og þjónustuuppgötvun með því að nota prometheus og ræðismann.

ТЗ

Í fyrsta lagi skulum við móta skilmálana - hvað nákvæmlega við viljum fá í kjölfarið.

  1. Við viljum hafa endapunkt eins og events.kis.im (kis.im er prófunarlénið sem við munum nota í öllum greinunum), sem ætti að taka á móti atburðum með HTTPS.
  2. Viðburðir eru einfalt json eins og: {“event”: “view”, “os”: “linux”, “browser”: “chrome”}. Á lokastigi munum við bæta við aðeins fleiri sviðum, en þetta mun ekki spila stórt hlutverk. Ef þú vilt geturðu skipt yfir í protobuf.
  3. Þjónustan verður að geta unnið úr 10 atburðum á sekúndu.
  4. Það ætti að vera hægt að skala lárétt með því einfaldlega að bæta nýjum tilfellum við lausnina okkar. Og það mun vera gott ef við getum fært framhlutann á mismunandi landfræðilegar staðsetningar til að draga úr töf fyrir beiðnir viðskiptavina.
  5. Bilunarþol. Lausnin verður að vera nógu stöðug og geta lifað af fall hvers hluta (upp að ákveðnum fjölda, auðvitað).

arkitektúr

Almennt séð, fyrir þessa tegund af verkefnum, hefur klassískur arkitektúr lengi verið fundinn upp sem gerir skilvirka mælikvarða. Myndin sýnir dæmi um lausn okkar.

Við tökum við 10 viðburði í Yandex.Cloud. 000. hluti

Svo það sem við höfum:

1. Vinstra megin eru tækin okkar sem búa til ýmsa viðburði, hvort sem það eru leikmenn sem klára stig í leikfangi í snjallsíma eða búa til pöntun í netverslun í gegnum venjulegan vafra. Atburður, eins og tilgreint er í forskriftinni, er einfalt json sem er sent á endapunktinn okkar - events.kis.im.

2. Fyrstu tveir netþjónarnir eru einfaldir jafnvægismenn, helstu verkefni þeirra eru:

  • Vertu stöðugt til taks. Til að gera þetta geturðu notað til dæmis keepalived, sem mun skipta sýndar-IP á milli hnúta ef vandamál koma upp.
  • Hætta TLS. Já, við munum hætta TLS á þeim. Í fyrsta lagi þannig að lausnin okkar uppfylli tækniforskriftirnar og í öðru lagi til að létta álagi við að koma á dulkóðuðu sambandi frá bakendaþjónum okkar.
  • Jafnvægi komandi beiðna til tiltækra bakendaþjóna. Lykilorðið hér er aðgengilegt. Út frá þessu komumst við að þeim skilningi að álagsjafnarar verða að geta fylgst með netþjónum okkar með forritum og stöðvað jafnvægi á umferð til bilaðra hnúta.

3. Eftir jafnvægismennina erum við með forritaþjóna sem keyra frekar einfalt forrit. Það ætti að geta tekið við beiðnum sem berast í gegnum HTTP, staðfest sent json og sett gögnin í biðminni.

4. Skýringarmyndin sýnir kafka sem biðminni, þó að auðvitað sé hægt að nota aðra svipaða þjónustu á þessu stigi. Við munum bera saman Kafka, rabbitmq og yqs í þriðju greininni.

5. Næstsíðasti punkturinn í arkitektúrnum okkar er Clickhouse - dálkagagnagrunnur sem gerir þér kleift að geyma og vinna mikið magn af gögnum. Á þessu stigi þurfum við að flytja gögn úr biðminni yfir í geymslukerfið sjálft (nánar um þetta í grein 4).

Þessi hönnun gerir okkur kleift að skala hvert lag sjálfstætt lárétt. Bakendaþjónar geta ekki ráðið við - við skulum bæta einu við - þegar allt kemur til alls eru þetta ríkisfangslaus forrit og því er hægt að gera þetta sjálfkrafa. Kafka-stíl biðminni virkar ekki - við skulum bæta við fleiri netþjónum og flytja hluta af skiptingum efnisins okkar yfir á þá. Clickhouse ræður ekki við það - það er ómögulegt :) Reyndar munum við líka tengja netþjónana og brjóta niður gögnin.

Við the vegur, ef þú vilt innleiða valfrjálsa hluta tækniforskrifta okkar og mælikvarða á mismunandi landfræðilegum staðsetningum, þá er ekkert einfaldara:

Við tökum við 10 viðburði í Yandex.Cloud. 000. hluti

Í hverri landfræðilegri staðsetningu notum við hleðslujafnara með umsókn og kafka. Almennt séð eru 2 forritaþjónar, 3 kafka hnútar og skýjajafnari, til dæmis cloudflare, nóg, sem mun athuga framboð á forritahnútum og jafnvægisbeiðnir eftir landfræðilegri staðsetningu byggt á uppruna IP tölu viðskiptavinarins. Þannig munu gögn send af amerískum viðskiptavin lenda á bandarískum netþjónum. Og gögn frá Afríku eru á afríku.

Þá er allt frekar einfalt - við notum spegiltólið úr Kafka settinu og afritum öll gögn frá öllum stöðum í miðlæga gagnaverið okkar í Rússlandi. Innbyrðis þáttum við gögnin og skráum þau í Clickhouse til að sýna síðar.

Svo, við höfum raðað út arkitektúr - við skulum byrja að hrista Yandex.Cloud!

Að skrifa umsókn

Fyrir skýið þarftu samt að vera smá þolinmóður og skrifa frekar einfalda þjónustu til að vinna úr komandi atburðum. Við munum nota golang vegna þess að það hefur reynst mjög vel sem tungumál til að skrifa netforrit.

Eftir að hafa eytt klukkutíma (kannski nokkra klukkutíma) fáum við eitthvað á þessa leið: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Hver eru helstu atriðin sem ég vil benda á hér:

1. Þegar þú byrjar forritið geturðu tilgreint tvo fána. Einn er ábyrgur fyrir höfninni sem við munum hlusta á komandi http beiðnir (-addr). Annað er fyrir netfang kafka netþjónsins þar sem við munum taka upp atburði okkar (-kafka):

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

2. Forritið notar sarama bókasafnið ([] github.com/Shopify/sarama) að senda skilaboð til kafkaklasans. Við stillum strax stillingar sem miða að hámarks vinnsluhraða:

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

3. Forritið okkar hefur einnig innbyggðan prometheus viðskiptavin, sem safnar ýmsum mæligildum, svo sem:

  • fjöldi beiðna í umsókn okkar;
  • fjöldi villna við framkvæmd beiðninnar (ómögulegt að lesa færslubeiðni, bilað json, ómögulegt að skrifa til Kafka);
  • afgreiðslutími fyrir eina beiðni frá viðskiptavini, þar á meðal tími til að skrifa skilaboð til Kafka.

4. Þrír endapunktar sem umsókn okkar vinnur úr:

  • /status - skilaðu einfaldlega í lagi til að sýna að við séum á lífi. Þó að þú getir bætt við nokkrum ávísunum, svo sem framboði á Kafka þyrpingunni.
  • /metrics - samkvæmt þessari slóð mun prometheus viðskiptavinurinn skila þeim mæligildum sem hann hefur safnað.
  • /post er aðal endapunkturinn þar sem POST beiðnir með json inni verða sendar. Forritið okkar athugar json fyrir réttmæti og ef allt er í lagi skrifar það gögnin í Kafka þyrpinguna.

Ég mun setja fyrirvara um að kóðinn sé ekki fullkominn - það er hægt (og ætti!) að klára hann. Til dæmis geturðu hætt að nota innbyggða netið/http og skipt yfir í hraðvirkara http. Eða þú getur fengið vinnslutíma og örgjörvaauðlindir með því að færa json-gildisathugunina á síðara stig - þegar gögnin eru flutt úr biðminni yfir í smellihúsaþyrpinguna.

Til viðbótar við þróunarhlið málsins, hugsuðum við strax um framtíðarinnviði okkar og ákváðum að dreifa forritinu okkar í gegnum docker. Loka Dockerfile til að byggja forritið er https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Almennt séð er það frekar einfalt, eina atriðið sem ég vil gefa gaum að er fjölþrepa samsetningin, sem gerir okkur kleift að draga úr endanlegri mynd af ílátinu okkar.

Fyrstu skrefin í skýinu

Fyrst af öllu, skráðu þig inn cloud.yandex.ru. Eftir að hafa fyllt út alla nauðsynlega reiti verður búið til reikning og veittur styrkur fyrir ákveðna upphæð sem hægt er að nota til að prófa skýjaþjónustu. Ef þú vilt endurtaka öll skrefin úr greininni okkar ætti þessi styrkur að vera nóg fyrir þig.

Eftir skráningu verður sérstakt ský og sjálfgefin möppu búin til fyrir þig, þar sem þú getur byrjað að búa til skýjaauðlindir. Almennt séð, í Yandex.Cloud, lítur samband auðlinda svona út:

Við tökum við 10 viðburði í Yandex.Cloud. 000. hluti

Þú getur búið til nokkur ský fyrir einn reikning. Og inni í skýinu, búðu til mismunandi möppur fyrir mismunandi fyrirtækisverkefni. Þú getur lesið meira um þetta í skjölunum - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Við the vegur mun ég oft vísa til þess hér fyrir neðan í textanum. Þegar ég setti upp alla innviði frá grunni, hjálpuðu skjölin mér oftar en einu sinni, svo ég ráðlegg þér að kynna þér það.

Til að stjórna skýinu geturðu notað bæði vefviðmótið og stjórnborðsforritið - yc. Uppsetning er framkvæmd með einni skipun (fyrir Linux og Mac OS):

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

Ef sérfræðingur þinn í innra öryggismálum er ofsafenginn um að keyra forskriftir af netinu, þá geturðu í fyrsta lagi opnað handritið og lesið það, og í öðru lagi keyrum við það undir notandanum okkar - án rótarréttinda.

Ef þú vilt setja upp biðlara fyrir Windows geturðu notað leiðbeiningarnar hér og framkvæma síðan yc inittil að aðlaga það að fullu:

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

Í grundvallaratriðum er ferlið einfalt - fyrst þarftu að fá oauth tákn til að stjórna skýinu, veldu skýið og möppuna sem þú munt nota.

Ef þú ert með nokkra reikninga eða möppur í sama skýinu geturðu búið til viðbótarsnið með aðskildum stillingum með yc config profile create og skipt á milli þeirra.

Til viðbótar við ofangreindar aðferðir skrifaði Yandex.Cloud teymið mjög gott viðbót fyrir terraform til að stjórna skýjaauðlindum. Fyrir mitt leyti útbjó ég git geymslu þar sem ég lýsti öllum auðlindum sem verða til sem hluti af greininni - https://github.com/rebrainme/yandex-cloud-events/. Við höfum áhuga á meistaragreininni, við skulum klóna hana á staðnum:


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/

Allar helstu breytur sem eru notaðar í terraform eru skrifaðar í main.tf skrána. Til að byrja skaltu búa til private.auto.tfvars skrá í terraform möppunni með eftirfarandi innihaldi:

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

Allar breytur er hægt að taka úr yc config listanum, þar sem við höfum þegar stillt stjórnborðsforritið. Ég ráðlegg þér að bæta private.auto.tfvars strax við .gitignore, til að birta ekki persónuleg gögn fyrir slysni.

Í private.auto.tfvars tilgreindum við einnig gögn frá Cloudflare - til að búa til DNS færslur og umboð aðallénsins events.kis.im fyrir netþjóna okkar. Ef þú vilt ekki nota cloudflare, fjarlægðu þá frumstillingu cloudflare-veitunnar í main.tf og dns.tf skránni, sem ber ábyrgð á að búa til nauðsynlegar dns-færslur.

Í vinnu okkar munum við sameina allar þrjár aðferðirnar - vefviðmótið, stjórnborðsforritið og terraform.

Sýndarnet

Til að vera heiðarlegur gætirðu sleppt þessu skrefi, þar sem þegar þú býrð til nýtt ský, verður þú sjálfkrafa búin til sérstakt net og 3 undirnet - eitt fyrir hvert framboðssvæði. En við viljum samt búa til sérstakt net fyrir verkefnið okkar með eigin heimilisfangi. Almenn skýringarmynd um hvernig netið virkar í Yandex.Cloud er sýnt á myndinni hér að neðan (heiðarlega tekið úr https://cloud.yandex.ru/docs/vpc/concepts/)

Við tökum við 10 viðburði í Yandex.Cloud. 000. hluti

Þannig að þú býrð til sameiginlegt net þar sem auðlindir geta átt samskipti sín á milli. Fyrir hvert framboðssvæði er undirnet búið til með eigin heimilisfangi og tengt við almenna netið. Fyrir vikið geta allar skýjaauðlindir í því átt samskipti, jafnvel þótt þær séu á mismunandi framboðssvæðum. Auðlindir tengdar mismunandi skýjanetum geta aðeins séð hvert annað í gegnum ytri vistföng. Við the vegur, hvernig virkar þessi galdur inni, var vel lýst á Habré.

Netsköpun er lýst í network.tf skránni frá geymslunni. Þar búum við til eitt sameiginlegt einkanet innanhúss og tengjum þrjú undirnet við það á mismunandi framboðssvæðum - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24) ).

Frumstilla terraform og búa til net:

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.

Frábært! Við höfum búið til okkar netkerfi og erum nú tilbúin að búa til innri þjónustu okkar.

Að búa til sýndarvélar

Til að prófa forritið þurfum við aðeins að búa til tvær sýndarvélar - við þurfum þá fyrri til að smíða og keyra forritið, hina til að keyra kafka, sem við munum nota til að geyma skilaboð sem berast. Og við munum búa til aðra vél þar sem við munum stilla Prometheus til að fylgjast með forritinu.

Sýndarvélarnar verða stilltar með því að nota ansible, svo áður en þú byrjar terraform skaltu ganga úr skugga um að þú sért með eina af nýjustu útgáfunum af ansible. Og settu upp nauðsynleg hlutverk með 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) $

Inni í ansible möppunni er dæmi um .ansible.cfg stillingarskrá sem ég nota. Það gæti komið sér vel.

Áður en þú býrð til sýndarvélar skaltu ganga úr skugga um að þú hafir ssh-agent í gangi og ssh lykil bætt við, annars mun terraform ekki geta tengst vélunum sem búið var til. Ég rakst auðvitað á villu í os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Til að koma í veg fyrir að þetta gerist aftur, bættu lítilli breytu við env áður en þú ræsir Terraform:

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

Í möppunni með terraform búum við til nauðsynleg úrræði:

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

Ef allt endaði með góðum árangri (og það ætti að vera), þá munum við hafa þrjár sýndarvélar:

  1. byggja - vél til að prófa og byggja upp forrit. Docker var sett upp sjálfkrafa af Ansible.
  2. vöktun - eftirlitsvél - prometheus & grafana sett upp á það. Innskráning / lykilorð staðall: admin / admin
  3. kafka er lítil vél með kafka uppsettum, aðgengileg á port 9092.

Við skulum ganga úr skugga um að þeir séu allir á sínum stað:

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

Úrræðin eru til staðar og héðan getum við fengið IP tölur þeirra. Í öllu því sem hér fer á eftir mun ég nota IP tölur til að tengjast í gegnum ssh og prófa forritið. Ef þú ert með cloudflare reikning tengdan terraform, ekki hika við að nota nýstofnuð DNS nöfn.
Við the vegur, þegar þú býrð til sýndarvél, er innri IP og innra DNS nafn gefið upp, svo þú getur fengið aðgang að netþjónum innan netsins með nafni:

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

Þetta mun vera gagnlegt fyrir okkur til að gefa forritinu til kynna endapunktinn með kafk.

Að setja saman forritið

Frábært, það eru netþjónar, það er forrit - það eina sem er eftir er að setja það saman og birta það. Fyrir smíðina munum við nota venjulega bryggjusmíði, en sem myndgeymslu munum við nota þjónustu frá Yandex - gámaskrá. En fyrst og fremst.

Við afritum forritið í byggingarvélina, skráum okkur inn í gegnum ssh og setjum saman myndina:

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

Hálfum bardaganum er lokið - nú getum við athugað virkni forritsins okkar með því að ræsa það og senda það til 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) $

Forritið svaraði með góðum árangri við upptökuna og gaf til kynna auðkenni skiptingarinnar og mótvægis sem skilaboðin voru innifalin í. Allt sem er eftir að gera er að búa til skrásetningu í Yandex.Cloud og hlaða upp myndinni okkar þangað (hvernig á að gera þetta með þremur línum er lýst í registry.tf skránni). Búðu til geymslu:

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.

Það eru nokkrar leiðir til að auðkenna í gámaskránni - með oauth tákni, iam tákni eða þjónustureikningslykli. Nánari upplýsingar um þessar aðferðir er að finna í skjölunum. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Við munum nota þjónustureikningslykilinn, þannig að við búum til reikning:

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.

Nú er allt sem er eftir að búa til lykil fyrir það:

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

Við fáum upplýsingar um auðkenni geymslunnar okkar, flytjum lykilinn og skráum okkur inn:

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

Til að hlaða upp myndinni í skrásetninguna þurfum við gámaskráningarauðkennið, við tökum það úr yc tólinu:

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

Eftir það merkjum við myndina okkar með nýju nafni og sendum inn:

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

Við getum staðfest að myndin hafi verið hlaðin með góðum árangri:

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

Við the vegur, ef þú setur upp yc tólið á Linux vél geturðu notað skipunina

yc container registry configure-docker

til að stilla docker.

Ályktun

Við höfum lagt mikið á okkur og þar af leiðandi:

  1. Við komum með arkitektúr framtíðarþjónustu okkar.
  2. Við skrifuðum forrit í golang sem útfærir viðskiptarökfræði okkar.
  3. Við söfnuðum því og helltum því í einkagámaskrá.

Í næsta hluta förum við yfir í áhugaverða hluti - við munum gefa út forritið okkar í framleiðslu og loksins ræsa álagið á það. Ekki skipta!

Þetta efni er í myndbandsupptöku af opnu verkstæðinu REBRAIN & Yandex.Cloud: Við tökum við 10 beiðnum á sekúndu á Yandex Cloud - https://youtu.be/cZLezUm0ekE

Ef þú hefur áhuga á að mæta á slíka viðburði á netinu og spyrja spurninga í rauntíma skaltu tengjast DevOps eftir REBRAIN rás.

Við viljum þakka Yandex.Cloud sérstaklega fyrir tækifærið til að halda slíkan viðburð. Tengill á þá - https://cloud.yandex.ru/prices

Ef þú þarft að fara í skýið eða hefur spurningar um innviði þína, Ekki hika við að senda inn beiðni.

PS Við erum með 2 ókeypis úttektir á mánuði, ef til vill verður verkefnið þitt eitt af þeim.

Heimild: www.habr.com

Bæta við athugasemd