Kami menerima 10 acara di Yandex.Cloud. Bagian 000

Halo semuanya, teman-teman!

* Artikel ini didasarkan pada lokakarya terbuka REBRAIN & Yandex.Cloud, jika Anda lebih suka menonton videonya, Anda dapat menemukannya di tautan ini - https://youtu.be/cZLezUm0ekE

Kami baru-baru ini mendapat kesempatan untuk mencoba Yandex.Cloud secara langsung. Karena kami ingin menyelidikinya lama dan keras, kami segera meninggalkan ide meluncurkan blog Wordpress sederhana dengan basis cloud - itu terlalu membosankan. Setelah beberapa pemikiran, kami memutuskan untuk menerapkan sesuatu yang mirip dengan arsitektur layanan produksi untuk menerima dan menganalisis peristiwa dalam mode hampir real-time.

Saya sangat yakin bahwa sebagian besar bisnis online (dan tidak hanya) mengumpulkan segudang informasi tentang penggunanya dan tindakan mereka. Minimal, hal ini diperlukan untuk membuat keputusan tertentu - misalnya, jika Anda mengelola game online, Anda dapat melihat statistik di level mana pengguna paling sering terjebak dan menghapus mainan Anda. Atau mengapa pengguna meninggalkan situs Anda tanpa membeli apa pun (halo, Yandex.Metrica).

Jadi, kisah kami: bagaimana kami menulis aplikasi di golang, menguji kafka vs kelincimq vs yqs, menulis streaming data di cluster Clickhouse dan memvisualisasikan data menggunakan yandex datalens. Tentu saja, semua ini dibumbui dengan infrastruktur yang nikmat berupa docker, terraform, gitlab ci dan, tentu saja, prometheus. Ayo pergi!

Saya ingin segera membuat reservasi bahwa kami tidak akan dapat mengonfigurasi semuanya sekaligus - untuk ini kami memerlukan beberapa artikel dalam seri ini. Sedikit tentang strukturnya:

Bagian 1 (Anda sedang membacanya). Kami akan memutuskan spesifikasi dan arsitektur solusinya, dan juga menulis aplikasi dalam golang.
Bagian 2. Kami merilis aplikasi kami ke dalam produksi, membuatnya dapat diskalakan dan menguji bebannya.
Bagian 3. Mari kita coba mencari tahu mengapa kita perlu menyimpan pesan dalam buffer dan bukan dalam file, dan juga membandingkan layanan antrian kafka, kelincimq, dan yandex.
Bagian 4 Kami akan menerapkan cluster Clickhouse, menulis layanan streaming untuk mentransfer data dari buffer di sana, dan menyiapkan visualisasi dalam lensa data.
Bagian 5 Mari kita jadikan seluruh infrastruktur ke dalam kondisi yang tepat - siapkan ci/cd menggunakan gitlab ci, sambungkan pemantauan dan penemuan layanan menggunakan prometheus dan consul.

TK

Pertama, mari kita rumuskan kerangka acuannya - apa sebenarnya yang ingin kita dapatkan sebagai hasilnya.

  1. Kami ingin memiliki titik akhir seperti events.kis.im (kis.im adalah domain pengujian yang akan kami gunakan di seluruh artikel), yang seharusnya menerima peristiwa menggunakan HTTPS.
  2. Acara adalah json sederhana seperti: {β€œevent”: β€œview”, β€œos”: β€œlinux”, β€œbrowser”: β€œchrome”}. Pada tahap akhir kami akan menambahkan lebih banyak bidang, tetapi ini tidak akan memainkan peran besar. Jika mau, Anda dapat beralih ke protobuf.
  3. Layanan harus mampu memproses 10 peristiwa per detik.
  4. Penskalaan secara horizontal seharusnya dapat dilakukan hanya dengan menambahkan instance baru ke solusi kami. Dan alangkah baiknya jika kita dapat memindahkan bagian depan ke geolokasi yang berbeda untuk mengurangi latensi permintaan klien.
  5. Toleransi kesalahan. Solusinya harus cukup stabil dan mampu bertahan dari jatuhnya bagian mana pun (sampai jumlah tertentu tentunya).

Arsitektur

Secara umum, untuk jenis tugas ini, arsitektur klasik telah lama ditemukan yang memungkinkan penskalaan yang efisien. Gambar tersebut menunjukkan contoh solusi kami.

Kami menerima 10 acara di Yandex.Cloud. Bagian 000

Jadi apa yang kita punya:

