Kita nampa 10 acara ing Yandex.Cloud. Bagean 000

Hello everyone, kanca!

* Artikel iki adhedhasar bengkel mbukak REBRAIN & Yandex.Cloud, yen sampeyan luwih seneng nonton video kasebut, sampeyan bisa nemokake ing link iki - https://youtu.be/cZLezUm0ekE

Kita bubar duwe kesempatan kanggo nyoba Yandex.Cloud langsung. Amarga kita pengin nyelidiki dawa lan angel, kita langsung nolak ide kanggo mbukak blog Wordpress sing prasaja kanthi basis awan - pancen mboseni. Sawise sawetara pamikiran, kita mutusake kanggo nyebarake sing padha karo arsitektur layanan produksi kanggo nampa lan nganalisa acara ing mode wektu nyata.

Aku pancen yakin manawa mayoritas bisnis online (lan ora mung) ngumpulake informasi babagan pangguna lan tumindake. Paling ora, iki perlu kanggo nggawe keputusan tartamtu - contone, yen sampeyan ngatur game online, sampeyan bisa ndeleng statistik ing level pangguna sing paling kerep macet lan mbusak dolanan sampeyan. Utawa ngapa pangguna ninggalake situs sampeyan tanpa tuku apa-apa (halo, Yandex.Metrica).

Dadi, crita kita: kepiye carane nulis aplikasi ing golang, nguji kafka vs rabbitmq vs yqs, nulis streaming data ing kluster Clickhouse lan nggambarake data nggunakake yandex datalens. Alami, kabeh iki dibuwang karo kesenengan infrastruktur ing wangun docker, terraform, gitlab ci lan, mesthi, prometheus. Ayo budal!

Aku kaya kanggo langsung nggawe leladen sing kita ora bakal bisa kanggo ngatur kabeh ing siji lungguh - kanggo iki kita kudu sawetara artikel ing seri. A sethitik babagan struktur:

Bagian 1 (sampeyan maca). Kita bakal mutusake spesifikasi lan arsitektur solusi kasebut, lan uga nulis aplikasi ing golang.
Bagean 2. Kita ngeculake aplikasi kita menyang produksi, nggawe skalabel lan nyoba beban.
Bagean 3. Ayo nyoba ngerteni kenapa kita kudu nyimpen pesen ing buffer lan ora ing file, lan uga mbandhingake layanan antrian kafka, rabbitmq lan yandex.
Bagean 4 Kita bakal masang kluster Clickhouse, nulis layanan streaming kanggo nransfer data saka buffer ing kana, lan nyiyapake visualisasi ing datalens.
Bagean 5 Ayo kabeh infrastruktur dadi wangun sing tepat - nyiyapake ci / cd nggunakake gitlab ci, sambungake pemantauan lan panemuan layanan nggunakake prometheus lan konsul.

TK

Pisanan, ayo ngrumusake istilah referensi - apa sing dikarepake minangka asil.

  1. Kita pengin duwe endpoint kaya events.kis.im (kis.im minangka domain test sing bakal digunakake ing kabeh artikel), sing kudu nampa acara nggunakake HTTPS.
  2. Acara minangka json sing prasaja kaya: {"event": "view", "os": "linux", "browser": "chrome"}. Ing tahap pungkasan, kita bakal nambah lapangan liyane, nanging iki ora bakal dadi peran gedhe. Yen sampeyan pengin, sampeyan bisa ngalih menyang protobuf.
  3. Layanan kasebut kudu bisa ngolah 10 acara per detik.
  4. Sampeyan kudu bisa kanggo skala horisontal kanthi mung nambah conto anyar kanggo solusi kita. Lan bakal luwih becik yen kita bisa mindhah bagean ngarep menyang geolokasi sing beda kanggo nyuda latensi kanggo panjaluk klien.
  5. Toleransi kesalahan. Solusi kasebut kudu cukup stabil lan bisa tahan tiba ing bagean apa wae (nganti jumlah tartamtu, mesthi).

arsitektur

UmumΓ©, kanggo jinis tugas iki, arsitektur klasik wis suwe diciptakake sing ngidini skala efisien. Tokoh kasebut nuduhake conto solusi kita.

Kita nampa 10 acara ing Yandex.Cloud. Bagean 000

Dadi apa sing kita duwe:

