Rydym yn derbyn 10 o ddigwyddiadau yn Yandex.Cloud. Rhan 000

Helo pawb, ffrindiau!

* Mae'r erthygl hon yn seiliedig ar weithdy agored REBRAIN & Yandex.Cloud, os yw'n well gennych wylio'r fideo, gallwch ddod o hyd iddo trwy'r ddolen hon - https://youtu.be/cZLezUm0ekE

Yn ddiweddar cawsom gyfle i roi cynnig ar Yandex.Cloud yn fyw. Gan ein bod ni eisiau archwilio'n hir ac yn galed, fe wnaethon ni roi'r gorau ar unwaith i'r syniad o lansio blog Wordpress syml gyda sylfaen cwmwl - roedd yn rhy ddiflas. Ar ôl peth meddwl, fe benderfynon ni ddefnyddio rhywbeth tebyg i bensaernïaeth gwasanaeth cynhyrchu ar gyfer derbyn a dadansoddi digwyddiadau mewn modd amser real bron.

Rwy’n hollol siŵr bod y mwyafrif helaeth o fusnesau ar-lein (ac nid yn unig) rywsut yn casglu mynydd o wybodaeth am eu defnyddwyr a’u gweithredoedd. Ar y lleiaf, mae hyn yn angenrheidiol ar gyfer gwneud rhai penderfyniadau - er enghraifft, os ydych chi'n rheoli gêm ar-lein, gallwch edrych ar yr ystadegau ar ba lefel y mae defnyddwyr yn mynd yn sownd amlaf a dileu'ch tegan. Neu pam mae defnyddwyr yn gadael eich gwefan heb brynu unrhyw beth (helo, Yandex.Metrica).

Felly, ein stori: sut y gwnaethom ysgrifennu cais yn golang, profi kafka vs rabbitmq vs yqs, ysgrifennu ffrydio data mewn clwstwr Clickhouse a delweddu'r data gan ddefnyddio yandex datalens. Yn naturiol, cafodd hyn i gyd ei flasu â danteithion seilwaith ar ffurf docwr, terraform, gitlab ci ac, wrth gwrs, prometheus. Awn ni!

Hoffwn wneud archeb ar unwaith na fyddwn yn gallu ffurfweddu popeth mewn un eisteddiad - ar gyfer hyn bydd angen sawl erthygl yn y gyfres. Ychydig am y strwythur:

Rhan 1 (rydych yn ei ddarllen). Byddwn yn penderfynu ar fanylebau a phensaernïaeth yr ateb, a hefyd yn ysgrifennu cais mewn golang.
Rhan 2 . Rydym yn rhyddhau ein cais i mewn i gynhyrchu, yn ei wneud yn scalable a phrofi'r llwyth.
Rhan 3 . Gadewch i ni geisio darganfod pam mae angen i ni storio negeseuon mewn byffer ac nid mewn ffeiliau, a hefyd yn cymharu kafka, rabbitmq a gwasanaeth ciw yandex.
Rhan 4 Byddwn yn defnyddio clwstwr Clickhouse, yn ysgrifennu gwasanaeth ffrydio i drosglwyddo data o'r byffer yno, ac yn sefydlu delweddu mewn datalens.
Rhan 5 Dewch i ni ddod â'r seilwaith cyfan i siâp cywir - sefydlu ci/cd gan ddefnyddio gitlab ci, cysylltu monitro a darganfod gwasanaeth gan ddefnyddio prometheus a chonswl.

TK

Yn gyntaf, gadewch i ni lunio'r cylch gorchwyl - beth yn union yr ydym am ei gael o ganlyniad.

  1. Rydym am gael diweddbwynt fel events.kis.im (kis.im yw'r parth prawf y byddwn yn ei ddefnyddio trwy'r holl erthyglau), a ddylai dderbyn digwyddiadau gan ddefnyddio HTTPS.
  2. Mae digwyddiadau yn json syml fel: {“digwyddiad”: “view”, “os”: “linux”, “porwr”: “chrome”}. Yn y cam olaf byddwn yn ychwanegu ychydig mwy o feysydd, ond ni fydd hyn yn chwarae rhan fawr. Os dymunwch, gallwch newid i protobuf.
  3. Rhaid i'r gwasanaeth allu prosesu 10 o ddigwyddiadau yr eiliad.
  4. Dylai fod yn bosibl graddio'n llorweddol trwy ychwanegu enghreifftiau newydd at ein datrysiad. A bydd yn braf os gallwn symud y rhan flaen i wahanol geolocations i leihau hwyrni ar gyfer ceisiadau cleientiaid.
  5. Goddefgarwch bai. Rhaid i'r datrysiad fod yn ddigon sefydlog a gallu goroesi cwymp unrhyw rannau (hyd at nifer penodol, wrth gwrs).