1. Di sebelah kiri adalah perangkat kita yang menghasilkan berbagai event, baik itu pemain yang menyelesaikan level mainan di smartphone atau membuat pesanan di toko online melalui browser biasa. Suatu peristiwa, sebagaimana ditentukan dalam spesifikasi, adalah json sederhana yang dikirim ke titik akhir kami - events.kis.im.

2. Dua server pertama adalah penyeimbang sederhana, tugas utamanya adalah:

  • Selalu tersedia. Untuk melakukan ini, Anda dapat menggunakan, misalnya, keepalive, yang akan mengalihkan IP virtual antar node jika terjadi masalah.
  • Hentikan TLS. Ya, kami akan menghentikan TLS pada mereka. Pertama, agar solusi kami sesuai dengan spesifikasi teknis, dan kedua, untuk meringankan beban pembuatan koneksi terenkripsi dari server backend kami.
  • Seimbangkan permintaan masuk ke server backend yang tersedia. Kata kuncinya di sini dapat diakses. Berdasarkan hal ini, kami memahami bahwa penyeimbang beban harus dapat memantau server kami dengan aplikasi dan menghentikan penyeimbangan lalu lintas ke node yang gagal.

3. Setelah penyeimbang, kami memiliki server aplikasi yang menjalankan aplikasi yang cukup sederhana. Itu harus dapat menerima permintaan masuk melalui HTTP, memvalidasi json yang dikirim dan memasukkan data ke dalam buffer.

4. Diagram menunjukkan kafka sebagai buffer, meskipun tentu saja layanan serupa lainnya dapat digunakan pada level ini. Kami akan membandingkan Kafka, Rabbitmq, dan yqs di artikel ketiga.

5. Titik kedua dari belakang arsitektur kami adalah Clickhouse - database berbentuk kolom yang memungkinkan Anda menyimpan dan memproses data dalam jumlah besar. Pada level ini, kita perlu mentransfer data dari buffer ke sistem penyimpanan itu sendiri (lebih lanjut tentang ini di artikel 4).

Desain ini memungkinkan kita untuk menskalakan setiap lapisan secara horizontal secara independen. Server backend tidak dapat mengatasinya - mari kita tambahkan satu hal lagi - lagipula, ini adalah aplikasi tanpa kewarganegaraan, dan oleh karena itu, hal ini dapat dilakukan bahkan secara otomatis. Buffer gaya Kafka tidak berfungsiβ€”mari tambahkan lebih banyak server dan transfer beberapa partisi topik kita ke server tersebut. Clickhouse tidak dapat mengatasinya - tidak mungkin :) Faktanya, kami juga akan menghubungkan server dan membagi data.

Omong-omong, jika Anda ingin menerapkan bagian opsional dari spesifikasi teknis dan skala kami di geolokasi yang berbeda, maka tidak ada yang lebih sederhana:

Kami menerima 10 acara di Yandex.Cloud. Bagian 000

Di setiap geolokasi kami menerapkan penyeimbang beban dengan aplikasi dan kafka. Secara umum, 2 server aplikasi, 3 node kafka, dan penyeimbang cloud, misalnya cloudflare, sudah cukup, yang akan memeriksa ketersediaan node aplikasi dan permintaan keseimbangan berdasarkan geolokasi berdasarkan alamat IP sumber klien. Dengan demikian, data yang dikirim oleh klien Amerika akan mendarat di server Amerika. Dan data dari Afrika ada di Afrika.

Maka semuanya cukup sederhana - kami menggunakan alat cermin dari kumpulan Kafka dan menyalin semua data dari semua lokasi ke pusat data pusat kami yang berlokasi di Rusia. Secara internal, kami mengurai data dan mencatatnya di Clickhouse untuk visualisasi selanjutnya.

Jadi, kami telah memilah arsitekturnya - mari mulai mengguncang Yandex.Cloud!

Menulis aplikasi

Sebelum Cloud, Anda masih harus sedikit bersabar dan menulis layanan yang cukup sederhana untuk memproses event yang masuk. Kami akan menggunakan golang karena telah membuktikan dirinya dengan baik sebagai bahasa untuk menulis aplikasi jaringan.

Setelah menghabiskan satu jam (mungkin beberapa jam), kita mendapatkan sesuatu seperti ini: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Apa poin utama yang ingin saya catat di sini:

1. Saat memulai aplikasi, Anda dapat menentukan dua tanda. Yang satu bertanggung jawab atas port tempat kita akan mendengarkan permintaan http yang masuk (-addr). Yang kedua adalah untuk alamat server kafka tempat kita akan merekam acara kita (-kafka):

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