1. Ing sisih kiwa ana piranti sing ngasilake macem-macem acara, dadi pemain sing ngrampungake level dolanan ing smartphone utawa nggawe pesenan ing toko online liwat browser biasa. Acara, kaya sing wis ditemtokake ing spesifikasi, yaiku json prasaja sing dikirim menyang titik pungkasan - events.kis.im.

2. Rong server pisanan minangka penyeimbang sing prasaja, tugas utama yaiku:

  • Terus kasedhiya. Kanggo nindakake iki, sampeyan bisa nggunakake, contone, keepalived, sing bakal ngalih IP virtual antarane simpul yen ana masalah.
  • Mungkasi TLS. Ya, kita bakal mungkasi TLS. Kaping pisanan, supaya solusi kita tundhuk karo spesifikasi teknis, lan nomer loro, supaya bisa ngilangi beban nggawe sambungan sing dienkripsi saka server backend kita.
  • Balance panjalukan mlebu menyang server backend kasedhiya. Tembung kunci ing kene bisa diakses. Adhedhasar iki, kita ngerti manawa load balancer kudu bisa ngawasi server kita nganggo aplikasi lan mungkasi ngimbangi lalu lintas menyang simpul sing gagal.

3. Sawise balancers, kita duwe server aplikasi mbukak aplikasi cukup prasaja. Sampeyan kudu bisa nampa panjalukan sing mlebu liwat HTTP, validasi json sing dikirim lan sijine data menyang buffer.

4. Diagram nuduhake kafka minangka buffer, sanajan, mesthi, layanan liyane sing padha bisa digunakake ing tingkat iki. Kita bakal mbandhingake Kafka, rabbitmq lan yqs ing artikel katelu.

5. Titik penultimate arsitektur kita yaiku Clickhouse - database kolom sing ngidini sampeyan nyimpen lan ngolah data sing akeh banget. Ing tingkat iki, kita kudu nransfer data saka buffer menyang sistem panyimpenan dhewe (liyane ing artikel 4).

Desain iki ngidini kita ngukur saben lapisan kanthi horisontal. Server backend ora bisa ngatasi - ayo nambah siji liyane - sawise kabeh, iku aplikasi stateless, lan mulane, iki bisa ditindakake kanthi otomatis. Buffer gaya Kafka ora bisa digunakake-ayo nambah server liyane lan nransfer sawetara partisi topik kita menyang wong-wong mau. Clickhouse ora bisa nangani - iku mokal :) Nyatane, kita uga bakal nyambung server lan shard data.

Contone, yen sampeyan pengin ngetrapake bagean opsional saka spesifikasi teknis lan skala ing geolokasi sing beda-beda, mula ora ana sing luwih gampang:

Kita nampa 10 acara ing Yandex.Cloud. Bagean 000

Ing saben geolocation kita masang load balancer karo aplikasi lan kafka. UmumΓ©, 2 server aplikasi, 3 simpul kafka lan penyeimbang awan, contone, cloudflare, cukup, sing bakal mriksa kasedhiyan simpul aplikasi lan panjaluk imbangan kanthi geolokasi adhedhasar alamat IP sumber klien. Mangkono, data sing dikirim dening klien Amerika bakal mlebu ing server Amerika. Lan data saka Afrika ana ing Afrika.

Banjur kabeh cukup prasaja - kita nggunakake alat pangilon saka set Kafka lan nyalin kabeh data saka kabeh lokasi menyang pusat data pusat sing ana ing Rusia. Secara internal, kita ngurai data lan ngrekam ing Clickhouse kanggo visualisasi sabanjure.

Dadi, kita wis ngatur arsitektur - ayo miwiti goyang Yandex.Cloud!

Nulis aplikasi

Sadurunge Cloud, sampeyan isih kudu rada sabar lan nulis layanan sing cukup prasaja kanggo ngolah acara sing bakal teka. Kita bakal nggunakake golang amarga wis bukti banget minangka basa kanggo nulis aplikasi jaringan.

Sawise mbuwang jam (bisa uga sawetara jam), kita entuk kaya iki: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Apa poin utama sing arep dakcathet ing kene:

1. Nalika miwiti aplikasi, sampeyan bisa nemtokake loro panji. Siji tanggung jawab kanggo port sing bakal ngrungokake panjaluk http sing mlebu (-addr). Kapindho kanggo alamat server kafka ing ngendi kita bakal ngrekam acara (-kafka):

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

2. Aplikasi kasebut nggunakake perpustakaan sarama ([] github.com/Shopify/sarama) kanggo ngirim pesen menyang kluster kafka. Kita langsung nyetel setelan sing ngarahake kacepetan pangolahan maksimal:

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

