Tunakubali matukio 10 katika Yandex.Cloud. Sehemu 000

Salamu kila mtu, marafiki!

* Nakala hii inategemea semina ya REBRAIN & Yandex.Cloud wazi, ikiwa ungependa kutazama video, unaweza kuipata kwenye kiungo hiki - https://youtu.be/cZLezUm0ekE

Hivi majuzi tulipata fursa ya kujaribu Yandex.Cloud moja kwa moja. Kwa kuwa tulitaka kuchunguza kwa muda mrefu na kwa bidii, mara moja tuliacha wazo la kuzindua blogi rahisi ya Wordpress na msingi wa wingu - ilikuwa ya kuchosha sana. Baada ya kufikiria kidogo, tuliamua kupeleka kitu sawa na usanifu wa huduma ya uzalishaji kwa kupokea na kuchambua matukio katika hali ya karibu ya wakati halisi.

Nina hakika kabisa kwamba idadi kubwa ya biashara za mtandaoni (na si tu) kwa namna fulani hukusanya habari nyingi kuhusu watumiaji wao na matendo yao. Kwa uchache, hii ni muhimu kwa kufanya maamuzi fulani - kwa mfano, ikiwa unasimamia mchezo wa mtandaoni, unaweza kuangalia takwimu ambazo watumiaji mara nyingi hukwama na kufuta toy yako. Au kwa nini watumiaji wanaondoka kwenye tovuti yako bila kununua chochote (hello, Yandex.Metrica).

Kwa hivyo, hadithi yetu: jinsi tulivyoandika programu katika golang, iliyojaribiwa kafka vs rabbitmq vs yqs, tuliandika utiririshaji wa data kwenye nguzo ya Clickhouse na kuibua data kwa kutumia datalens yandex. Kwa kawaida, haya yote yaliwekwa na furaha ya miundombinu kwa namna ya docker, terraform, gitlab ci na, bila shaka, prometheus. Twende!

Ningependa mara moja kufanya uhifadhi kwamba hatutaweza kusanidi kila kitu kwa kikao kimoja - kwa hili tutahitaji makala kadhaa katika mfululizo. Kidogo kuhusu muundo:

Sehemu ya 1 (unaisoma). Tutaamua juu ya vipimo na usanifu wa suluhisho, na pia kuandika maombi katika golang.
Sehemu ya 2. Tunaachilia ombi letu katika toleo la umma, tuifanye iweze kuongezeka na kujaribu mzigo.
Sehemu ya 3. Hebu jaribu kujua kwa nini tunahitaji kuhifadhi ujumbe katika buffer na si katika faili, na pia kulinganisha huduma ya foleni ya kafka, rabbitmq na yandex.
Sehemu ya 4 Tutasambaza nguzo ya Clickhouse, kuandika huduma ya utiririshaji ili kuhamisha data kutoka kwa bafa huko, na kusanidi taswira katika hifadhidata.
Sehemu ya 5 Hebu tulete miundombinu yote katika umbo linalofaa - weka ci/cd kwa kutumia gitlab ci, unganisha ufuatiliaji na ugunduzi wa huduma kwa kutumia prometheus na balozi.

TK

Kwanza, hebu tutengeneze masharti ya rejeleo - ni nini hasa tunataka kupata kama matokeo.

  1. Tunataka kuwa na sehemu ya mwisho kama vile events.kis.im (kis.im ni kikoa cha majaribio ambacho tutatumia kwenye makala yote), ambacho kinapaswa kupokea matukio kwa kutumia HTTPS.
  2. Matukio ni json rahisi kama: {β€œevent”: β€œview”, β€œos”: β€œlinux”, β€œbrowser”: β€œchrome”}. Katika hatua ya mwisho tutaongeza uwanja zaidi, lakini hii haitachukua jukumu kubwa. Ukipenda, unaweza kubadilisha hadi protobuf.
  3. Huduma lazima iweze kuchakata matukio 10 kwa sekunde.
  4. Inapaswa kuwa rahisi kuongeza usawa kwa kuongeza tu hali mpya kwenye suluhisho letu. Na itakuwa vizuri ikiwa tunaweza kuhamisha sehemu ya mbele hadi maeneo tofauti ya kijiografia ili kupunguza muda wa kusubiri kwa maombi ya mteja.
  5. Uvumilivu wa makosa. Suluhisho lazima liwe na utulivu wa kutosha na uweze kuishi kuanguka kwa sehemu yoyote (hadi idadi fulani, bila shaka).

