Nou aksepte 10 evènman nan Yandex.Cloud. Pati 000

Bonjou tout moun, zanmi!

* Atik sa a baze sou atelye louvri REBRAIN & Yandex.Cloud, si ou prefere gade videyo a, ou ka jwenn li nan lyen sa a - https://youtu.be/cZLezUm0ekE

Nou dènyèman te gen opòtinite pou eseye Yandex.Cloud ap viv. Depi nou te vle sonde long ak difisil, nou imedyatman abandone lide pou lanse yon senp blog Wordpress ak yon baz nwaj - li te twò raz. Apre kèk reflechi, nou deside deplwaye yon bagay ki sanble ak yon achitekti sèvis pwodiksyon pou resevwa ak analize evènman nan mòd prèske tan reyèl.

Mwen se absoliman asire w ke a vas majorite nan biznis sou entènèt (epi pa sèlman) yon jan kanmenm kolekte yon mòn nan enfòmasyon sou itilizatè yo ak aksyon yo. Nan yon minimòm, sa nesesè pou pran sèten desizyon - pou egzanp, si ou jere yon jwèt sou entènèt, ou ka gade nan estatistik yo ki nivo itilizatè yo pi souvan bloke epi efase jwèt ou a. Oswa poukisa itilizatè yo kite sit ou san yo pa achte anyen (alo, Yandex.Metrica).

Se konsa, istwa nou an: ki jan nou te ekri yon aplikasyon nan golang, teste kafka vs rabbitmq vs yqs, te ekri done difizyon nan yon gwoup Clickhouse ak vizyalize done yo lè l sèvi avèk yandex datalens. Natirèlman, tout bagay sa yo te sezonman ak plezi enfrastrikti nan fòm lan nan docker, terraform, gitlab ci ak, nan kou, prometheus. Ann ale!

Mwen ta renmen imedyatman fè yon rezèvasyon ke nou pa pral kapab configured tout bagay nan yon sèl chita - pou sa a nou pral bezwen plizyè atik nan seri a. Yon ti kras sou estrikti a:

Pati 1 (w ap li li). Nou pral deside sou espesifikasyon yo ak achitekti nan solisyon an, epi tou ekri yon aplikasyon nan golang.
Pati 2. Nou lage aplikasyon nou an nan pwodiksyon, fè li évolutive epi teste chaj la.
Pati 3. Ann eseye konnen poukisa nou bezwen estoke mesaj nan yon tanpon epi yo pa nan dosye, epi tou konpare kafka, rabbitmq ak yandex keu sèvis.
Pati 4 Nou pral deplwaye yon gwoup Clickhouse, ekri yon sèvis difizyon pou transfere done ki soti nan tanpon an la, epi mete vizyalizasyon nan datalens.
Pati 5 Ann mete tout enfrastrikti a nan fòm apwopriye - mete kanpe ci/cd lè l sèvi avèk gitlab ci, konekte siveyans ak dekouvèt sèvis lè l sèvi avèk prometheus ak konsil.

TK

Premyèman, se pou yo fòmile tèm referans yo - ki sa egzakteman nou vle jwenn kòm yon rezilta.

  1. Nou vle gen yon pwen final tankou events.kis.im (kis.im se domèn tès ke nou pral itilize nan tout atik yo), ki ta dwe resevwa evènman lè l sèvi avèk HTTPS.
  2. Evènman yo se yon json senp tankou: {"evènman": "view", "os": "linux", "browser": "chrome"}. Nan etap final la nou pral ajoute yon ti kras plis jaden, men sa a pa pral jwe yon gwo wòl. Si ou vle, ou ka chanje nan protobuf.
  3. Sèvis la dwe kapab trete 10 evènman pou chak segonn.
  4. Li ta dwe posib pou echèl orizontal pa senpleman ajoute nouvo egzanp nan solisyon nou an. Epi li pral bèl si nou ka deplase pati devan an nan diferan jeolokalizasyon pou redwi latansi pou demann kliyan yo.
  5. Fòt tolerans. Solisyon an dwe estab ase epi yo dwe kapab siviv sezon otòn la nan nenpòt ki pati (jiska yon sèten kantite, nan kou).

achitekti

An jeneral, pou kalite travay sa a, achitekti klasik yo te envante depi lontan ki pèmèt dekale efikas. Figi a montre yon egzanp solisyon nou an.

Nou aksepte 10 evènman nan Yandex.Cloud. Pati 000