pensaernïaeth

Yn gyffredinol, ar gyfer y math hwn o dasg, mae pensaernïaeth glasurol wedi'u dyfeisio ers amser maith sy'n caniatáu graddio effeithlon. Mae'r ffigur yn dangos enghraifft o'n datrysiad.

Rydym yn derbyn 10 o ddigwyddiadau yn Yandex.Cloud. Rhan 000

Felly beth sydd gennym ni:

1. Ar y chwith mae ein dyfeisiau sy'n cynhyrchu digwyddiadau amrywiol, boed yn chwaraewyr yn cwblhau lefel mewn tegan ar ffôn clyfar neu'n creu archeb mewn siop ar-lein trwy borwr rheolaidd. Mae digwyddiad, fel y nodir yn y fanyleb, yn json syml sy'n cael ei anfon at ein diweddbwynt - events.kis.im.

2. Mae'r ddau weinydd cyntaf yn gydbwyswyr syml, a'u prif dasgau yw:

  • Byddwch ar gael yn gyson. I wneud hyn, gallwch ddefnyddio, er enghraifft, cadw'n fyw, a fydd yn newid yr IP rhithwir rhwng nodau rhag ofn y bydd problemau.
  • Terfynu TLS. Byddwn, byddwn yn terfynu TLS arnynt. Yn gyntaf, fel bod ein datrysiad yn cydymffurfio â'r manylebau technegol, ac yn ail, er mwyn lleddfu'r baich o sefydlu cysylltiad wedi'i amgryptio o'n gweinyddwyr backend.
  • Cydbwyso ceisiadau sy'n dod i mewn i weinyddion ôl-wyneb sydd ar gael. Mae'r gair allweddol yma yn hygyrch. Yn seiliedig ar hyn, rydym yn dod i'r ddealltwriaeth bod yn rhaid i gydbwyswyr llwyth allu monitro ein gweinyddwyr gyda chymwysiadau a rhoi'r gorau i gydbwyso traffig i nodau a fethwyd.

3. Ar ôl y balancers, mae gennym weinyddion cais yn rhedeg cais eithaf syml. Dylai allu derbyn ceisiadau sy'n dod i mewn trwy HTTP, dilysu'r json a anfonwyd a rhoi'r data mewn byffer.

4. Mae'r diagram yn dangos kafka fel byffer, er, wrth gwrs, gellir defnyddio gwasanaethau tebyg eraill ar y lefel hon. Byddwn yn cymharu Kafka, rabbitmq ac yqs yn y drydedd erthygl.

5. Pwynt olaf ond un ein pensaernïaeth yw Clickhouse - cronfa ddata golofnog sy'n eich galluogi i storio a phrosesu llawer iawn o ddata. Ar y lefel hon, mae angen i ni drosglwyddo data o'r byffer i'r system storio ei hun (mwy am hyn yn erthygl 4).

Mae'r dyluniad hwn yn caniatáu inni raddio pob haen yn annibynnol yn llorweddol. Ni all gweinyddwyr ôl-wyneb ymdopi - gadewch i ni ychwanegu un peth arall - wedi'r cyfan, maent yn gymwysiadau di-wladwriaeth, ac felly, gellir gwneud hyn hyd yn oed yn awtomatig. Nid yw'r byffer arddull Kafka yn gweithio - gadewch i ni ychwanegu mwy o weinyddion a throsglwyddo rhai o raniad ein pwnc iddynt. Ni all Clickhouse ei drin - mae'n amhosibl :) Mewn gwirionedd, byddwn hefyd yn cysylltu'r gweinyddwyr ac yn rhannu'r data.

Gyda llaw, os ydych chi am weithredu'r rhan ddewisol o'n manylebau technegol a'n graddfa mewn gwahanol geoleoliadau, yna does dim byd symlach:

Rydym yn derbyn 10 o ddigwyddiadau yn Yandex.Cloud. Rhan 000