usanifu

Kwa ujumla, kwa aina hii ya kazi, usanifu wa classical umezuliwa kwa muda mrefu ambao unaruhusu kuongeza ufanisi. Takwimu inaonyesha mfano wa suluhisho letu.

Tunakubali matukio 10 katika Yandex.Cloud. Sehemu 000

Kwa hivyo tunayo:

1. Upande wa kushoto ni vifaa vyetu vinavyozalisha matukio mbalimbali, iwe wachezaji wanaokamilisha kiwango cha toy kwenye simu mahiri au kuunda agizo katika duka la mtandaoni kupitia kivinjari cha kawaida. Tukio, kama ilivyobainishwa katika vipimo, ni json rahisi ambayo inatumwa kwa mwisho wetu - events.kis.im.

2. Seva mbili za kwanza ni wasawazishaji rahisi, kazi zao kuu ni:

  • Kuwa daima inapatikana. Ili kufanya hivyo, unaweza kutumia, kwa mfano, keepalived, ambayo itabadilisha IP virtual kati ya nodes katika kesi ya matatizo.
  • Sitisha TLS. Ndiyo, tutasitisha TLS juu yao. Kwanza, ili suluhisho letu lizingatie vipimo vya kiufundi, na pili, ili kupunguza mzigo wa kuanzisha muunganisho uliosimbwa kwa njia fiche kutoka kwa seva zetu za nyuma.
  • Sawazisha maombi yanayoingia kwa seva zinazopatikana za nyuma. Neno kuu hapa linapatikana. Kulingana na hili, tunaelewa kuwa visawazishaji vya mizigo lazima viweze kufuatilia seva zetu na programu na kuacha kusawazisha trafiki kwa nodi zisizofanikiwa.

3. Baada ya kusawazisha, tuna seva za programu zinazoendesha programu rahisi sana. Inapaswa kuwa na uwezo wa kukubali maombi yanayoingia kupitia HTTP, kuhalalisha json iliyotumwa na kuweka data kwenye buffer.

4. Mchoro unaonyesha kafka kama buffer, ingawa, bila shaka, huduma zingine zinazofanana zinaweza kutumika katika kiwango hiki. Tutalinganisha Kafka, rabbitmq na yqs katika makala ya tatu.

5. Hatua ya mwisho ya usanifu wetu ni Clickhouse - hifadhidata ya safu ambayo hukuruhusu kuhifadhi na kuchakata data kubwa. Katika kiwango hiki, tunahitaji kuhamisha data kutoka kwa buffer hadi kwenye mfumo wa hifadhi yenyewe (zaidi juu ya hili katika makala ya 4).

Muundo huu unatuwezesha kupima kila safu kwa kujitegemea kwa usawa. Seva za nyuma haziwezi kustahimili - wacha tuongeze jambo moja zaidi - baada ya yote, ni programu zisizo na uraia, na kwa hivyo, hii inaweza kufanywa kiotomatiki. Bafa ya mtindo wa Kafka haifanyi kaziβ€”hebu tuongeze seva zaidi na tuhamishie baadhi ya sehemu za mada yetu kwao. Clickhouse haiwezi kuishughulikia - haiwezekani :) Kwa kweli, tutaunganisha seva na kupasua data.

Kwa njia, ikiwa unataka kutekeleza sehemu ya hiari ya vipimo vyetu vya kiufundi na ukubwa katika maeneo tofauti ya geolocation, basi hakuna kitu rahisi zaidi:

Tunakubali matukio 10 katika Yandex.Cloud. Sehemu 000

