Kami nampi 10 acara di Yandex.Cloud. Bagian 000

Hello dulur, babaturan!

* Tulisan ieu dumasar kana bengkel kabuka REBRAIN & Yandex.Cloud, upami anjeun resep ningali pidéo, anjeun tiasa mendakanana dina tautan ieu - https://youtu.be/cZLezUm0ekE

Kami nembe ngagaduhan kasempetan pikeun nyobian Yandex.Cloud langsung. Kusabab urang hoyong usik panjang sareng sesah, urang langsung ngantunkeun ideu pikeun ngaluncurkeun blog Wordpress saderhana sareng dasar awan - éta pikaboseneun teuing. Saatos sababaraha pamikiran, urang mutuskeun pikeun nyebarkeun hal anu sami sareng arsitéktur jasa produksi pikeun nampi sareng nganalisa acara dina modeu waktos nyata.

Kuring yakin pisan yén seuseueurna usaha online (sareng sanés ngan ukur) kumaha waé ngumpulkeun gunung inpormasi ngeunaan pangguna sareng lampahna. Sahenteuna, ieu téh dipikabutuh pikeun nyieun kaputusan nu tangtu - contona, lamun ngatur kaulinan online, Anjeun bisa nempo statistik nu pamaké tingkat paling sering nyangkut jeung ngahapus kaulinan Anjeun. Atawa naha pamaké ninggalkeun situs anjeun tanpa purchasing nanaon (halo, Yandex.Metrica).

Janten, carita urang: kumaha urang nyerat aplikasi dina golang, diuji kafka vs rabbitmq vs yqs, nyerat streaming data dina klaster Clickhouse sareng ngabayangkeun data nganggo datalens yandex. Alami, sadaya ieu seasoned kalawan nikmat infrastruktur dina bentuk docker, terraform, gitlab ci na, tangtosna, prometheus. Hayu angkat!

Abdi hoyong geura-giru nyieun reservasi yén urang moal bisa ngonpigurasikeun sagalana dina hiji diuk - pikeun ieu kami bakal butuh sababaraha artikel dina séri. A saeutik ngeunaan struktur:

Bagian 1 (anjeun nuju maca). Kami bakal mutuskeun spésifikasi sareng arsitéktur solusi, sareng ogé nyerat aplikasi dina golang.
Bagian 2. Urang ngaleupaskeun aplikasi urang kana produksi, nyieun scalable jeung nguji beban.
Bagian 3. Hayu urang coba terangkeun naha urang kedah nyimpen pesen dina panyangga sareng henteu dina file, ogé ngabandingkeun kafka, rabbitmq sareng layanan antrian yandex.
Bagian 4 Kami bakal nyebarkeun klaster Clickhouse, nyerat layanan streaming pikeun mindahkeun data tina panyangga di dinya, sareng nyetél visualisasi dina datalens.
Bagian 5 Hayu urang mawa sakabéh infrastruktur kana bentuk ditangtoskeun - nyetél ci / cd maké gitlab ci, sambungkeun monitoring sarta kapanggihna jasa maké prometheus na konsul.

TK

Kahiji, hayu urang ngarumuskeun istilah rujukan - naon kahayang urang hayang meunang salaku hasilna.

  1. Kami hoyong gaduh titik akhir sapertos events.kis.im (kis.im mangrupikeun domain uji anu bakal kami anggo sapanjang sadaya tulisan), anu kedah nampi acara nganggo HTTPS.
  2. Kajadian nyaéta json basajan sapertos: {"event": "view", "os": "linux", "browser": "chrome"}. Dina tahap ahir urang bakal nambahan saeutik leuwih widang, tapi ieu moal maén peran badag. Upami anjeun hoyong, anjeun tiasa ngalih ka protobuf.
  3. Ladenan kedah tiasa ngolah 10 acara per detik.
  4. Sakuduna mungkin skala horisontal ku saukur nambahkeun instansi anyar kana solusi urang. Sareng langkung saé upami urang tiasa ngalihkeun bagian payun ka geolokasi anu béda pikeun ngirangan latency pikeun pamundut klien.
  5. Kasalahan toleransi. Leyuran kudu cukup stabil sarta bisa salamet ragrag sagala bagian (nepi ka jumlah nu tangtu, tangtu).