2. Aplikasi menggunakan perpustakaan sarama ([] github.com/Shopify/sarama) untuk mengirim pesan ke cluster kafka. Kami segera mengatur pengaturan yang ditujukan untuk kecepatan pemrosesan maksimum:

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

3. Aplikasi kami juga memiliki klien prometheus bawaan, yang mengumpulkan berbagai metrik, seperti:

  • jumlah permintaan ke aplikasi kami;
  • jumlah kesalahan saat menjalankan permintaan (tidak mungkin membaca permintaan posting, json rusak, tidak mungkin menulis ke Kafka);
  • waktu pemrosesan untuk satu permintaan dari klien, termasuk waktu untuk menulis pesan ke Kafka.

4. Tiga titik akhir yang diproses aplikasi kita:

  • /status - cukup kembalikan ok untuk menunjukkan bahwa kita masih hidup. Meskipun Anda dapat menambahkan beberapa pemeriksaan, seperti ketersediaan cluster Kafka.
  • /metrik - menurut url ini, klien prometheus akan mengembalikan metrik yang telah dikumpulkannya.
  • /post adalah titik akhir utama tempat permintaan POST dengan json di dalamnya akan dikirim. Aplikasi kita memeriksa validitas json dan jika semuanya baik-baik saja, aplikasi akan menulis data ke cluster Kafka.

Saya akan membuat reservasi bahwa kodenya tidak sempurna - kode tersebut dapat (dan harus!) diselesaikan. Misalnya, Anda dapat berhenti menggunakan net/http bawaan dan beralih ke fasthttp yang lebih cepat. Atau Anda dapat memperoleh waktu pemrosesan dan sumber daya CPU dengan memindahkan pemeriksaan validitas json ke tahap selanjutnya - saat data ditransfer dari buffer ke cluster clickhouse.

Selain masalah pengembangan, kami segera memikirkan infrastruktur masa depan kami dan memutuskan untuk menerapkan aplikasi kami melalui buruh pelabuhan. Dockerfile terakhir untuk membangun aplikasi adalah https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Secara umum, ini cukup sederhana, satu-satunya hal yang ingin saya perhatikan adalah perakitan multi-tahap, yang memungkinkan kita memperkecil gambar akhir wadah kita.

Langkah pertama di cloud

Pertama-tama, daftarlah cloud.yandex.ru. Setelah mengisi semua kolom yang diperlukan, kami akan dibuatkan akun dan diberikan hibah sejumlah uang, yang dapat digunakan untuk menguji layanan cloud. Jika Anda ingin mengulangi semua langkah dari artikel kami, hibah ini sudah cukup untuk Anda.

Setelah pendaftaran, cloud terpisah dan direktori default akan dibuat untuk Anda, di mana Anda dapat mulai membuat sumber daya cloud. Secara umum, di Yandex.Cloud, hubungan sumber daya terlihat seperti ini:

Kami menerima 10 acara di Yandex.Cloud. Bagian 000

Anda dapat membuat beberapa cloud untuk satu akun. Dan di dalam cloud, buat direktori berbeda untuk proyek perusahaan berbeda. Anda dapat membaca lebih lanjut tentang ini di dokumentasi - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Ngomong-ngomong, saya akan sering merujuknya di bawah teks. Ketika saya menyiapkan seluruh infrastruktur dari awal, dokumentasinya membantu saya lebih dari sekali, jadi saya menyarankan Anda untuk mempelajarinya.

Untuk mengelola cloud, Anda dapat menggunakan antarmuka web dan utilitas konsol - yc. Instalasi dilakukan dengan satu perintah (untuk Linux dan Mac Os):

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

Jika pakar keamanan internal Anda sangat ingin menjalankan skrip dari Internet, pertama, Anda dapat membuka skrip dan membacanya, dan kedua, kami menjalankannya di bawah pengguna kami - tanpa hak root.

Jika Anda ingin menginstal klien untuk Windows, Anda dapat menggunakan petunjuknya di sini dan kemudian jalankan yc inituntuk menyesuaikannya sepenuhnya:

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

Pada prinsipnya, prosesnya sederhana - pertama Anda perlu mendapatkan token oauth untuk mengelola cloud, pilih cloud dan folder yang akan Anda gunakan.