Katika kila geolocation sisi kupeleka mizani mzigo na maombi na kafka. Kwa ujumla, seva 2 za maombi, nodi 3 za kafka na usawazishaji wa wingu, kwa mfano, cloudflare, ni za kutosha, ambazo zitaangalia upatikanaji wa nodes za maombi na maombi ya usawa kwa geolocation kulingana na anwani ya IP ya chanzo cha mteja. Kwa hivyo, data iliyotumwa na mteja wa Amerika itatua kwenye seva za Amerika. Na data kutoka Afrika ni za Kiafrika.

Kisha kila kitu ni rahisi sana - tunatumia chombo cha kioo kutoka kwa kuweka Kafka na kunakili data zote kutoka maeneo yote hadi kituo chetu cha data cha kati kilichoko Urusi. Kwa ndani, tunachanganua data na kuirekodi katika Clickhouse kwa taswira inayofuata.

Kwa hiyo, tumepanga usanifu - hebu tuanze kutetemeka Yandex.Cloud!

Kuandika maombi

Kabla ya Wingu, bado unapaswa kuwa mvumilivu na uandike huduma rahisi kushughulikia matukio yanayoingia. Tutatumia golang kwa sababu imejidhihirisha vizuri sana kama lugha ya kuandika programu za mtandao.

Baada ya kutumia saa moja (labda saa kadhaa), tunapata kitu kama hiki: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Ni mambo gani kuu ambayo ningependa kuzingatia hapa:

1. Unapoanza programu, unaweza kutaja bendera mbili. Mmoja anawajibika kwa bandari ambayo tutasikiliza maombi yanayoingia ya http (-addr). Ya pili ni ya anwani ya seva ya kafka ambapo tutarekodi matukio yetu (-kafka):

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

2. Programu hutumia maktaba ya sarama ([] github.com/Shopify/sarama) kutuma ujumbe kwa nguzo ya kafka. Mara moja tunaweka mipangilio inayolenga kasi ya juu ya usindikaji:

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

3. Programu yetu pia ina mteja wa prometheus aliyejengewa ndani, ambaye hukusanya vipimo mbalimbali, kama vile:

  • idadi ya maombi kwa maombi yetu;
  • idadi ya makosa wakati wa kutekeleza ombi (haiwezekani kusoma ombi la posta, json iliyovunjika, haiwezekani kuandika kwa Kafka);
  • wakati wa usindikaji wa ombi moja kutoka kwa mteja, pamoja na wakati wa kuandika ujumbe kwa Kafka.

4. Miisho mitatu ambayo maombi yetu huchakata:

  • /hali - rudi sawa ili kuonyesha kuwa tuko hai. Ingawa unaweza kuongeza ukaguzi, kama vile upatikanaji wa nguzo ya Kafka.
  • /metrics - kulingana na url hii, mteja wa prometheus atarejesha vipimo alivyokusanya.
  • /post ndio mwisho mkuu ambapo maombi ya POST na json ndani yatatumwa. Maombi yetu hukagua json kwa uhalali na ikiwa kila kitu ni sawa, huandika data kwa nguzo ya Kafka.

Nitafanya uhifadhi kwamba msimbo sio kamili - inaweza (na inapaswa!) kukamilika. Kwa mfano, unaweza kuacha kutumia net/http iliyojengewa ndani na ubadilishe kwa harakahttp ya haraka. Au unaweza kupata wakati wa usindikaji na rasilimali za cpu kwa kuhamisha ukaguzi wa uhalali wa json hadi hatua ya baadaye - wakati data inahamishwa kutoka kwa bafa hadi kwa nguzo ya kubofya.

Kando na upande wa ukuzaji wa suala hilo, tulifikiria mara moja juu ya muundo msingi wetu wa siku zijazo na tukaamua kupeleka maombi yetu kupitia kizimbani. Dockerfile ya mwisho ya kujenga programu ni https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Kwa ujumla, ni rahisi sana, jambo pekee ambalo ningependa kulipa kipaumbele ni mkusanyiko wa hatua nyingi, ambayo inaruhusu sisi kupunguza picha ya mwisho ya chombo chetu.