gawena undagi

Sacara umum, pikeun jenis ieu tugas, arsitéktur klasik geus lila nimukeun nu ngidinan skala efisien. Gambar nunjukkeun conto solusi urang.

Kami nampi 10 acara di Yandex.Cloud. Bagian 000

Janten naon anu urang gaduh:

1. Di kénca aya alat kami anu ngahasilkeun rupa-rupa acara, janten pamaén ngalengkepan tingkat dina kaulinan dina smartphone atanapi ngadamel pesenan di toko online ngalangkungan browser biasa. Hiji acara, sakumaha dieusian dina spésifikasi, nyaéta json basajan nu dikirim ka titik tungtung kami - events.kis.im.

2. Dua server munggaran nyaéta balancer basajan, tugas utama maranéhanana nyaéta:

  • Kudu terus sadia. Jang ngalampahkeun ieu, anjeun tiasa nganggo, contona, keepalived, anu bakal ngalihkeun IP virtual antara titik-titik upami aya masalah.
  • Numpurkeun TLS. Sumuhun, urang bakal nungtungan TLS on aranjeunna. Anu mimiti, supados solusi kami saluyu sareng spésifikasi téknis, sareng anu kadua, pikeun ngagentos beban ngadamel sambungan énkripsi tina server backend kami.
  • Saimbang requests asup ka server backend sadia. Kecap konci di dieu nyaeta diaksés. Dumasar ieu, urang dugi ka pamahaman yén load balancers kedah tiasa ngawas server kami sareng aplikasi sareng ngeureunkeun nyaimbangkeun lalu lintas ka titik anu gagal.

3. Saatos balancers, urang boga server aplikasi ngajalankeun hiji aplikasi cukup basajan. Kudu bisa nampa requests asup via HTTP, sangkan méré konfirmasi json dikirim tur nyimpen data kana panyangga a.

4. Diagram nunjukkeun kafka salaku panyangga, sanaos, tangtosna, jasa anu sami tiasa dianggo dina tingkat ieu. Urang bakal ngabandingkeun Kafka, rabbitmq jeung yqs dina artikel katilu.

5. Titik penultimate arsitektur urang Clickhouse - database columnar nu ngidinan Anjeun pikeun nyimpen jeung ngolah jumlah badag data. Dina tingkat ieu, urang kedah nransferkeun data tina panyangga ka sistem panyimpen sorangan (langkung seueur ngeunaan ieu dina artikel 4).

Desain ieu ngamungkinkeun urang pikeun skala unggal lapisan sacara horisontal sacara mandiri. Server backend teu tiasa Cope - hayu urang tambahkeun hiji hal deui - sanggeus kabeh, aranjeunna aplikasi stateless, sarta ku kituna, ieu bisa dipigawé malah otomatis. Panyangga gaya Kafka henteu jalan-hayu urang tambahkeun deui server sareng nransper sababaraha partisi topik urang ka aranjeunna. Clickhouse teu tiasa ngadamel - teu mungkin :) Nyatana, urang ogé bakal nyambungkeun server sareng beling data.

Ku jalan kitu, upami anjeun hoyong nerapkeun bagian pilihan tina spésifikasi téknis sareng skala kami dina geolokasi anu béda, maka teu aya anu langkung saderhana:

Kami nampi 10 acara di Yandex.Cloud. Bagian 000

Dina unggal geolocation kami nyebarkeun beban balancer kalawan aplikasi tur kafka. Sacara umum, 2 server aplikasi, 3 titik kafka sareng balancer awan, contona, cloudflare, cukup, anu bakal mariksa kasadiaan titik aplikasi sareng pamundut kasaimbangan ku geolokasi dumasar kana alamat IP sumber klien. Ku kituna, data dikirim ku klien Amérika bakal darat dina server Amérika. Sareng data ti Afrika aya di Afrika.

