Wy akseptearje 10 eveneminten yn Yandex.Cloud. Diel 000

Hallo allegearre, freonen!

* Dit artikel is basearre op de iepen workshop REBRAIN & Yandex.Cloud, as jo leaver de fideo besjen, kinne jo it fine op dizze keppeling - https://youtu.be/cZLezUm0ekE

Wy hienen koartlyn de kâns om Yandex.Cloud live te besykjen. Om't wy lang en hurd woene, lieten wy fuortendaliks it idee ferlitte om in ienfâldich Wordpress-blog te lansearjen mei in wolkbasis - it wie te saai. Nei wat gedachte hawwe wy besletten om wat te fergelykjen mei in produksjetsjinst-arsjitektuer foar it ûntfangen en analysearjen fan eveneminten yn hast realtime-modus.

Ik bin der wis fan dat de grutte mearderheid fan online (en net allinich) bedriuwen op ien of oare manier in berch ynformaasje sammelje oer har brûkers en har aksjes. Dit is op syn minst nedich foar it meitsjen fan bepaalde besluten - bygelyks, as jo in online spultsje beheare, kinne jo sjen nei de statistiken op hokker nivo brûkers meastentiids sitte en jo boartersguod wiskje. Of wêrom brûkers jo side ferlitte sûnder wat te keapjen (hallo, Yandex.Metrica).

Dat, ús ferhaal: hoe't wy in applikaasje yn golang skreaunen, kafka vs rabbitmq vs yqs testen, gegevensstreaming skreaunen yn in Clickhouse-kluster en de gegevens visualisearre mei yandex-datalens. Natuerlik waard dit alles opwûn mei ynfrastruktuerlekkens yn 'e foarm fan docker, terraform, gitlab ci en, fansels, prometheus. Litte wy gean!

Ik wol fuortendaliks in reservearje meitsje dat wy net alles yn ien sitting kinne konfigurearje - hjirfoar sille wy ferskate artikels yn 'e searje nedich wêze. In bytsje oer de struktuer:

Diel 1 (jo lêze it). Wy sille beslute oer de spesifikaasjes en arsjitektuer fan 'e oplossing, en skriuwe ek in applikaasje yn golang.
Diel 2. Wy jouwe ús applikaasje frij yn produksje, meitsje it skalberber en testen de lading.
Diel 3. Lit ús besykje út te finen wêrom't wy moatte opslaan berjochten yn in buffer en net yn triemmen, en ek ferlykje kafka, rabbitmq en yandex wachtrige tsjinst.
Diel 4 Wy sille in Clickhouse-kluster ynsette, in streamingtsjinst skriuwe om gegevens fan 'e buffer dêr oer te bringen, en fisualisaasje ynstelle yn datalens.
Diel 5 Litte wy de heule ynfrastruktuer yn goede foarm bringe - ci / cd ynstelle mei gitlab ci, ferbine tafersjoch en tsjinstûntdekking mei prometheus en konsul.

TK

Lit ús earst de betingsten formulearje - wat wy krekt wolle krije as resultaat.

  1. Wy wolle in einpunt hawwe lykas events.kis.im (kis.im is it testdomein dat wy yn alle artikels sille brûke), dat barrens moatte ûntfange mei HTTPS.
  2. Eveneminten binne in ienfâldige json lykas: {"event": "view", "os": "linux", "browser": "chrome"}. Yn de lêste etappe sille wy wat mear fjilden tafoegje, mar dit sil gjin grutte rol spylje. As jo ​​​​wolle, kinne jo oerstappe nei protobuf.
  3. De tsjinst moat 10 eveneminten per sekonde kinne ferwurkje.
  4. It soe mooglik wêze moatte om horizontaal te skaaljen troch gewoan nije eksimplaren ta te foegjen oan ús oplossing. En it sil moai wêze as wy it foarste diel kinne ferpleatse nei ferskate geolokaasjes om latency foar kliïntoanfragen te ferminderjen.
  5. Marzje foar flaters. De oplossing moat stabyl genôch wêze en de fal fan alle dielen kinne oerlibje (oant in bepaald oantal, fansels).

arsjitektuer

Yn it algemien, foar dit soarte fan taak, klassike arsjitektuer binne al lang útfûn dy't tastean effisjint skaalfergrutting. De figuer lit in foarbyld sjen fan ús oplossing.

Wy akseptearje 10 eveneminten yn Yandex.Cloud. Diel 000

Dus wat wy hawwe:

1. Oan 'e lofterkant binne ús apparaten dy't ferskate eveneminten generearje, of it binne spilers dy't in nivo yn in boartersguod op in smartphone foltôgje of in bestelling meitsje yn in online winkel fia in gewoane browser. In evenemint, lykas spesifisearre yn 'e spesifikaasje, is in ienfâldige json dy't stjoerd wurdt nei ús einpunt - events.kis.im.

2. De earste twa servers binne ienfâldige balancers, har haadtaken binne:

  • Wês konstant beskikber. Om dit te dwaan kinne jo bygelyks keepalived brûke, dy't de firtuele IP tusken knooppunten sil wikselje yn gefal fan problemen.
  • TLS beëinigje. Ja, wy sille TLS op har beëinigje. As earste, sadat ús oplossing foldocht oan de technyske spesifikaasjes, en twad, om de lêst te ûntlêsten fan it oprjochtsjen fan in fersifere ferbining fan ús backend-servers.
  • Balansearje ynkommende fersiken nei beskikbere backend-tsjinners. It kaaiwurd hjir is tagonklik. Op grûn dêrfan komme wy ta it begryp dat loadbalancers ús servers moatte kinne kontrolearje mei applikaasjes en stopje mei it balansearjen fan ferkear nei mislearre knopen.

3. Nei de balancers hawwe wy applikaasje-tsjinners dy't in frij ienfâldige applikaasje útfiere. It moat ynkommende oanfragen fia HTTP kinne akseptearje, de ferstjoerde json validearje en de gegevens yn in buffer pleatse.

4. It diagram lit kafka sjen as buffer, hoewol, fansels, kinne oare ferlykbere tsjinsten brûkt wurde op dit nivo. Wy sille Kafka, rabbitmq en yqs fergelykje yn it tredde artikel.

5. It foarlêste punt fan ús arsjitektuer is Clickhouse - in kolomdatabase wêrmei jo in enoarme hoemannichte gegevens kinne opslaan en ferwurkje. Op dit nivo moatte wy gegevens oermeitsje fan 'e buffer nei it opslachsysteem sels (mear oer dit yn artikel 4).

Dit ûntwerp lit ús elke laach ûnôfhinklik horizontaal skaalje. Backend-servers kinne it net oan - lit ús noch ien ding tafoegje - it binne ommers steatleaze applikaasjes, en dêrom kin dit sels automatysk dien wurde. De buffer yn Kafka-styl wurket net - lit ús mear servers tafoegje en guon fan 'e partysjes fan ús ûnderwerp nei har oerdrage. Clickhouse kin it net omgean - it is ûnmooglik :) Eins sille wy ek de tsjinners ferbine en de gegevens sjitte.

Trouwens, as jo it opsjonele diel fan ús technyske spesifikaasjes en skaal yn ferskate geolokaasjes ymplementearje wolle, dan is d'r neat ienfâldiger:

Wy akseptearje 10 eveneminten yn Yandex.Cloud. Diel 000

Yn elke geolokaasje sette wy in load balancer yn mei applikaasje en kafka. Yn 't algemien binne 2 applikaasje-tsjinners, 3 kafka-knooppunten en in wolkbalanser, bygelyks cloudflare, genôch, dy't de beskikberens fan applikaasjeknooppunten en balânsoanfragen kontrolearje troch geolokaasje basearre op it boarne IP-adres fan de kliïnt. Sa sille gegevens ferstjoerd troch in Amerikaanske klant op Amerikaanske servers lânje. En gegevens út Afrika binne yn it Afrikaansk.

Dan is alles frij ienfâldich - wy brûke it spegelark fan 'e Kafka-set en kopiearje alle gegevens fan alle lokaasjes nei ús sintrale datasintrum yn Ruslân. Yntern parse wy de gegevens en registrearje se yn Clickhouse foar folgjende fisualisaasje.

Sa, wy hawwe sortearre út de arsjitektuer - lit ús begjinne te skodzjen Yandex.Cloud!

It skriuwen fan in applikaasje

Foar de wolk moatte jo noch in bytsje geduld wêze en in frij ienfâldige tsjinst skriuwe om ynkommende eveneminten te ferwurkjen. Wy sille golang brûke, om't it himsels tige goed bewiisd hat as in taal foar it skriuwen fan netwurkapplikaasjes.

Nei in oere (miskien in pear oeren), krije wy sa'n ding: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Wat binne de haadpunten dy't ik hjir wol opmerke wolle:

1. By it starten fan de applikaasje, kinne jo opjaan twa flaggen. Ien is ferantwurdlik foar de poarte wêrop wy sille harkje nei ynkommende http-fersiken (-addr). De twadde is foar it kafka-serveradres wêr't wy ús eveneminten sille opnimme (-kafka):

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