Hatua za kwanza kwenye wingu

Kwanza kabisa, jiandikishe wingu.yandex.ru. Baada ya kujaza mashamba yote muhimu, tutaundwa akaunti na kupewa ruzuku kwa kiasi fulani cha fedha, ambacho kinaweza kutumika kupima huduma za wingu. Ikiwa unataka kurudia hatua zote kutoka kwa makala yetu, ruzuku hii inapaswa kutosha kwako.

Baada ya usajili, wingu tofauti na saraka ya msingi itaundwa kwako, ambayo unaweza kuanza kuunda rasilimali za wingu. Kwa ujumla, katika Yandex.Cloud, uhusiano wa rasilimali unaonekana kama hii:

Tunakubali matukio 10 katika Yandex.Cloud. Sehemu 000

Unaweza kuunda mawingu kadhaa kwa akaunti moja. Na ndani ya wingu, tengeneza saraka tofauti za miradi tofauti ya kampuni. Unaweza kusoma zaidi kuhusu hili katika nyaraka - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Kwa njia, mara nyingi nitarejelea hapa chini kwenye maandishi. Nilipoanzisha miundombinu yote tangu mwanzo, nyaraka zilinisaidia zaidi ya mara moja, kwa hiyo nakushauri ujifunze.

Ili kudhibiti wingu, unaweza kutumia kiolesura cha wavuti na matumizi ya kiweko - yc. Ufungaji unafanywa kwa amri moja (kwa Linux na Mac Os):

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

Ikiwa mtaalamu wako wa usalama wa ndani anakasirika kuhusu kuendesha hati kutoka kwa Mtandao, basi, kwanza, unaweza kufungua hati na kuisoma, na pili, tunaiendesha chini ya mtumiaji wetu - bila haki za mizizi.

Ikiwa unataka kusakinisha mteja kwa Windows, unaweza kutumia maagizo hapa na kisha kutekeleza yc initili kuibinafsisha kikamilifu:

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

Kimsingi, mchakato ni rahisi - kwanza unahitaji kupata ishara ya kiapo ili kudhibiti wingu, chagua wingu na folda utakayotumia.

Ikiwa una akaunti au folda kadhaa ndani ya wingu moja, unaweza kuunda wasifu wa ziada na mipangilio tofauti kupitia yc config profile kuunda na kubadili kati yao.

Mbali na njia zilizo hapo juu, timu ya Yandex.Cloud iliandika nzuri sana programu-jalizi ya terraform kwa kusimamia rasilimali za wingu. Kwa upande wangu, niliandaa hazina ya git, ambapo nilielezea rasilimali zote ambazo zitaundwa kama sehemu ya kifungu - https://github.com/rebrainme/yandex-cloud-events/. Tunavutiwa na tawi kuu, wacha tuifanye karibu nawe:


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/

Vigezo vyote vikuu vinavyotumika katika terraform vimeandikwa kwenye faili kuu.tf. Ili kuanza, unda faili ya private.auto.tfvars katika folda ya terraform na maudhui yafuatayo:

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

Vigezo vyote vinaweza kuchukuliwa kutoka kwa orodha ya usanidi wa yc, kwani tayari tumesanidi matumizi ya kiweko. Ninakushauri uongeze mara moja private.auto.tfvars kwa .gitignore, ili usichapishe data ya faragha kimakosa.

Katika private.auto.tfvars pia tulibainisha data kutoka Cloudflare - ili kuunda rekodi za DNS na kutumia seva mbadala ya matukio ya kikoa kikuu.kis.im kwa seva zetu. Ikiwa hutaki kutumia cloudflare, kisha uondoe uanzishaji wa mtoa huduma wa cloudflare katika main.tf na faili ya dns.tf, ambayo inawajibika kwa kuunda rekodi muhimu za dns.

Katika kazi yetu tutachanganya njia zote tatu - kiolesura cha wavuti, matumizi ya console, na terraform.

Mitandao ya mtandaoni