Teras sadayana saderhana - kami nganggo alat eunteung tina set Kafka sareng nyalin sadaya data tina sadaya lokasi ka pusat data sentral kami anu aya di Rusia. Sacara internal, urang nga-parse data sareng ngarékam dina Clickhouse pikeun visualisasi salajengna.

Janten, kami parantos nyortir arsitéktur - hayu urang ngamimitian ngagoncangkeun Yandex.Cloud!

Nulis aplikasi

Sateuacan Awan, anjeun masih kedah sabar sakedik sareng nyerat jasa anu saderhana pikeun ngolah acara anu bakal datang. Urang bakal ngagunakeun golang sabab geus ngabuktikeun sorangan kacida alusna salaku basa pikeun nulis aplikasi jaringan.

Saatos nyéépkeun sajam (meureun sababaraha jam), urang kéngingkeun sapertos kieu: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Naon titik utama anu kuring hoyong perhatikeun di dieu:

1. Nalika ngamimitian aplikasi, anjeun tiasa nangtukeun dua umbul. Hiji tanggung jawab port nu urang bakal ngadangukeun requests http asup (-addr). Anu kadua nyaéta pikeun alamat server kafka dimana urang bakal ngarékam acara urang (-kafka):

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

2. Aplikasi ngagunakeun perpustakaan sarama ([] github.com/Shopify/sarama) pikeun ngirim pesen ka klaster kafka. Kami langsung nyetél setélan anu ditujukeun pikeun laju ngolah maksimal:

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

3. Aplikasi kami ogé ngagaduhan klien prometheus anu diwangun, anu ngumpulkeun rupa-rupa métrik, sapertos:

  • Jumlah requests ka aplikasi urang;
  • Jumlah kasalahan nalika ngalaksanakeun pamundut (teu mungkin maca pamundut pos, rusak json, teu mungkin nulis ka Kafka);
  • waktos processing keur hiji pamundut ti klien, kaasup waktu nulis pesen ka Kafka.

4. Tilu titik tungtung anu prosés aplikasi urang:

  • / status - saukur balik ok pikeun nembongkeun yen urang hirup. Sanaos anjeun tiasa nambihan sababaraha cek, sapertos kasadiaan klaster Kafka.
  • / metrics - nurutkeun url ieu, klien prometheus bakal balik metrics eta geus dikumpulkeun.
  • / pos teh titik tungtung utama dimana requests POST kalawan json jero bakal dikirim. Aplikasi kami pariksa json pikeun validitas sareng upami sadayana ok, éta nyerat data kana klaster Kafka.

Kuring baris nyieun hiji reservasi yén kode nu teu sampurna - eta bisa (jeung kudu!) réngsé. Contona, Anjeun bisa ngeureunkeun ngagunakeun diwangun-di net / http sarta pindah ka fasthttp gancang. Atanapi anjeun tiasa kéngingkeun waktos ngolah sareng sumber CPU ku cara ngagerakkeun cék validitas json ka tahap engké - nalika data ditransfer tina panyangga ka kluster clickhouse.

Salian sisi pangembangan masalah, kami langsung mikirkeun infrastruktur masa depan urang sareng mutuskeun pikeun nyebarkeun aplikasi kami via docker. Dockerfile ahir pikeun ngawangun aplikasi nyaéta https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Sacara umum, éta cukup saderhana, hiji-hijina titik anu kuring hoyong nengetan nyaéta rakitan multistage, anu ngamungkinkeun urang ngirangan gambar ahir wadahna.

Léngkah munggaran dina méga