2. De applikaasje brûkt de sarama-bibleteek ([] github.com/Shopify/sarama) om berjochten te stjoeren nei it kafka-kluster. Wy sette fuortendaliks de ynstellingen rjochte op maksimale ferwurkingssnelheid:

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

3. Us applikaasje hat ek in ynboude prometheus-kliïnt, dy't ferskate metriken sammelt, lykas:

  • oantal oanfragen foar ús applikaasje;
  • oantal flaters by it útfieren fan it fersyk (ûnmooglik om postfersyk te lêzen, brutsen json, ûnmooglik om te skriuwen nei Kafka);
  • ferwurkjen tiid foar ien fersyk fan de klant, ynklusyf de tiid foar it skriuwen fan in berjocht nei Kafka.

4. Trije einpunten dy't ús oanfraach ferwurket:

  • /status - werom gewoan ok om sjen te litten dat wy libje. Hoewol kinne jo inkele kontrôles tafoegje, lykas de beskikberens fan it Kafka-kluster.
  • /metrics - neffens dizze url sil de prometheus-kliïnt de metriken werombringe dy't hy hat sammele.
  • /post is it haadeinpunt wêr't POST-oanfragen mei json binnen sille wurde ferstjoerd. Us applikaasje kontrolearret de json op jildigens en as alles goed is, skriuwt it de gegevens nei it Kafka-kluster.

Ik sil meitsje in reservearring dat de koade is net perfekt - it kin (en moat!) wurde foltôge. Jo kinne bygelyks ophâlde mei it brûken fan it ynboude net/http en oerskeakelje nei de fluggere http. Of jo kinne ferwurkingstiid en cpu-boarnen winne troch de json-jildigenskontrôle nei in letter stadium te ferpleatsen - as de gegevens wurde oerbrocht fan 'e buffer nei it klikhûskluster.

Njonken de ûntwikkelingskant fan it probleem, hawwe wy daliks neitocht oer ús takomstige ynfrastruktuer en besletten om ús applikaasje fia docker yn te setten. De definitive Dockerfile foar it bouwen fan de applikaasje is https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Yn 't algemien is it frij ienfâldich, it ienige punt dat ik omtinken jaan wol is de multistage-gearkomste, wêrtroch't wy it definitive byld fan ús kontener kinne ferminderje.

Earste stappen yn 'e wolk

Earst fan alles, registrearje op cloud.yandex.ru. Nei it ynfoljen fan alle nedige fjilden sille wy in akkount meitsje en in subsydzje krije foar in bepaald bedrach jild, dat kin wurde brûkt om wolktsjinsten te testen. As jo ​​​​alle stappen út ús artikel wolle werhelje, soe dizze subsydzje genôch wêze moatte foar jo.

Nei registraasje wurdt in aparte wolk en in standertmap foar jo makke, wêryn jo kinne begjinne mei it meitsjen fan wolkboarnen. Yn it algemien, yn Yandex.Cloud, de relaasje fan boarnen sjocht der sa út:

Wy akseptearje 10 eveneminten yn Yandex.Cloud. Diel 000

Jo kinne ferskate wolken meitsje foar ien akkount. En yn 'e wolk meitsje ferskate mappen foar ferskate bedriuwsprojekten. Jo kinne hjir mear oer lêze yn 'e dokumintaasje - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Ik sil der trouwens faaks hjirûnder yn de tekst nei ferwize. Doe't ik de hiele ynfrastruktuer fanôf it begjin opsette, holp de dokumintaasje my mear as ien kear, dus ik advisearje jo om it te bestudearjen.

Om de wolk te behearjen, kinne jo sawol de webynterface as it konsole-hulpprogramma brûke - yc. Ynstallaasje wurdt útfierd mei ien kommando (foar Linux en Mac Os):

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

As jo ​​spesjalist foar ynterne feiligens raast oer it útfieren fan skripts fan it ynternet, dan kinne jo, as earste, it skript iepenje en it lêze, en as twadde rinne wy ​​it ûnder ús brûker - sûnder rootrjochten.

As jo ​​​​in client foar Windows wolle ynstallearje, kinne jo de ynstruksjes brûke hjir en dan útfiere yc initom it folslein oan te passen:

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

Yn prinsipe is it proses ienfâldich - earst moatte jo in oauth-token krije om de wolk te behearjen, selektearje de wolk en de map dy't jo sille brûke.

As jo ​​ferskate akkounts of mappen hawwe binnen deselde wolk, kinne jo ekstra profilen meitsje mei aparte ynstellings fia yc config profyl oanmeitsje en tusken har wikselje.