Se konsa, sa nou genyen:

1. Sou bò gòch la se aparèy nou yo ki jenere evènman divès kalite, kit se jwè ranpli yon nivo nan yon jwèt sou yon smartphone oswa kreye yon lòd nan yon magazen sou entènèt atravè yon navigatè regilye. Yon evènman, jan sa espesifye nan spesifikasyon la, se yon senp json ki voye nan pwen final nou an - events.kis.im.

2. De premye sèvè yo se balanse senp, travay prensipal yo se:

  • Toujou disponib. Pou fè sa, ou ka itilize, pou egzanp, keepalived, ki pral chanje IP vityèl ant nœuds nan ka ta gen pwoblèm.
  • Mete fen nan TLS. Wi, nou pral sispann TLS sou yo. Premyèman, pou solisyon nou an konfòme ak espesifikasyon teknik yo, epi dezyèmman, yo nan lòd yo soulaje fado a nan etabli yon koneksyon chiffres soti nan serveurs backend nou yo.
  • Balanse demann k ap rantre nan sèvè backend ki disponib. Mo kle isit la aksesib. Ki baze sou sa a, nou vin konprann ke balanse chaj yo dwe kapab kontwole sèvè nou yo ak aplikasyon yo epi yo sispann balanse trafik nan nœuds echwe.

3. Apre balanse yo, nou gen serveurs aplikasyon kouri yon aplikasyon san patipri senp. Li ta dwe kapab aksepte demann fèk ap rantre atravè HTTP, valide json voye a epi mete done yo nan yon tanpon.

4. Dyagram nan montre kafka kòm yon tanpon, byenke, nan kou, lòt sèvis menm jan an ka itilize nan nivo sa a. Nou pral konpare Kafka, rabbitmq ak yqs nan twazyèm atik la.

5. Penultyèm pwen nan achitekti nou an se Clickhouse - yon baz done kolon ki pèmèt ou estoke ak trete yon gwo kantite done. Nan nivo sa a, nou bezwen transfere done ki soti nan tanpon nan sistèm nan depo tèt li (plis sou sa a nan atik 4).

Konsepsyon sa a pèmèt nou echèl chak kouch poukont orizontal. Sèvè backend pa ka fè fas - ann ajoute yon lòt bagay - apre tout, yo se aplikasyon apatrid, ak Se poutèt sa, sa ka fè menm otomatikman. Tanpon Kafka-style la pa travay—an nou ajoute plis serveurs epi transfere kèk nan patisyon yo nan sijè nou an ba yo. Clickhouse pa ka okipe li - li enposib :) An reyalite, nou pral konekte tou serveurs yo ak shard done yo.

By wout la, si ou vle aplike pati nan opsyonèl nan espesifikasyon teknik nou yo ak echèl nan diferan jeolokalizasyon, Lè sa a, pa gen anyen ki pi senp:

Nou aksepte 10 evènman nan Yandex.Cloud. Pati 000

Nan chak jeolokalizasyon nou deplwaye yon balans chaj ak aplikasyon ak kafka. An jeneral, 2 sèvè aplikasyon, 3 kafka nœuds ak yon balans nwaj, pou egzanp, cloudflare, yo ase, ki pral tcheke disponiblite a nan nœuds aplikasyon ak demann balans pa jeolokalizasyon ki baze sou adrès IP sous kliyan an. Kidonk, done yon kliyan Ameriken voye ap ateri sou serveurs Ameriken yo. Ak done ki soti nan Afrik se nan Afriken.

Lè sa a, tout bagay se byen senp - nou itilize zouti nan glas ki soti nan seri a Kafka epi kopye tout done ki soti nan tout kote nan sant done santral nou an ki sitiye nan Larisi. Entèn, nou analize done yo epi anrejistre yo nan Clickhouse pou vizyalizasyon ki vin apre.

Se konsa, nou te regle achitekti a - ann kòmanse souke Yandex.Cloud!

Ekri yon aplikasyon

Anvan Cloud la, ou toujou gen yon ti pasyans epi ekri yon sèvis jistis senp pou trete evènman fèk ap rantre. Nou pral sèvi ak golang paske li te pwouve tèt li trè byen kòm yon lang pou ekri aplikasyon rezo.

Apre nou pase yon èdtan (petèt yon koup de èdtan), nou jwenn yon bagay tankou sa a: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Ki pwen prensipal mwen ta renmen remake isit la:

1. Lè w kòmanse aplikasyon an, ou ka presize de drapo. Youn responsab pou pò a kote nou pral koute demann http fèk ap rantre (-addr). Dezyèm lan se pou adrès sèvè kafka kote nou pral anrejistre evènman nou yo (-kafka):

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

2. Aplikasyon an sèvi ak bibliyotèk sarama ([] github.com/Shopify/sarama) pou voye mesaj bay gwoup kafka a. Nou imedyatman mete anviwònman yo ki vize a vitès maksimòm pwosesis:

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

3. Aplikasyon nou an gen tou yon kliyan prometheus entegre, ki kolekte divès kalite mezi, tankou:

  • kantite demann nan aplikasyon nou an;
  • kantite erè lè w ap egzekite demann lan (enposib pou li post demann, json kase, enposib pou ekri Kafka);
  • tan pwosesis pou yon demann nan men kliyan an, ki gen ladan tan pou ekri yon mesaj bay Kafka.

4. Twa pwen final ke aplikasyon nou an trete:

  • /status - tou senpleman retounen ok pou montre ke nou vivan. Malgre ke ou ka ajoute kèk chèk, tankou disponiblite a nan gwoup la Kafka.
  • /metrics - dapre url sa a, kliyan prometheus la pral retounen mezi li te kolekte yo.
  • /post se pwen prensipal kote demann POST ak json andedan yo pral voye. Aplikasyon nou an tcheke json pou validite epi si tout bagay anfòm, li ekri done yo nan gwoup Kafka la.

Mwen pral fè yon rezèvasyon ke kòd la pa pafè - li ka (e yo ta dwe!) dwe ranpli. Pou egzanp, ou ka sispann sèvi ak net/http la entegre epi chanje nan pi vit http la. Oswa ou ka jwenn tan pwosesis ak resous CPU lè w deplase chèk validite json la nan yon etap pita - lè done yo transfere soti nan tanpon a nan gwoup la Clickhouse.

Anplis de devlopman nan pwoblèm nan, nou imedyatman te panse sou enfrastrikti fiti nou an ak deside deplwaye aplikasyon nou an atravè Docker. Dockerfile final la pou bati aplikasyon an se https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. An jeneral, li se byen senp, pwen an sèlman ke mwen ta renmen peye atansyon a se asanble a plizyè etap, ki pèmèt nou diminye imaj final la nan veso nou an.

Premye etap nan nwaj la

Premye a tout, enskri sou cloud.yandex.ru. Apre ranpli tout jaden ki nesesè yo, yo pral kreye yon kont epi yo pral ba nou yon sibvansyon pou yon sèten kantite lajan, ki ka itilize yo teste sèvis nwaj yo. Si ou vle repete tout etap sa yo nan atik nou an, sibvansyon sa a ta dwe ase pou ou.

Apre enskripsyon an, yo pral kreye yon nwaj separe ak yon anyè default pou ou, kote ou ka kòmanse kreye resous nwaj yo. An jeneral, nan Yandex.Cloud, relasyon resous yo sanble sa a:

Nou aksepte 10 evènman nan Yandex.Cloud. Pati 000

Ou ka kreye plizyè nwaj pou yon kont. Ak anndan nwaj la, fè diferan répertoires pou pwojè konpayi diferan. Ou ka li plis sou sa a nan dokiman an - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. By wout la, mwen pral souvan refere li anba a nan tèks la. Lè m 'te mete tout enfrastrikti a nan grafouyen, dokiman an te ede m' soti plis pase yon fwa, kidonk mwen konseye w etidye li.

Pou jere nwaj la, ou ka itilize tou de koòdone entènèt la ak sèvis piblik konsole - yc. Enstalasyon fèt ak yon sèl kòmand (pou Linux ak Mac Os):

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

Si espesyalis sekirite entèn ou a ap move sou kouri scripts soti nan entènèt la, Lè sa a, premyèman, ou ka louvri script la epi li li, epi dezyèmman, nou kouri li anba itilizatè nou an - san dwa rasin.

Si ou vle enstale yon kliyan pou Windows, ou ka itilize enstriksyon yo isit la epi answit egzekite yc initkonplètman Customize li:

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

Nan prensip, pwosesis la se senp - premye ou bezwen jwenn yon siy oauth jere nwaj la, chwazi nwaj la ak katab la ou pral itilize.

Si ou gen plizyè kont oswa dosye nan menm nwaj la, ou ka kreye pwofil adisyonèl ak paramèt separe atravè yc konfig pwofil kreye epi chanje ant yo.