Anu mimiti, ngadaptar on cloud.yandex.ru. Saatos ngeusian sadaya widang anu dipikabutuh, kami bakal nyiptakeun akun sareng masihan hibah sajumlah artos, anu tiasa dianggo pikeun nguji jasa awan. Upami anjeun hoyong ngulang sadaya léngkah tina tulisan kami, hibah ieu kedah cekap pikeun anjeun.

Saatos pendaptaran, awan anu misah sareng diréktori standar bakal didamel pikeun anjeun, dimana anjeun tiasa ngamimitian nyiptakeun sumber awan. Sacara umum, dina Yandex.Cloud, hubungan sumberdaya sapertos kieu:

Kami nampi 10 acara di Yandex.Cloud. Bagian 000

Anjeun tiasa nyiptakeun sababaraha awan pikeun hiji akun. Jeung di jero awan, nyieun directories béda pikeun proyék-proyék parusahaan béda. Anjeun tiasa maca langkung seueur ngeunaan ieu dina dokuméntasi - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Ku jalan kitu, kuring bakal sering ngarujuk kana éta di handap dina téks. Nalika kuring nyetél sadayana infrastruktur ti mimiti, dokuméntasi ngabantosan kuring langkung ti sakali, janten kuring mamatahan anjeun pikeun diajar.

Pikeun ngatur awan, anjeun tiasa nganggo antarmuka wéb sareng utilitas konsol - yc. Pamasangan dilaksanakeun nganggo hiji paréntah (pikeun Linux sareng Mac Os):

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

Upami spesialis kaamanan internal anjeun ngamuk ngeunaan ngajalankeun skrip tina Internét, maka, mimitina, anjeun tiasa muka naskah sareng maca éta, sareng kadua, kami ngajalankeun éta dina pangguna kami - tanpa hak akar.

Upami anjeun hoyong masang klien pikeun Windows, anjeun tiasa nganggo pitunjuk di dieu lajeng laksana yc initpikeun ngaropea sapinuhna:

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

Sacara prinsip, prosésna saderhana - mimitina anjeun kedah nampi token oauth pikeun ngatur awan, pilih méga sareng polder anu anjeun anggo.

Upami anjeun gaduh sababaraha akun atanapi polder dina méga anu sami, anjeun tiasa nyiptakeun profil tambahan kalayan setélan anu misah liwat yc config profil nyiptakeun sareng ngalih antara aranjeunna.

Salian metodeu di luhur, tim Yandex.Cloud nyerat anu saé pisan plugin pikeun terraform pikeun ngatur sumberdaya awan. Pikeun bagian kuring, kuring nyiapkeun gudang git, dimana kuring ngajelaskeun sadaya sumber daya anu bakal didamel salaku bagian tina tulisan - https://github.com/rebrainme/yandex-cloud-events/. Kami museurkeun cabang master, hayu urang clone 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/

Sadaya variabel utama anu dianggo dina terraform ditulis dina file main.tf. Pikeun ngamimitian, jieun file private.auto.tfvars dina folder terraform sareng eusi ieu:

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

Kabéh variabel bisa dicokot tina daptar config yc, saprak urang geus ngonpigurasi utiliti konsol. Kuring mamatahan anjeun geuwat nambahkeun private.auto.tfvars mun .gitignore, ku kituna teu ngahaja nyebarkeun data pribadi.

Dina private.auto.tfvars kami ogé nangtukeun data ti Cloudflare - pikeun nyieun rékaman DNS jeung proxy domain utama events.kis.im ka server kami. Upami anjeun henteu hoyong nganggo cloudflare, teras cabut initialization panyadia cloudflare dina main.tf sareng file dns.tf, anu tanggung jawab pikeun nyiptakeun rékaman dns anu diperyogikeun.

Dina karya urang urang bakal ngagabungkeun sakabeh tilu métode - panganteur web, utiliti konsol, sarta terraform.

Jaringan virtual