Kuwa waaminifu, unaweza kuruka hatua hii, kwani unapounda wingu mpya, utakuwa na mtandao tofauti kiotomatiki na subnets 3 zilizoundwa - moja kwa kila eneo la upatikanaji. Lakini bado tungependa kutengeneza mtandao tofauti wa mradi wetu wenye anwani zake. Mchoro wa jumla wa jinsi mtandao unavyofanya kazi katika Yandex.Cloud umeonyeshwa kwenye takwimu hapa chini (kuchukuliwa kwa uaminifu kutoka https://cloud.yandex.ru/docs/vpc/concepts/)

Tunakubali matukio 10 katika Yandex.Cloud. Sehemu 000

Kwa hiyo, unaunda mtandao wa kawaida ambao rasilimali zinaweza kuwasiliana na kila mmoja. Kwa kila eneo la upatikanaji, subnet inaundwa na anwani yake na kuunganishwa kwenye mtandao wa jumla. Matokeo yake, rasilimali zote za wingu ndani yake zinaweza kuwasiliana, hata ikiwa ziko katika maeneo tofauti ya upatikanaji. Rasilimali zilizounganishwa kwenye mitandao tofauti ya wingu zinaweza kuonana kupitia anwani za nje pekee. Kwa njia, uchawi huu unafanyaje kazi ndani, ilielezewa vizuri juu ya Habre.

Uundaji wa mtandao umeelezewa katika faili ya network.tf kutoka kwa hazina. Hapo tunaunda mtandao mmoja wa kibinafsi wa ndani na kuunganisha subnets tatu kwake katika maeneo tofauti ya upatikanaji - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24) )

Anzisha mfumo na uunde mitandao:

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.

Kubwa! Tumeunda mtandao wetu na sasa tuko tayari kuunda huduma zetu za ndani.

Kuunda mashine za mtandaoni

Ili kujaribu programu, tutahitaji tu kuunda mashine mbili za kawaida - tutahitaji ya kwanza kujenga na kuendesha programu, ya pili kuendesha kafka, ambayo tutatumia kuhifadhi ujumbe unaoingia. Na tutaunda mashine nyingine ambapo tutasanidi prometheus kufuatilia programu.

Mashine pepe zitasanidiwa kwa kutumia ansible, kwa hivyo kabla ya kuanza terraform, hakikisha kuwa una moja ya matoleo ya hivi karibuni ya ansible. Na usanikishe majukumu muhimu na gala inayofaa:

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

Ndani ya folda inayohusika kuna mfano wa faili ya usanidi ya .ansible.cfg ambayo mimi hutumia. Inaweza kuja kwa manufaa.

Kabla ya kuunda mashine pepe, hakikisha kuwa una ssh-agent inayoendesha na kitufe cha ssh kimeongezwa, vinginevyo terraform haitaweza kuunganishwa kwa mashine iliyoundwa. Kwa kweli, nilipata mdudu katika os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Ili kuzuia hili kutokea tena, ongeza kigezo kidogo kwa env kabla ya kuzindua Terraform:

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

Katika folda iliyo na terraform tunaunda rasilimali muhimu:

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

Ikiwa kila kitu kilimalizika kwa mafanikio (na inapaswa kuwa), basi tutakuwa na mashine tatu za kawaida:

  1. kujenga - mashine kwa ajili ya kupima na kujenga maombi. Docker ilisakinishwa kiotomatiki na Ansible.
  2. ufuatiliaji - mashine ya ufuatiliaji - prometheus & grafana imewekwa juu yake. Kiwango cha kuingia / nenosiri: admin / admin
  3. kafka ni mashine ndogo iliyo na kafka iliyowekwa, inayopatikana kwenye bandari 9092.

Wacha tuhakikishe kuwa zote ziko mahali:

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

Rasilimali zipo, na kutoka hapa tunaweza kupata anwani zao za IP. Kwa kile kinachofuata nitatumia anwani za IP kuunganishwa kupitia ssh na kujaribu programu. Ikiwa una akaunti ya cloudflare iliyounganishwa kwenye terraform, jisikie huru kutumia majina mapya ya DNS.
Kwa njia, wakati wa kuunda mashine ya kawaida, IP ya ndani na jina la ndani la DNS hupewa, ili uweze kufikia seva ndani ya mtandao kwa jina:

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