Anplis de metòd ki anwo yo, ekip Yandex.Cloud te ekri yon trè bon plugin pou terraform pou jere resous nwaj yo. Bò kote mwen, mwen te prepare yon depo git, kote mwen te dekri tout resous ki pral kreye kòm yon pati nan atik la - https://github.com/rebrainme/yandex-cloud-events/. Nou enterese nan branch mèt la, ann klonaj li lokalman:


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/

Tout varyab prensipal yo itilize nan terraform yo ekri nan dosye main.tf. Pou kòmanse, kreye yon fichye private.auto.tfvars nan katab terraform la ak kontni sa a:

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

Tout varyab yo ka pran nan lis la konfigirasyon yc, paske nou te deja konfigirasyon sèvis piblik la konsole. Mwen konseye w imedyatman ajoute private.auto.tfvars nan .gitignore, pou pa aksidantèlman pibliye done prive.

Nan private.auto.tfvars nou tou espesifye done ki soti nan Cloudflare - yo kreye dosye DNS ak proxy domèn prensipal events.kis.im nan sèvè nou yo. Si ou pa vle sèvi ak cloudflare, Lè sa a, retire inisyalizasyon founisè a cloudflare nan main.tf ak dosye a dns.tf, ki responsab pou kreye dosye dns ki nesesè yo.

Nan travay nou an nou pral konbine tout twa metòd - koòdone entènèt la, sèvis piblik konsole a, ak terraform.

Rezo vityèl

Pou w onèt, ou ta ka sote etap sa a, paske lè ou kreye yon nouvo nwaj, ou pral otomatikman gen yon rezo separe ak 3 sous-rezo kreye - youn pou chak zòn disponiblite. Men, nou ta toujou renmen fè yon rezo separe pou pwojè nou an ak pwòp adrès pa li. Dyagram jeneral ki jan rezo a ap travay nan Yandex.Cloud yo montre nan figi ki anba a (onètman te pran nan https://cloud.yandex.ru/docs/vpc/concepts/)

Nou aksepte 10 evènman nan Yandex.Cloud. Pati 000

Se konsa, ou kreye yon rezo komen nan ki resous yo ka kominike youn ak lòt. Pou chak zòn disponiblite, yo kreye yon sous-rezo ki gen pwòp adrès li epi ki konekte ak rezo jeneral la. Kòm yon rezilta, tout resous nwaj nan li ka kominike, menm si yo nan zòn disponiblite diferan. Resous ki konekte nan rezo nwaj diferan yo ka wè youn ak lòt sèlman atravè adrès ekstèn. By wout la, ki jan maji sa a travay andedan, te byen dekri sou Habré.

Kreyasyon rezo a dekri nan fichye network.tf ki soti nan depo a. Se la nou kreye yon rezo prive komen entèn epi konekte twa sous-rezo yo nan diferan zòn disponiblite - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24). ).

Inisyalize terraform epi kreye rezo:

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.

Gwo! Nou te kreye rezo nou an e kounye a nou pare pou kreye sèvis entèn nou yo.

Kreye machin vityèl

Pou teste aplikasyon an, nou pral sèlman bezwen kreye de machin vityèl - nou pral bezwen premye nan bati ak kouri aplikasyon an, dezyèm nan kouri kafka, ke nou pral itilize nan magazen mesaj fèk ap rantre. Epi nou pral kreye yon lòt machin kote nou pral configured prometheus pou kontwole aplikasyon an.

Machin vityèl yo pral konfigirasyon lè l sèvi avèk ansible, kidonk anvan ou kòmanse terraform, asire w ke ou gen youn nan dènye vèsyon ansible yo. Epi enstale wòl ki nesesè yo ak galaksi ansib:

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

Anndan katab la ansible gen yon egzanp fichye konfigirasyon .ansible.cfg ke mwen itilize. Li ta ka vin an sou la men.

Anvan ou kreye machin vityèl, asire w ke ou gen ssh-agent kouri ak yon kle ssh te ajoute, otreman terraform pa yo pral kapab konekte ak machin yo kreye. Mwen, nan kou, te rankontre yon ensèk nan os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Pou anpeche sa a rive ankò, ajoute yon ti varyab nan env anvan ou lanse Terraform:

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

Nan katab la ak terraform nou kreye resous ki nesesè yo:

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