Jujur, anjeun tiasa ngalangkungan léngkah ieu, sabab nalika anjeun nyiptakeun awan énggal, anjeun bakal otomatis gaduh jaringan anu misah sareng 3 subnet anu didamel - hiji pikeun unggal zona kasadiaan. Tapi kami masih hoyong ngadamel jaringan anu misah pikeun proyék kami kalayan alamatna sorangan. Diagram umum kumaha jaringan jalan dina Yandex.Cloud dipidangkeun dina gambar di handap ieu (jujur ​​dicokot tina https://cloud.yandex.ru/docs/vpc/concepts/)

Kami nampi 10 acara di Yandex.Cloud. Bagian 000

Janten, anjeun nyiptakeun jaringan umum dimana sumberdaya tiasa saling komunikasi. Pikeun unggal zona kasadiaan, subnet dijieun kalawan alamat sorangan tur disambungkeun ka jaringan umum. Hasilna, sadaya sumberdaya awan di dinya bisa komunikasi, sanajan aranjeunna dina zona kasadiaan béda. Sumberdaya anu nyambung ka jaringan awan anu béda-béda tiasa saling ningali ngan ukur ngalangkungan alamat éksternal. Ku jalan kitu, kumaha sihir ieu dianggo di jero, ieu ogé digambarkeun dina Habré.

Nyiptakeun jaringan dijelaskeun dina file network.tf tina gudang. Di dinya urang nyieun hiji jaringan pribadi umum internal tur sambungkeun tilu subnets kana eta dina zona kasadiaan béda - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24). ).

Inisialisasi terraform sareng jieun 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.

Hebat! Kami parantos nyiptakeun jaringan kami sareng ayeuna siap ngadamel jasa internal kami.

Nyiptakeun mesin virtual

Pikeun nguji aplikasina, urang ngan ukur kedah nyiptakeun dua mesin virtual - urang peryogi anu kahiji pikeun ngawangun sareng ngajalankeun aplikasi, anu kadua pikeun ngajalankeun kafka, anu bakal kami anggo pikeun nyimpen pesen anu asup. Sarta kami bakal nyieun mesin sejen dimana urang bakal ngonpigurasikeun prometheus pikeun ngawas aplikasi.

Mesin virtual bakal dikonpigurasi nganggo ansible, janten sateuacan ngamimitian terraform, pastikeun anjeun gaduh salah sahiji versi ansible pang anyarna. Sareng pasang peran anu diperyogikeun sareng 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) $

Di jero folder ansible aya conto file konfigurasi .ansible.cfg anu ku kuring dianggo. Bisa jadi mangpaat.

Sateuacan nyieun mesin virtual, pastikeun yén anjeun geus ngajalankeun ssh-agén jeung konci ssh ditambahkeun, disebutkeun terraform moal bisa nyambung ka mesin dijieun. Kuring, tangtosna, mendakan bug dina os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Pikeun nyegah ieu kajadian deui, tambahkeun variabel leutik ka env sateuacan ngaluncurkeun Terraform:

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

Dina folder kalawan terraform urang nyieun sumberdaya diperlukeun:

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

Upami sadayana parantos suksés (sareng kedahna), maka urang bakal ngagaduhan tilu mesin virtual:

  1. ngawangun - mesin pikeun nguji sarta ngawangun hiji aplikasi. Docker dipasang sacara otomatis ku Ansible.
  2. ngawaskeun - mesin ngawaskeun - prometheus & grafana dipasang dina éta. Standar login / sandi: admin / admin
  3. kafka mangrupikeun mesin leutik sareng kafka dipasang, tiasa diaksés dina port 9092.

Hayu urang pastikeun aranjeunna sadayana dina tempatna:

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

Sumberdayana aya, sareng ti dieu urang tiasa nampi alamat IP na. Sapanjang anu kieu kuring bakal nganggo alamat IP pikeun nyambungkeun via ssh sareng nguji aplikasina. Upami Anjeun gaduh akun cloudflare disambungkeun ka terraform, ngarasa Luncat ngagunakeun ngaran DNS anyar dijieun.
Ku jalan kitu, nalika nyiptakeun mesin virtual, IP internal sareng nami DNS internal dipasihkeun, ku kituna anjeun tiasa ngaksés server dina jaringan ku nami:

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