Neist de boppesteande metoaden skreau it Yandex.Cloud-team in heul goed plugin foar terraform foar it behearen fan wolkboarnen. Foar myn part haw ik in git-repository taret, wêr't ik alle boarnen beskreau dy't sille wurde makke as ûnderdiel fan it artikel - https://github.com/rebrainme/yandex-cloud-events/. Wy binne ynteressearre yn 'e mastertûke, litte wy it lokaal klonje:


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/

Alle haadfariabelen dy't brûkt wurde yn terraform binne skreaun yn it main.tf-bestân. Om te begjinnen, meitsje in privee.auto.tfvars-bestân yn 'e map terraform mei de folgjende ynhâld:

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

Alle fariabelen kinne wurde nommen út 'e yc-konfiguraasjelist, om't wy it konsole-hulpprogramma al ynsteld hawwe. Ik advisearje jo om fuortendaliks private.auto.tfvars ta te foegjen oan .gitignore, om net per ongeluk privee gegevens te publisearjen.

Yn private.auto.tfvars spesifisearre wy ek gegevens fan Cloudflare - om DNS-records te meitsjen en de haaddomein events.kis.im te proxyjen nei ús servers. As jo ​​gjin cloudflare brûke wolle, ferwiderje dan de inisjalisaasje fan 'e cloudflare-provider yn main.tf en it dns.tf-bestân, dat ferantwurdlik is foar it meitsjen fan de nedige dns-records.

Yn ús wurk sille wy alle trije metoaden kombinearje - de webynterface, it konsole-hulpprogramma en terraform.

Firtuele netwurken

Om earlik te wêzen, kinne jo dizze stap oerslaan, om't as jo in nije wolk meitsje, jo automatysk in apart netwurk en 3 subnets sille hawwe makke - ien foar elke beskikberensône. Mar wy wolle noch wol in apart netwurk meitsje foar ús projekt mei in eigen adressering. It algemiene diagram fan hoe't it netwurk wurket yn Yandex.Cloud wurdt werjûn yn 'e figuer hjirûnder (earlik nommen út https://cloud.yandex.ru/docs/vpc/concepts/)

Wy akseptearje 10 eveneminten yn Yandex.Cloud. Diel 000

Dat, jo meitsje in mienskiplik netwurk wêryn boarnen mei elkoar kinne kommunisearje. Foar elke beskikberensône wurdt in subnet makke mei in eigen adressering en ferbûn mei it algemiene netwurk. As gefolch kinne alle wolkboarnen dêryn kommunisearje, sels as se yn ferskate beskikberensônes binne. Boarnen ferbûn mei ferskate wolknetwurken kinne elkoar allinich sjen fia eksterne adressen. Trouwens, hoe wurket dizze magy fan binnen, waard goed beskreaun op Habré.

Netwurk oanmeitsjen wurdt beskreaun yn it netwurk.tf-bestân fan it repository. Dêr meitsje wy ien mienskiplik privee netwurk ynterne en ferbine trije subnetten dêrmei yn ferskate beskikberensônes - ynterne-a (172.16.1.0/24), ynterne-b (172.16.2.0/24), ynterne-c (172.16.3.0/24) ).

Inisjalisearje terraform en meitsje netwurken:

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.

Grut! Wy hawwe ús netwurk makke en binne no klear om ús ynterne tsjinsten te meitsjen.

It meitsjen fan firtuele masines

Om de applikaasje te testen, hoege wy allinich twa firtuele masines te meitsjen - wy sille de earste nedich wêze om de applikaasje te bouwen en út te fieren, de twadde om kafka út te fieren, dy't wy sille brûke om ynkommende berjochten op te slaan. En wy sille in oare masine meitsje wêr't wy prometheus sille konfigurearje om de applikaasje te kontrolearjen.

De firtuele masines wurde konfigureare mei ansible, dus foardat jo terraform begjinne, soargje derfoar dat jo ien fan 'e lêste ferzjes fan ansible hawwe. En ynstallearje de nedige rollen mei 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) $

Binnen de ansible map is der in foarbyld .ansible.cfg konfiguraasje triem dat ik brûk. It kin fan pas komme.

Foardat jo firtuele masines meitsje, soargje derfoar dat jo ssh-agent rinnen hawwe en in ssh-kaai tafoege, oars kin terraform net ferbine mei de oanmakke masines. Ik kaam fansels in bug tsjin yn os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Om foar te kommen dat dit wer bart, foegje in lytse fariabele ta oan env foardat jo Terraform starte:

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

Yn 'e map mei terraform meitsje wy de nedige boarnen:

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