Jika Anda memiliki beberapa akun atau folder dalam cloud yang sama, Anda dapat membuat profil tambahan dengan pengaturan terpisah melalui pembuatan profil yc config dan beralih di antara profil tersebut.

Selain metode di atas, tim Yandex.Cloud menulis dengan sangat baik plugin untuk terraform untuk mengelola sumber daya cloud. Bagi saya, saya menyiapkan repositori git, tempat saya menjelaskan semua sumber daya yang akan dibuat sebagai bagian dari artikel - https://github.com/rebrainme/yandex-cloud-events/. Kami tertarik dengan cabang master, mari kita kloning secara 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/

Semua variabel utama yang digunakan di terraform ditulis di file main.tf. Untuk memulai, buat file private.auto.tfvars di folder terraform dengan konten berikut:

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

Semua variabel dapat diambil dari daftar yc config, karena kita telah mengkonfigurasi utilitas konsol. Saya menyarankan Anda untuk segera menambahkan private.auto.tfvars ke .gitignore, agar tidak mempublikasikan data pribadi secara tidak sengaja.

Di private.auto.tfvars kami juga menentukan data dari Cloudflare - untuk membuat catatan DNS dan mem-proxy domain utama events.kis.im ke server kami. Jika Anda tidak ingin menggunakan cloudflare, hapus inisialisasi penyedia cloudflare di main.tf dan file dns.tf, yang bertanggung jawab untuk membuat catatan dns yang diperlukan.

Dalam pekerjaan kami, kami akan menggabungkan ketiga metode - antarmuka web, utilitas konsol, dan terraform.

Jaringan maya

Sejujurnya, Anda dapat melewati langkah ini, karena saat Anda membuat cloud baru, Anda secara otomatis akan memiliki jaringan terpisah dan 3 subnet yang dibuat - satu untuk setiap zona ketersediaan. Namun kami tetap ingin membuat jaringan terpisah untuk proyek kami dengan pengalamatannya sendiri. Diagram umum tentang cara kerja jaringan di Yandex.Cloud ditunjukkan pada gambar di bawah (sejujurnya diambil dari https://cloud.yandex.ru/docs/vpc/concepts/)

Kami menerima 10 acara di Yandex.Cloud. Bagian 000

Jadi, Anda membuat jaringan umum di mana sumber daya dapat berkomunikasi satu sama lain. Untuk setiap zona ketersediaan, subnet dibuat dengan pengalamatannya sendiri dan terhubung ke jaringan umum. Hasilnya, semua sumber daya cloud di dalamnya dapat berkomunikasi, meskipun berada di zona ketersediaan yang berbeda. Sumber daya yang terhubung ke jaringan cloud yang berbeda hanya dapat melihat satu sama lain melalui alamat eksternal. Ngomong-ngomong, bagaimana sihir ini bekerja di dalam, dijelaskan dengan baik di HabrΓ©.

Pembuatan jaringan dijelaskan dalam file network.tf dari repositori. Di sana kami membuat satu jaringan pribadi umum internal dan menghubungkan tiga subnet ke dalamnya di zona ketersediaan yang berbeda - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24 ).

Inisialisasi terraform dan buat 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.

Besar! Kami telah membuat jaringan kami dan sekarang siap untuk membuat layanan internal kami.

Membuat mesin virtual

Untuk menguji aplikasi, kita hanya perlu membuat dua mesin virtual - kita memerlukan mesin pertama untuk membangun dan menjalankan aplikasi, yang kedua untuk menjalankan kafka, yang akan kita gunakan untuk menyimpan pesan masuk. Dan kami akan membuat mesin lain tempat kami akan mengonfigurasi prometheus untuk memantau aplikasi.

Mesin virtual akan dikonfigurasi menggunakan ansible, jadi sebelum memulai terraform, pastikan Anda memiliki salah satu versi terbaru dari ansible. Dan instal peran yang diperlukan dengan galaksi yang mungkin:

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 dalam folder ansible terdapat contoh file konfigurasi .ansible.cfg yang saya gunakan. Ini mungkin berguna.

Sebelum membuat mesin virtual, pastikan Anda menjalankan ssh-agent dan menambahkan kunci ssh, jika tidak, terraform tidak akan dapat terhubung ke mesin yang dibuat. Saya, tentu saja, menemukan bug di os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Untuk mencegah hal ini terjadi lagi, tambahkan variabel kecil ke env sebelum meluncurkan Terraform:

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

Di folder dengan terraform kami membuat sumber daya yang diperlukan:

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