Ieu bakal mangpaat pikeun urang nunjukkeun ka aplikasi titik tungtung sareng kafk.

Ngumpulkeun aplikasi

Hébat, aya server, aya aplikasi - sadayana anu tetep nyaéta pikeun ngumpul sareng nyebarkeunana. Pikeun ngawangun kami bakal nganggo docker build biasa, tapi salaku panyimpen gambar kami bakal nganggo jasa ti Yandex - container registry. Tapi hal kahiji kahiji.

Urang nyalin aplikasi ka mesin ngawangun, log in via ssh jeung ngumpul gambar:

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

Satengah perang parantos réngsé - ayeuna urang tiasa pariksa pungsionalitas aplikasi urang ku ngaluncurkeunana sareng ngirimkeunana ka 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 ngaréspon kalayan suksés ngarékam sareng nunjukkeun id partisi sareng offset dimana pesenna kalebet. Sadaya anu kedah dilakukeun nyaéta nyiptakeun pendaptaran di Yandex.Cloud sareng unggah gambar kami di dinya (kumaha cara ngalakukeun ieu nganggo tilu garis dijelaskeun dina file registry.tf). Jieun gudang:

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.

Aya sababaraha cara pikeun ngabuktoskeun kaaslianana dina pendaptaran wadah - nganggo token oauth, token iam, atanapi konci akun jasa. Leuwih jéntré ngeunaan métode ieu bisa kapanggih dina dokuméntasi. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Kami bakal nganggo konci akun jasa, janten kami ngadamel 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.

Ayeuna sadayana anu tetep nyaéta ngadamel konci pikeun éta:

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

Kami nampi inpormasi ngeunaan id gudang kami, nransper konci sareng asup:

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

Pikeun unggah gambar ka pendaptaran, urang peryogi ID pendaptaran wadahna, urang nyandak tina utiliti yc:

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

Sanggeus éta, urang tag gambar urang ku ngaran anyar jeung unggah:

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

Urang tiasa pariksa yén gambar parantos suksés:

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

Ku jalan kitu, upami anjeun masang utilitas yc dina mesin Linux, anjeun tiasa nganggo paréntahna

yc container registry configure-docker

pikeun ngonpigurasikeun docker.

kacindekan

Kami parantos nyambut damel sareng hasilna:

  1. Urang datang nepi ka arsitéktur jasa hareup urang.
  2. Kami nyerat aplikasi dina golang anu ngalaksanakeun logika bisnis urang.
  3. Kami ngumpulkeun éta sareng tuang kana pendaptaran wadahna pribadi.

Dina bagian salajengna, urang ngaléngkah ka barang anu pikaresepeun - urang bakal ngaleupaskeun aplikasi urang kana produksi sareng tungtungna ngaluncurkeun beban éta. Tong gentos!

Bahan ieu aya dina rekaman pidéo tina bengkel kabuka REBRAIN & Yandex.Cloud: Kami nampi 10 pamundut per detik dina Yandex Cloud - https://youtu.be/cZLezUm0ekE

Upami anjeun resep ngahadiran acara sapertos online sareng naroskeun patarosan sacara real waktos, sambungkeun ka DevOps ku saluran REBRAIN.

Kami hoyong ngucapkeun hatur nuhun khusus ka Yandex.Cloud pikeun kasempetan pikeun ngayakeun acara sapertos kitu. Tautan ka aranjeunna - https://cloud.yandex.ru/prices

Upami anjeun kedah ngalih ka awan atanapi gaduh patarosan ngeunaan infrastruktur anjeun, Ngarasa Luncat ka ngalebetkeun pamundut a.

PS Urang boga 2 bebas audits per bulan, meureun proyék anjeun bakal salah sahijina.

sumber: www.habr.com

Tambahkeun komentar