As alles mei súkses einige (en it moat wêze), dan sille wy trije firtuele masines hawwe:

  1. build - in masine foar testen en bouwen fan in applikaasje. Docker waard automatysk ynstalleare troch Ansible.
  2. monitoring - in tafersjochmasine - prometheus & grafana ynstalleare op it. Oanmelde / wachtwurd standert: admin / admin
  3. kafka is in lytse masine mei kafka ynstalleare, tagonklik op haven 9092.

Litte wy derfoar soargje dat se allegear op it plak binne:

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

De boarnen binne op it plak, en hjirwei kinne wy ​​​​har IP-adressen krije. Yn wat folget sil ik IP-adressen brûke om te ferbinen fia ssh en de applikaasje te testen. As jo ​​​​in cloudflare-akkount hawwe ferbûn mei terraform, fiel jo frij om nij oanmakke DNS-nammen te brûken.
Trouwens, by it meitsjen fan in firtuele masine wurde in ynterne IP en in ynterne DNS-namme jûn, sadat jo tagong krije ta servers binnen it netwurk mei namme:

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

Dit sil nuttich wêze foar ús om oan 'e applikaasje it einpunt mei kafk oan te jaan.

Sammelje de applikaasje

Geweldich, d'r binne servers, d'r is in applikaasje - alles wat oerbliuwt is it te sammeljen en te publisearjen. Foar de bou sille wy de gewoane docker-build brûke, mar as ôfbyldingsopslach sille wy in tsjinst brûke fan Yandex - container registry. Mar earst dingen earst.

Wy kopiearje de applikaasje nei de build-masine, logje yn fia ssh en sammelje de ôfbylding:

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

De helte fan 'e slach is dien - no kinne wy ​​​​de funksjonaliteit fan ús applikaasje kontrolearje troch it te starten en nei kafka te stjoeren:

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

De applikaasje reagearre mei súkses fan 'e opname en oanjûn de id fan' e partition en offset wêryn it berjocht wie opnommen. Alles wat oerbleaun is, is in register yn Yandex.Cloud oanmeitsje en ús ôfbylding dêr uploade (hoe dit te dwaan mei trije rigels wurdt beskreaun yn it registry.tf-bestân). Meitsje in opslach:

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.

D'r binne ferskate manieren om te ferifiearjen yn it kontenerregister - mei in oauth-token, in iam-token, of in tsjinstakkountkaai. Mear details oer dizze metoaden kinne fûn wurde yn 'e dokumintaasje. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Wy sille de tsjinstkaai brûke, dus meitsje wy in akkount oan:

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.

No bliuwt it allinich om der in kaai foar te meitsjen:

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

Wy ûntfange ynformaasje oer de id fan ús opslach, drage de kaai oer en log yn:

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

Om de ôfbylding te uploaden nei it register, hawwe wy de kontenerregistraasje-ID nedich, wy nimme it fan it yc-hulpprogramma:

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

Dêrnei taggje wy ús ôfbylding mei in nije namme en uploade:

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

Wy kinne ferifiearje dat de ôfbylding mei súkses laden is:

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

Trouwens, as jo it hulpprogramma yc op in Linux-masine ynstallearje, kinne jo it kommando brûke

yc container registry configure-docker

docker te konfigurearjen.

konklúzje

Wy hawwe in protte hurd wurk dien en as gefolch:

  1. Wy kamen mei de arsjitektuer fan ús takomstige tsjinst.
  2. Wy skreaunen in applikaasje yn golang dy't ús bedriuwslogika ymplementearret.
  3. Wy sammele it en gie it yn in privee kontenerregister.

Yn it folgjende diel geane wy ​​troch nei it nijsgjirrige guod - wy sille ús applikaasje frijlitte yn produksje en úteinlik de lading derop lansearje. Net oerskeakelje!

Dit materiaal is yn 'e fideo-opname fan' e iepen workshop REBRAIN & Yandex.Cloud: Wy akseptearje 10 oanfragen per sekonde op Yandex Cloud - https://youtu.be/cZLezUm0ekE

As jo ​​​​ynteressearre binne yn it bywenjen fan sokke eveneminten online en fragen yn echte tiid stelle, ferbine dan mei kanaal DevOps troch REBRAIN.

Wy wolle graach in spesjale tank sizze oan Yandex.Cloud foar de kâns om sa'n evenemint te hostjen. Link nei harren - https://cloud.yandex.ru/prices

As jo ​​​​nei de wolk moatte ferhúzje of fragen hawwe oer jo ynfrastruktuer, fiel frij om in fersyk efter te litten.

PS Wy hawwe 2 fergese audits per moanne, miskien sil jo projekt ien fan har wêze.

Boarne: www.habr.com

Add a comment