Si tout bagay te fini avèk siksè (e li ta dwe), Lè sa a, nou pral gen twa machin vityèl:

  1. bati - yon machin pou fè tès ak bati yon aplikasyon. Docker te enstale otomatikman pa Ansible.
  2. siveyans - yon machin siveyans - prometheus & grafana enstale sou li. Login / modpas estanda: admin / admin
  3. kafka se yon ti machin ki gen kafka enstale, aksesib sou pò 9092.

Ann asire w ke yo tout an plas:

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

Resous yo an plas, epi soti isit la nou ka jwenn adrès IP yo. Pandan tout sa ki annapre yo, mwen pral sèvi ak adrès IP pou konekte via ssh epi teste aplikasyon an. Si ou gen yon kont cloudflare ki konekte ak terraform, ou lib pou itilize non DNS ki fèk kreye.
By wout la, lè w ap kreye yon machin vityèl, yo bay yon IP entèn ak yon non DNS entèn, konsa ou ka jwenn aksè nan sèvè nan rezo a pa non:

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

Sa a pral itil pou nou endike aplikasyon an pwen final ak kafk.

Rasanble aplikasyon an

Gwo, gen serveurs, gen yon aplikasyon - tout sa ki rete se rasanble li epi pibliye li. Pou bati a nou pral sèvi ak bati abityèl Docker, men kòm yon depo imaj nou pral sèvi ak yon sèvis ki soti nan Yandex - rejis veso. Men, premye bagay an premye.

Nou kopye aplikasyon an nan machin nan bati, konekte via ssh epi rasanble imaj la:

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

Mwatye batay la fini - kounye a nou ka tcheke fonksyonalite aplikasyon nou an lè nou lanse li epi voye li bay 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) $

Aplikasyon an te reponn ak siksè nan anrejistreman an epi ki endike id la nan patisyon an ak konpanse nan ki mesaj la te enkli. Tout sa ki rete pou fè se kreye yon rejis nan Yandex.Cloud ak Upload imaj nou an la (ki jan fè sa lè l sèvi avèk twa liy yo dekri nan dosye a registry.tf). Kreye yon depo:

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.

Gen plizyè fason pou otantifye nan rejis veso a - lè l sèvi avèk yon siy oauth, yon siy iam, oswa yon kle kont sèvis. Ou ka jwenn plis detay sou metòd sa yo nan dokiman an. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Nou pral sèvi ak kle kont sèvis la, kidonk nou kreye yon 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.

Koulye a, tout sa ki rete se fè yon kle pou li:

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

Nou resevwa enfòmasyon sou id depo nou an, transfere kle a epi konekte:

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

Pou telechaje imaj la nan rejis la, nou bezwen ID rejis veso a, nou pran li nan sèvis piblik yc la:

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

Apre sa, nou tag imaj nou an ak yon nouvo non epi telechaje:

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

Nou ka verifye ke imaj la chaje avèk siksè:

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

By wout la, si ou enstale sèvis piblik la yc sou yon machin Linux, ou ka itilize lòd la

yc container registry configure-docker

pou konfigirasyon docker.

Konklizyon

Nou te fè anpil travay di e kòm rezilta:

  1. Nou te vini ak achitekti sèvis lavni nou an.
  2. Nou te ekri yon aplikasyon nan golang ki aplike lojik biznis nou an.
  3. Nou ranmase l epi vide l nan yon rejis veso prive.

Nan pwochen pati a, nou pral ale nan bagay ki enteresan - nou pral lage aplikasyon nou an nan pwodiksyon epi finalman lanse chaj la sou li. Pa chanje!

Materyèl sa a se nan anrejistreman videyo a nan atelye louvri REBRAIN & Yandex.Cloud: Nou aksepte demann 10 pou chak segonn sou Yandex Cloud - https://youtu.be/cZLezUm0ekE

Si w enterese patisipe nan evènman sa yo sou entènèt epi poze kesyon an tan reyèl, konekte ak DevOps pa chanèl REBRAIN.

Nou ta renmen di Yandex.Cloud mèsi espesyal pou opòtinite pou òganize yon evènman konsa. Link ak yo - https://cloud.yandex.ru/prices

Si w bezwen ale nan nwaj la oswa si w gen kesyon sou enfrastrikti w la, Ou lib pou w soumèt yon demann.

PS Nou gen 2 odit gratis pa mwa, petèt pwojè ou a pral youn nan yo.

Sous: www.habr.com

Add nouvo kòmantè