Ym mhob geoleoliad rydym yn gosod cydbwysedd llwyth gyda chymhwysiad a kafka. Yn gyffredinol, mae 2 weinydd cymhwysiad, 3 nod kafka a chydbwysedd cwmwl, er enghraifft, cloudflare, yn ddigon, a fydd yn gwirio argaeledd nodau cais a cheisiadau cydbwysedd yn ôl geolocation yn seiliedig ar gyfeiriad IP ffynhonnell y cleient. Felly, bydd data a anfonir gan gleient Americanaidd yn glanio ar weinyddion Americanaidd. Ac mae data o Affrica yn Affrica.

Yna mae popeth yn eithaf syml - rydym yn defnyddio'r offeryn drych o'r set Kafka ac yn copïo'r holl ddata o bob lleoliad i'n canolfan ddata ganolog yn Rwsia. Yn fewnol, rydym yn dosrannu'r data ac yn ei gofnodi yn Clickhouse ar gyfer delweddu dilynol.

Felly, rydym wedi rhoi trefn ar y bensaernïaeth - gadewch i ni ddechrau ysgwyd Yandex.Cloud!

Ysgrifennu cais

Cyn y Cwmwl, mae'n rhaid i chi fod ychydig yn amyneddgar o hyd ac ysgrifennu gwasanaeth eithaf syml i brosesu digwyddiadau sy'n dod i mewn. Byddwn yn defnyddio golang oherwydd ei fod wedi profi ei hun yn dda iawn fel iaith ar gyfer ysgrifennu cymwysiadau rhwydwaith.

Ar ôl treulio awr (efallai cwpl o oriau), rydyn ni'n cael rhywbeth fel hyn: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Beth yw’r prif bwyntiau yr hoffwn eu nodi yma:

1. Wrth gychwyn y cais, gallwch nodi dwy faner. Mae un yn gyfrifol am y porthladd lle byddwn yn gwrando ar geisiadau http sy'n dod i mewn (-addr). Mae'r ail ar gyfer cyfeiriad gweinydd kafka lle byddwn yn cofnodi ein digwyddiadau (-kafka):

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

2. Mae'r cais yn defnyddio'r llyfrgell sarama ([] github.com/Shopify/sarama) i anfon negeseuon i'r clwstwr kafka. Fe wnaethom osod y gosodiadau sydd wedi'u hanelu at gyflymder prosesu uchaf ar unwaith:

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

3. Mae gan ein cais hefyd gleient prometheus adeiledig, sy'n casglu amrywiol fetrigau, megis:

  • nifer y ceisiadau i'n cais;
  • nifer y gwallau wrth weithredu'r cais (amhosib darllen y cais post, json wedi torri, amhosib ysgrifennu at Kafka);
  • amser prosesu ar gyfer un cais gan y cleient, gan gynnwys yr amser ar gyfer ysgrifennu neges i Kafka.

4. Tri phwynt terfyn y mae ein prosesau ymgeisio:

  • /status - dychwelwch yn iawn i ddangos ein bod yn fyw. Er y gallwch chi ychwanegu rhai gwiriadau, megis argaeledd clwstwr Kafka.
  • /metrigau - yn ôl yr url hwn, bydd y cleient prometheus yn dychwelyd y metrigau y mae wedi'u casglu.
  • /post yw'r prif bwynt terfyn lle bydd ceisiadau POST gyda json y tu mewn yn cael eu hanfon. Mae ein cais yn gwirio dilysrwydd y json ac os yw popeth yn iawn, mae'n ysgrifennu'r data i glwstwr Kafka.

Byddaf yn gwneud amheuaeth nad yw'r cod yn berffaith - gall (a dylai!) gael ei gwblhau. Er enghraifft, gallwch chi roi'r gorau i ddefnyddio'r rhwyd ​​/ http adeiledig a newid i'r fasthttp cyflymach. Neu gallwch ennill amser prosesu ac adnoddau cpu trwy symud y gwiriad dilysrwydd json i gam diweddarach - pan fydd y data'n cael ei drosglwyddo o'r byffer i'r clwstwr clickhouse.

Yn ogystal ag ochr ddatblygu'r mater, fe wnaethom feddwl ar unwaith am ein seilwaith yn y dyfodol a phenderfynu defnyddio ein cais trwy docwr. Y Dockerfile terfynol ar gyfer adeiladu'r cais yw https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Yn gyffredinol, mae'n eithaf syml, yr unig bwynt yr hoffwn roi sylw iddo yw'r cynulliad aml-gam, sy'n ein galluogi i leihau delwedd derfynol ein cynhwysydd.

Camau cyntaf yn y cwmwl