3. Aplikasi kita uga duwe klien prometheus sing dibangun, sing ngumpulake macem-macem metrik, kayata:

  • nomer panjalukan kanggo aplikasi kita;
  • nomer kasalahan nalika nglakokakΓ© panjalukan (mokal kanggo maca panjalukan kirim, rusak json, mokal kanggo nulis kanggo Kafka);
  • wektu Processing siji request saka klien, kalebu wektu kanggo nulis pesen kanggo Kafka.

4. Telung titik pungkasan sing diproses aplikasi kita:

  • / status - mung bali ok kanggo nuduhake yen kita urip. Sanajan sampeyan bisa nambah sawetara mriksa, kayata kasedhiyan kluster Kafka.
  • /metrics - miturut url iki, klien prometheus bakal ngasilake metrik sing wis diklumpukake.
  • / post minangka titik pungkasan utama ing ngendi panjaluk POST karo json ing njero bakal dikirim. Aplikasi kita mriksa json kanggo validitas lan yen kabeh ok, iku nulis data menyang kluster Kafka.

Aku bakal nggawe leladen sing kode ora sampurna - bisa (lan kudu!) Rampung. Contone, sampeyan bisa mungkasi nggunakake dibangun ing net / http lan ngalih menyang http cepet luwih cepet. Utawa sampeyan bisa entuk wektu pangolahan lan sumber daya CPU kanthi mindhah mriksa validitas json menyang tahap sabanjure - nalika data ditransfer saka buffer menyang kluster clickhouse.

Saliyane ing sisih pangembangan masalah, kita langsung mikir babagan infrastruktur masa depan lan mutusake kanggo nyebarake aplikasi liwat docker. Dockerfile pungkasan kanggo mbangun aplikasi yaiku https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. UmumΓ©, cukup prasaja, mung titik sing dakkarepake yaiku perakitan multistage, sing ngidini kita nyuda gambar pungkasan saka wadhah kita.

Langkah pisanan ing awan

Kaping pisanan, ndhaftar ing cloud.yandex.ru. Sawise ngisi kabeh kolom sing dibutuhake, kita bakal nggawe akun lan diwenehi hibah kanggo jumlah dhuwit tartamtu, sing bisa digunakake kanggo nguji layanan awan. Yen sampeyan pengin mbaleni kabeh langkah saka artikel kita, hibah iki kudu cukup kanggo sampeyan.

Sawise registrasi, awan sing kapisah lan direktori standar bakal digawe kanggo sampeyan, ing ngendi sampeyan bisa miwiti nggawe sumber daya awan. UmumΓ©, ing Yandex.Cloud, hubungan sumber daya katon kaya iki:

Kita nampa 10 acara ing Yandex.Cloud. Bagean 000

Sampeyan bisa nggawe sawetara awan kanggo siji akun. Lan ing njero awan, gawe direktori beda kanggo proyek perusahaan sing beda. Sampeyan bisa maca liyane babagan iki ing dokumentasi - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Miturut cara, aku bakal kerep ngrujuk ing ngisor iki ing teks. Nalika aku nyiyapake kabeh prasarana saka ngeruk, dokumentasi mbantu kula metu luwih saka sapisan, supaya aku maringi pitutur sampeyan sinau.

Kanggo ngatur awan, sampeyan bisa nggunakake antarmuka web lan sarana konsol - yc. Instalasi ditindakake kanthi siji printah (kanggo Linux lan Mac Os):

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

Yen spesialis keamanan internal nesu babagan mbukak skrip saka Internet, mula, sepisanan, sampeyan bisa mbukak skrip lan maca, lan nomer loro, kita mbukak ing pangguna - tanpa hak root.

Yen sampeyan pengin nginstal klien kanggo Windows, sampeyan bisa nggunakake instruksi kasebut kene banjur kaleksanan yc initkanggo ngatur kanthi lengkap:

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

Ing asas, proses kasebut prasaja - pisanan sampeyan kudu entuk token oauth kanggo ngatur awan, pilih awan lan folder sing bakal digunakake.

Yen sampeyan duwe sawetara akun utawa folder ing maya padha, sampeyan bisa nggawe profil tambahan karo setelan kapisah liwat yc config profil nggawe lan ngalih ing antarane.