Hii itakuwa muhimu kwetu kuonyesha kwa programu mwisho na kafk.

Kukusanya maombi

Kubwa, kuna seva, kuna programu - kilichobaki ni kuikusanya na kuichapisha. Kwa ajili ya ujenzi tutatumia jengo la kawaida la docker, lakini kama hifadhi ya picha tutatumia huduma kutoka kwa Yandex - Usajili wa chombo. Lakini mambo ya kwanza kwanza.

Tunakili programu kwa mashine ya ujenzi, ingia kupitia ssh na kukusanya picha:

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

Nusu ya vita imekamilika - sasa tunaweza kuangalia utendakazi wa programu yetu kwa kuizindua na kuituma kwa 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) $

Ombi lilijibu kwa mafanikio ya kurekodi na kuonyesha kitambulisho cha sehemu na mkato ambamo ujumbe ulijumuishwa. Yote iliyobaki kufanya ni kuunda Usajili katika Yandex.Cloud na kupakia picha yetu huko (jinsi ya kufanya hivyo kwa kutumia mistari mitatu imeelezwa kwenye faili ya registry.tf). Unda hifadhi:

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.

Kuna njia kadhaa za kuthibitisha katika sajili ya chombo - kwa kutumia ishara ya kiapo, ishara ya iam, au ufunguo wa akaunti ya huduma. Maelezo zaidi kuhusu njia hizi yanaweza kupatikana katika nyaraka. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Tutatumia ufunguo wa akaunti ya huduma, kwa hivyo tunafungua akaunti:

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.

Sasa kilichobaki ni kutengeneza ufunguo wake:

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

Tunapokea taarifa kuhusu kitambulisho cha hifadhi yetu, kuhamisha ufunguo na kuingia:

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

Ili kupakia picha kwenye sajili, tunahitaji kitambulisho cha usajili wa chombo, tunakichukua kutoka kwa matumizi ya yc:

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

Baada ya hapo, tunaweka alama kwenye picha yetu kwa jina jipya na kupakia:

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

Tunaweza kuthibitisha kuwa picha ilipakiwa kwa ufanisi:

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

Kwa njia, ikiwa utasanikisha matumizi ya yc kwenye mashine ya Linux, unaweza kutumia amri

yc container registry configure-docker

kusanidi docker.

Hitimisho

Tumefanya kazi ngumu sana na matokeo yake:

  1. Tulikuja na usanifu wa huduma yetu ya baadaye.
  2. Tuliandika maombi katika golang ambayo yanatekeleza mantiki ya biashara yetu.
  3. Tulikusanya na kumwaga kwenye rejista ya vyombo vya kibinafsi.

Katika sehemu inayofuata, tutaendelea na mambo ya kuvutia - tutatoa programu yetu katika toleo la umma na hatimaye kuzindua mzigo wake. Usibadilishe!

Nyenzo hii iko kwenye rekodi ya video ya warsha ya wazi REBRAIN & Yandex.Cloud: Tunakubali maombi 10 kwa sekunde kwenye Yandex Cloud - https://youtu.be/cZLezUm0ekE

Ikiwa ungependa kuhudhuria matukio kama haya mtandaoni na kuuliza maswali kwa wakati halisi, unganisha kwa DevOps by REBRAIN chaneli.

Tungependa kusema asante maalum kwa Yandex.Cloud kwa fursa ya kuandaa hafla kama hiyo. Unganisha nao - https://cloud.yandex.ru/prices

Ikiwa unahitaji kuhamia kwenye wingu au una maswali kuhusu miundombinu yako, Jisikie huru kuwasilisha ombi.

PS Tuna ukaguzi 2 wa bure kwa mwezi, labda mradi wako utakuwa mmoja wao.

Chanzo: mapenzi.com

Kuongeza maoni