Yn gyntaf oll, cofrestrwch ymlaen cwmwl.yandex.ru. Ar ôl llenwi'r holl feysydd angenrheidiol, byddwn yn creu cyfrif ac yn cael grant am swm penodol o arian, y gellir ei ddefnyddio i brofi gwasanaethau cwmwl. Os ydych chi am ailadrodd yr holl gamau o'n herthygl, dylai'r grant hwn fod yn ddigon i chi.

Ar ôl cofrestru, bydd cwmwl ar wahân a chyfeiriadur diofyn yn cael eu creu i chi, lle gallwch chi ddechrau creu adnoddau cwmwl. Yn gyffredinol, yn Yandex.Cloud, mae'r berthynas adnoddau yn edrych fel hyn:

Rydym yn derbyn 10 o ddigwyddiadau yn Yandex.Cloud. Rhan 000

Gallwch greu sawl cwmwl ar gyfer un cyfrif. Ac y tu mewn i'r cwmwl, gwnewch gyfeiriaduron gwahanol ar gyfer gwahanol brosiectau cwmni. Gallwch ddarllen mwy am hyn yn y ddogfennaeth - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Gyda llaw, byddaf yn cyfeirio ato isod yn aml yn y testun. Pan sefydlais y seilwaith cyfan o'r dechrau, fe wnaeth y ddogfennaeth fy helpu fwy nag unwaith, felly rwy'n eich cynghori i'w astudio.

I reoli'r cwmwl, gallwch ddefnyddio'r rhyngwyneb gwe a'r cyfleustodau consol - yc. Perfformir y gosodiad gydag un gorchymyn (ar gyfer Linux a Mac Os):

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

Os yw'ch arbenigwr diogelwch mewnol yn gynddeiriog ynghylch rhedeg sgriptiau o'r Rhyngrwyd, yna, yn gyntaf, gallwch chi agor y sgript a'i darllen, ac yn ail, rydyn ni'n ei rhedeg o dan ein defnyddiwr - heb hawliau gwraidd.

Os ydych chi am osod cleient ar gyfer Windows, gallwch ddefnyddio'r cyfarwyddiadau yma ac yna gweithredu yc initi'w addasu'n llawn:

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

Mewn egwyddor, mae'r broses yn syml - yn gyntaf mae angen i chi gael tocyn oauth i reoli'r cwmwl, dewiswch y cwmwl a'r ffolder y byddwch chi'n ei ddefnyddio.

Os oes gennych chi sawl cyfrif neu ffolder o fewn yr un cwmwl, gallwch greu proffiliau ychwanegol gyda gosodiadau ar wahân trwy greu proffil yc config a newid rhyngddynt.

Yn ogystal â'r dulliau uchod, ysgrifennodd tîm Yandex.Cloud dda iawn ategyn ar gyfer terraform ar gyfer rheoli adnoddau cwmwl. O'm rhan i, fe wnes i baratoi ystorfa git, lle disgrifiais yr holl adnoddau a fydd yn cael eu creu fel rhan o'r erthygl - https://github.com/rebrainme/yandex-cloud-events/. Mae gennym ddiddordeb yn y brif gangen, gadewch i ni ei chlonio'n lleol:


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/

Mae'r holl brif newidynnau a ddefnyddir mewn terraform wedi'u hysgrifennu yn y ffeil main.tf. I ddechrau, crëwch ffeil private.auto.tfvars yn y ffolder terraform gyda'r cynnwys canlynol:

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

Gellir cymryd pob newidyn o restr ffurfweddu yc, gan ein bod eisoes wedi ffurfweddu cyfleustodau'r consol. Rwy'n eich cynghori i ychwanegu private.auto.tfvars at .gitignore ar unwaith, er mwyn peidio â chyhoeddi data preifat yn ddamweiniol.

Yn private.auto.tfvars fe wnaethom hefyd nodi data o Cloudflare - i greu cofnodion DNS a dirprwy y prif barth events.kis.im i'n gweinyddion. Os nad ydych am ddefnyddio cloudflare, yna tynnwch gychwyniad y darparwr cloudflare yn main.tf a'r ffeil dns.tf, sy'n gyfrifol am greu'r cofnodion dns angenrheidiol.

Yn ein gwaith byddwn yn cyfuno'r tri dull - y rhyngwyneb gwe, y cyfleustodau consol, a terraform.

Rhwydweithiau rhithwir