Saliyane cara ing ndhuwur, tim Yandex.Cloud nulis sing apik banget plugin kanggo terraform kanggo ngatur sumber daya awan. Kanggo bagean, aku nyiapake repositori git, ing ngendi aku nerangake kabeh sumber daya sing bakal digawe minangka bagean saka artikel - https://github.com/rebrainme/yandex-cloud-events/. Kita kasengsem ing cabang master, ayo klone sacara lokal:


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/

Kabeh variabel utama sing digunakake ing terraform ditulis ing file main.tf. Kanggo miwiti, gawe file private.auto.tfvars ing folder terraform kanthi isi ing ngisor iki:

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

Kabeh variabel bisa dijupuk saka dhaptar konfigurasi yc, amarga kita wis ngatur sarana console. Aku menehi saran supaya sampeyan langsung nambah private.auto.tfvars menyang .gitignore, supaya ora sengaja nerbitake data pribadi.

Ing private.auto.tfvars kita uga nemtokake data saka Cloudflare - kanggo nggawe cathetan DNS lan proxy domain utama events.kis.im menyang server kita. Yen sampeyan ora pengin nggunakake cloudflare, banjur mbusak initialization saka panyedhiya cloudflare ing main.tf lan file dns.tf, kang tanggung jawab kanggo nggawe cathetan dns perlu.

Ing karya kita, kita bakal nggabungake kabeh telung cara - antarmuka web, sarana konsol, lan terraform.

Jaringan virtual

Jujur, sampeyan bisa ngliwati langkah iki, amarga nalika nggawe awan anyar, sampeyan bakal duwe jaringan sing kapisah kanthi otomatis lan 3 subnet digawe - siji kanggo saben zona kasedhiyan. Nanging kita isih pengin nggawe jaringan kapisah kanggo proyek kita kanthi alamat dhewe. Diagram umum babagan cara kerja jaringan ing Yandex.Cloud ditampilake ing gambar ing ngisor iki (sajujure dijupuk saka https://cloud.yandex.ru/docs/vpc/concepts/)

Kita nampa 10 acara ing Yandex.Cloud. Bagean 000

Dadi, sampeyan nggawe jaringan umum ing ngendi sumber daya bisa saling komunikasi. Kanggo saben zona kasedhiyan, subnet digawe kanthi alamat dhewe lan disambungake menyang jaringan umum. AkibatΓ©, kabeh sumber maya ing njero bisa komunikasi, sanajan ana ing zona kasedhiyan sing beda. Sumber daya sing disambungake menyang jaringan awan sing beda-beda mung bisa ndeleng liwat alamat eksternal. Ngomong-ngomong, kepiye carane sihir iki bisa digunakake ing njero, iki uga diterangake ing HabrΓ©.

Nggawe jaringan diterangake ing file network.tf saka gudang. Ing kana kita nggawe siji internal jaringan pribadi umum lan nyambungake telung subnet ing zona kasedhiyan sing beda - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24). ).

Miwiti terraform lan nggawe jaringan:

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.

apik tenan! Kita wis nggawe jaringan lan saiki wis siyap nggawe layanan internal.

Nggawe mesin virtual

Kanggo nguji aplikasi kasebut, kita mung kudu nggawe rong mesin virtual - sing pertama kudu mbangun lan mbukak aplikasi kasebut, sing kapindho kanggo mbukak kafka, sing bakal digunakake kanggo nyimpen pesen sing mlebu. Lan kita bakal nggawe mesin liyane ing ngendi kita bakal ngatur prometheus kanggo ngawasi aplikasi kasebut.

Mesin virtual bakal dikonfigurasi nggunakake ansible, mula sadurunge miwiti terraform, priksa manawa sampeyan duwe salah sawijining versi paling anyar saka ansible. Lan nginstal peran sing dibutuhake karo galaksi 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) $

Ing njero folder ansible ana conto file konfigurasi .ansible.cfg sing dakgunakake. Bisa uga migunani.

Sadurunge nggawe mesin virtual, priksa manawa sampeyan duwe ssh-agen mlaku lan tombol ssh ditambahake, yen ora, terraform ora bakal bisa nyambung menyang mesin sing digawe. Aku, mesthi, nemokake bug ing os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Kanggo nyegah iki kedadeyan maneh, tambahake variabel cilik menyang env sadurunge ngluncurake Terraform:

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

Ing folder kanthi terraform, kita nggawe sumber daya sing dibutuhake:

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