Jika semuanya berakhir dengan sukses (dan memang seharusnya demikian), maka kita akan memiliki tiga mesin virtual:

  1. build - mesin untuk menguji dan membangun aplikasi. Docker diinstal secara otomatis oleh Ansible.
  2. pemantauan - mesin pemantauan - prometheus & grafana diinstal di dalamnya. Login/password standar: admin/admin
  3. kafka adalah mesin kecil dengan kafka terinstal, dapat diakses pada port 9092.

Mari kita pastikan semuanya ada di tempatnya:

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 dayanya sudah tersedia, dan dari sini kita bisa mendapatkan alamat IP-nya. Berikut ini saya akan menggunakan alamat IP untuk terhubung melalui ssh dan menguji aplikasi. Jika Anda memiliki akun cloudflare yang terhubung ke terraform, silakan gunakan nama DNS yang baru dibuat.
Omong-omong, saat membuat mesin virtual, IP internal dan nama DNS internal diberikan, sehingga Anda dapat mengakses server dalam jaringan dengan nama:

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

Ini akan berguna bagi kita untuk menunjukkan titik akhir pada aplikasi dengan kafk.

Merakit aplikasi

Hebat, ada server, ada aplikasi - yang tersisa hanyalah merakit dan menerbitkannya. Untuk build kami akan menggunakan build buruh pelabuhan biasa, tetapi sebagai penyimpanan gambar kami akan menggunakan layanan dari Yandex - container registry. Tapi hal pertama yang pertama.

Kami menyalin aplikasi ke mesin build, masuk melalui ssh dan merakit 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

Setengah perjuangan telah selesai - sekarang kita dapat memeriksa fungsionalitas aplikasi kita dengan meluncurkannya dan mengirimkannya ke 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 merespons dengan keberhasilan perekaman dan menunjukkan id partisi dan offset di mana pesan tersebut disertakan. Yang perlu dilakukan hanyalah membuat registri di Yandex.Cloud dan mengunggah gambar kita di sana (cara melakukan ini menggunakan tiga baris dijelaskan dalam file registry.tf). Buat penyimpanan:

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.

Ada beberapa cara untuk mengautentikasi dalam registri kontainer - menggunakan token oauth, token iam, atau kunci akun layanan. Detail selengkapnya tentang metode ini dapat ditemukan di dokumentasi. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Kami akan menggunakan kunci akun layanan, jadi kami membuat 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.

Sekarang yang tersisa hanyalah membuat kuncinya:

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 menerima informasi tentang id penyimpanan kami, mentransfer kunci dan masuk:

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

Untuk mengunggah gambar ke registri, kita memerlukan ID registri kontainer, kita mengambilnya dari 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"

Setelah itu, kami menandai gambar kami dengan nama baru dan mengunggah:

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

Kami dapat memverifikasi bahwa gambar berhasil dimuat:

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

Omong-omong, jika Anda menginstal utilitas yc di mesin Linux, Anda dapat menggunakan perintah

yc container registry configure-docker

untuk mengkonfigurasi buruh pelabuhan.

Kesimpulan

Kami telah melakukan banyak kerja keras dan sebagai hasilnya:

  1. Kami datang dengan arsitektur layanan masa depan kami.
  2. Kami menulis sebuah aplikasi di golang yang mengimplementasikan logika bisnis kami.
  3. Kami mengumpulkannya dan menuangkannya ke dalam registri kontainer pribadi.

Di bagian selanjutnya, kita akan beralih ke hal menarik - kita akan merilis aplikasi kita ke dalam produksi dan akhirnya meluncurkan muatan di dalamnya. Jangan beralih!

Materi ini ada dalam rekaman video lokakarya terbuka REBRAIN & Yandex.Cloud: Kami menerima 10 permintaan per detik di Yandex Cloud - https://youtu.be/cZLezUm0ekE

Jika Anda tertarik untuk menghadiri acara semacam itu secara online dan mengajukan pertanyaan secara real time, sambungkan ke saluran DevOps oleh REBRAIN.

Kami ingin mengucapkan terima kasih khusus kepada Yandex.Cloud atas kesempatan menyelenggarakan acara semacam itu. Tautan ke mereka - https://cloud.yandex.ru/prices

Jika Anda perlu berpindah ke cloud atau memiliki pertanyaan tentang infrastruktur Anda, jangan ragu untuk meninggalkan permintaan.

PS Kami memiliki 2 audit gratis per bulan, mungkin proyek Anda adalah salah satunya.

Sumber: www.habr.com

Tambah komentar