I fod yn onest, fe allech chi hepgor y cam hwn, oherwydd pan fyddwch chi'n creu cwmwl newydd, bydd gennych chi rwydwaith ar wahân yn awtomatig a 3 is-rwydwaith wedi'u creu - un ar gyfer pob parth argaeledd. Ond hoffem o hyd wneud rhwydwaith ar wahân ar gyfer ein prosiect gyda'i gyfeiriadau ei hun. Dangosir y diagram cyffredinol o sut mae'r rhwydwaith yn gweithio yn Yandex.Cloud yn y ffigur isod (a gymerwyd yn onest o https://cloud.yandex.ru/docs/vpc/concepts/)

Rydym yn derbyn 10 o ddigwyddiadau yn Yandex.Cloud. Rhan 000

Felly, rydych chi'n creu rhwydwaith cyffredin lle gall adnoddau gyfathrebu â'i gilydd. Ar gyfer pob parth argaeledd, caiff is-rwyd ei greu gyda'i gyfeiriad ei hun a'i gysylltu â'r rhwydwaith cyffredinol. O ganlyniad, gall yr holl adnoddau cwmwl ynddo gyfathrebu, hyd yn oed os ydynt mewn parthau argaeledd gwahanol. Dim ond trwy gyfeiriadau allanol y gall adnoddau sy'n gysylltiedig â gwahanol rwydweithiau cwmwl weld ei gilydd. Gyda llaw, sut mae'r hud hwn yn gweithio y tu mewn, wedi'i ddisgrifio'n dda ar Habré.

Disgrifir creu rhwydwaith yn y ffeil network.tf o'r gadwrfa. Yno rydym yn creu un rhwydwaith preifat cyffredin yn fewnol ac yn cysylltu tri is-rwydwaith ag ef mewn gwahanol barthau argaeledd - mewnol-a (172.16.1.0/24), mewnol-b (172.16.2.0/24), mewnol-c (172.16.3.0/24 ).

Cychwyn terraform a chreu rhwydweithiau:

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.

Gwych! Rydym wedi creu ein rhwydwaith ac yn awr yn barod i greu ein gwasanaethau mewnol.

Creu peiriannau rhithwir

I brofi'r cais, dim ond dau beiriant rhithwir y bydd angen i ni eu creu - bydd angen y cyntaf i adeiladu a rhedeg y cais, yr ail i redeg kafka, y byddwn yn ei ddefnyddio i storio negeseuon sy'n dod i mewn. A byddwn yn creu peiriant arall lle byddwn yn ffurfweddu prometheus i fonitro'r cais.

Bydd y peiriannau rhithwir yn cael eu ffurfweddu gan ddefnyddio ansible, felly cyn dechrau terraform, gwnewch yn siŵr bod gennych chi un o'r fersiynau diweddaraf o anible. A gosodwch y rolau angenrheidiol gyda galaeth 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) $

Y tu mewn i'r ffolder ansible mae enghraifft o ffeil ffurfweddu .ansible.cfg yr wyf yn ei defnyddio. Efallai y bydd yn dod yn ddefnyddiol.

Cyn creu peiriannau rhithwir, gwnewch yn siŵr bod gennych chi ssh-agent yn rhedeg ac allwedd ssh wedi'i ychwanegu, fel arall ni fydd terraform yn gallu cysylltu â'r peiriannau a grëwyd. Des i, wrth gwrs, ar draws byg yn os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Er mwyn atal hyn rhag digwydd eto, ychwanegwch newidyn bach at env cyn lansio Terraform:

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

Yn y ffolder gyda terraform rydym yn creu'r adnoddau angenrheidiol:

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

Pe bai popeth yn dod i ben yn llwyddiannus (a dylai fod), yna bydd gennym dri pheiriant rhithwir:

  1. adeiladu - peiriant ar gyfer profi ac adeiladu cais. Gosodwyd Docker yn awtomatig gan Ansible.
  2. monitro - peiriant monitro - prometheus a grafana wedi'i osod arno. Safon mewngofnodi / cyfrinair: admin / admin
  3. Mae kafka yn beiriant bach gyda kafka wedi'i osod, sy'n hygyrch ar borthladd 9092.

Gadewch i ni sicrhau eu bod i gyd yn eu lle:

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

Mae'r adnoddau yn eu lle, ac o'r fan hon gallwn gael eu cyfeiriadau IP. Trwy gydol yr hyn sy'n dilyn byddaf yn defnyddio cyfeiriadau IP i gysylltu trwy ssh a phrofi'r cymhwysiad. Os oes gennych chi gyfrif cloudflare wedi'i gysylltu â terraform, mae croeso i chi ddefnyddio enwau DNS sydd newydd eu creu.
Gyda llaw, wrth greu peiriant rhithwir, rhoddir IP mewnol ac enw DNS mewnol, fel y gallwch gyrchu gweinyddwyr o fewn y rhwydwaith yn ôl enw:

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

Bydd hyn yn ddefnyddiol i ni nodi i'r cais y pwynt terfyn gyda kafk.

Cydosod y cais

Gwych, mae yna weinyddion, mae yna gymhwysiad - y cyfan sydd ar ôl yw ei ymgynnull a'i gyhoeddi. Ar gyfer yr adeilad byddwn yn defnyddio'r adeilad docwr arferol, ond fel storfa ddelwedd byddwn yn defnyddio gwasanaeth o Yandex - registry registry. Ond pethau cyntaf yn gyntaf.

Rydym yn copïo'r cais i'r peiriant adeiladu, yn mewngofnodi trwy ssh ac yn cydosod y ddelwedd:

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

Mae hanner y frwydr wedi'i chwblhau - nawr gallwn wirio ymarferoldeb ein cais trwy ei lansio a'i anfon at 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) $