Yen kabeh rampung kanthi sukses (lan mesthine), mula kita bakal duwe telung mesin virtual:

  1. mbangun - mesin kanggo testing lan mbangun aplikasi. Docker diinstal kanthi otomatis dening Ansible.
  2. ngawasi - mesin ngawasi - prometheus & grafana diinstal ing. Standar login / sandi: admin / admin
  3. kafka minangka mesin cilik sing dipasang kafka, bisa diakses ing port 9092.

Ayo priksa manawa kabeh ana ing papan:

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

Sumber daya wis ana, lan saka kene kita bisa entuk alamat IP. Ing ngisor iki aku bakal nggunakake alamat IP kanggo nyambung liwat ssh lan nyoba aplikasi kasebut. Yen sampeyan duwe akun cloudflare sing disambungake menyang terraform, gunakake jeneng DNS sing anyar digawe.
Miturut cara, nalika nggawe mesin virtual, IP internal lan jeneng DNS internal diwenehi, supaya sampeyan bisa ngakses server ing jaringan kanthi jeneng:

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

Iki bakal migunani kanggo kita nuduhake menyang aplikasi titik pungkasan karo kafk.

Ngrakit aplikasi

Apik, ana server, ana aplikasi - sing isih ana yaiku ngumpulake lan nerbitake. Kanggo mbangun kita bakal nggunakake mbangun docker biasanipun, nanging minangka panyimpenan gambar kita bakal nggunakake layanan saka Yandex - container registry. Nanging dhisik dhisik.

Kita nyalin aplikasi menyang mesin mbangun, mlebu liwat ssh lan ngumpulake gambar kasebut:

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

Setengah perang wis rampung - saiki kita bisa mriksa fungsi aplikasi kanthi ngluncurake lan ngirim menyang 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) $

Aplikasi kasebut nanggapi kanthi sukses rekaman lan nuduhake id partisi lan ngimbangi pesen kasebut. Kabeh sing kudu ditindakake yaiku nggawe registri ing Yandex.Cloud lan upload gambar kita ing kana (carane nggunakake telung baris diterangake ing file registry.tf). Nggawe panyimpenan:

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.

Ana sawetara cara kanggo otentikasi ing registri wadhah - nggunakake token oauth, token iam, utawa kunci akun layanan. Rincian liyane babagan cara kasebut bisa ditemokake ing dokumentasi. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Kita bakal nggunakake kunci akun layanan, supaya kita nggawe akun:

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.

Saiki sing isih ana yaiku nggawe kunci:

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

Kita nampa informasi babagan id panyimpenan, transfer kunci lan mlebu:

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

Kanggo ngunggah gambar menyang registri, kita butuh ID pendaptaran wadah, kita njupuk saka utilitas yc:

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

Sawise iku, kita menehi tag gambar kanthi jeneng anyar lan upload:

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

Kita bisa verifikasi manawa gambar kasebut kasil dimuat:

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

Miturut cara, yen sampeyan nginstal utilitas yc ing mesin Linux, sampeyan bisa nggunakake printah kasebut

yc container registry configure-docker

kanggo ngatur docker.

kesimpulan

Kita wis nindakake akeh kerja keras lan minangka asil:

  1. We teka munggah karo arsitektur layanan mangsa.
  2. Kita nulis aplikasi ing golang sing ngetrapake logika bisnis kita.
  3. Kita diklumpukake lan diwutahake menyang registri wadhah pribadi.

Ing bagean sabanjure, kita bakal pindhah menyang barang sing menarik - kita bakal ngeculake aplikasi menyang produksi lan pungkasane mbukak beban kasebut. Aja ngalih!

Materi iki ana ing rekaman video saka bengkel mbukak REBRAIN & Yandex.Cloud: Kita nampa 10 panjalukan per detik ing Yandex Cloud - https://youtu.be/cZLezUm0ekE

Yen kasengsem ing nekani acara kuwi online lan takon pitakonan ing wektu nyata, nyambung menyang saluran DevOps dening REBRAIN.

Kita arep ngucapake matur nuwun khusus kanggo Yandex.Cloud kanggo kesempatan kanggo dadi tuan rumah acara kasebut. Link menyang wong- https://cloud.yandex.ru/prices

Yen sampeyan kudu pindhah menyang awan utawa duwe pitakon babagan infrastruktur sampeyan, aran gratis kanggo ninggalake panjalukan.

PS Kita duwe 2 audit gratis saben wulan, mbok menawa proyek sampeyan bakal dadi salah sijine.

Source: www.habr.com

Add a comment