Ymatebodd y cais yn llwyddiannus gyda'r recordiad gan nodi id y rhaniad a'r gwrthbwyso y cynhwyswyd y neges ynddynt. Y cyfan sydd ar ôl i'w wneud yw creu cofrestrfa yn Yandex.Cloud a llwytho ein delwedd yno (disgrifir sut i wneud hyn gan ddefnyddio tair llinell yn y ffeil registry.tf). Creu storfa:

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.

Mae yna sawl ffordd o ddilysu yn y gofrestr cynhwysydd - gan ddefnyddio tocyn oauth, tocyn iam, neu allwedd cyfrif gwasanaeth. Ceir rhagor o fanylion am y dulliau hyn yn y ddogfennaeth. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Byddwn yn defnyddio allwedd y cyfrif gwasanaeth, felly rydym yn creu cyfrif:

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.

Nawr y cyfan sydd ar ôl yw gwneud allwedd ar ei gyfer:

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

Rydym yn derbyn gwybodaeth am id ein storfa, yn trosglwyddo'r allwedd a mewngofnodi:

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

I uwchlwytho'r ddelwedd i'r gofrestrfa, mae angen ID cofrestrfa'r cynhwysydd arnom, rydyn ni'n ei chymryd o gyfleustodau yc:

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

Ar ôl hynny, rydyn ni'n tagio ein delwedd gydag enw newydd ac yn uwchlwytho:

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

Gallwn wirio bod y ddelwedd wedi'i llwytho'n llwyddiannus:

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

Gyda llaw, os ydych chi'n gosod y cyfleustodau yc ar beiriant Linux, gallwch chi ddefnyddio'r gorchymyn

yc container registry configure-docker

i ffurfweddu docwr.

Casgliad

Rydym wedi gwneud llawer o waith caled ac o ganlyniad:

  1. Daethom i fyny â phensaernïaeth ein gwasanaeth yn y dyfodol.
  2. Fe wnaethon ni ysgrifennu cais yn golang sy'n gweithredu ein rhesymeg busnes.
  3. Fe wnaethon ni ei gasglu a'i arllwys i gofrestrfa cynhwysydd preifat.

Yn y rhan nesaf, byddwn yn symud ymlaen at y pethau diddorol - byddwn yn rhyddhau ein cais i'r cynhyrchiad ac yn olaf yn lansio'r llwyth arno. Peidiwch â newid!

Mae'r deunydd hwn yn y recordiad fideo o'r gweithdy agored REBRAIN & Yandex.Cloud: Rydym yn derbyn 10 o geisiadau yr eiliad ar Yandex Cloud - https://youtu.be/cZLezUm0ekE

Os oes gennych ddiddordeb mewn mynychu digwyddiadau o'r fath ar-lein a gofyn cwestiynau mewn amser real, cysylltwch â sianel DevOps gan REBRAIN.

Hoffem ddweud diolch arbennig i Yandex.Cloud am y cyfle i gynnal digwyddiad o'r fath. Dolen iddyn nhw - https://cloud.yandex.ru/prices

Os oes angen i chi symud i'r cwmwl neu os oes gennych chi gwestiynau am eich seilwaith, croeso i chi adael cais.

ON Mae gennym 2 archwiliad rhad ac am ddim y mis, efallai y bydd eich prosiect yn un ohonynt.

Ffynhonnell: hab.com

Ychwanegu sylw