Kami menerima 10 acara dalam Yandex.Cloud. Bahagian 000

Hello semua, kawan-kawan!

* Artikel ini adalah berdasarkan bengkel terbuka REBRAIN & Yandex.Cloud, jika anda lebih suka menonton video, anda boleh menemuinya di pautan ini - https://youtu.be/cZLezUm0ekE

Baru-baru ini kami berpeluang mencuba Yandex.Cloud secara langsung. Oleh kerana kami ingin menyiasat panjang dan keras, kami segera meninggalkan idea untuk melancarkan blog Wordpress mudah dengan pangkalan awan - ia terlalu membosankan. Selepas beberapa pemikiran, kami memutuskan untuk menggunakan sesuatu yang serupa dengan seni bina perkhidmatan pengeluaran untuk menerima dan menganalisis peristiwa dalam mod hampir masa nyata.

Saya benar-benar pasti bahawa sebahagian besar perniagaan dalam talian (dan bukan sahaja) entah bagaimana mengumpulkan segunung maklumat tentang pengguna mereka dan tindakan mereka. Sekurang-kurangnya, ini diperlukan untuk membuat keputusan tertentu - contohnya, jika anda menguruskan permainan dalam talian, anda boleh melihat statistik pada tahap mana pengguna paling kerap tersekat dan memadamkan mainan anda. Atau mengapa pengguna meninggalkan tapak anda tanpa membeli apa-apa (hello, Yandex.Metrica).

Jadi, kisah kami: cara kami menulis aplikasi dalam golang, menguji kafka vs rabbitmq vs yqs, menulis penstriman data dalam kelompok Clickhouse dan memvisualisasikan data menggunakan yandex datalens. Sememangnya, semua ini dibumbui dengan keseronokan infrastruktur dalam bentuk docker, terraform, gitlab ci dan, sudah tentu, prometheus. Mari pergi!

Saya ingin segera membuat tempahan bahawa kami tidak akan dapat mengkonfigurasi semuanya dalam satu sesi - untuk ini kami memerlukan beberapa artikel dalam siri ini. Sedikit tentang struktur:

Bahagian 1 (anda sedang membacanya). Kami akan memutuskan spesifikasi dan seni bina penyelesaian, dan juga menulis aplikasi dalam golang.
Bahagian 2. Kami mengeluarkan aplikasi kami ke dalam pengeluaran, menjadikannya berskala dan menguji beban.
Bahagian 3. Mari cuba cari sebab kita perlu menyimpan mesej dalam penimbal dan bukan dalam fail, dan juga membandingkan perkhidmatan baris gilir kafka, rabbitmq dan yandex.
Bahagian 4 Kami akan menggunakan kluster Clickhouse, menulis perkhidmatan penstriman untuk memindahkan data daripada penimbal ke sana dan menyediakan visualisasi dalam lensa data.
Bahagian 5 Mari kita bawa keseluruhan infrastruktur ke dalam bentuk yang betul - sediakan ci/cd menggunakan gitlab ci, sambungkan pemantauan dan penemuan perkhidmatan menggunakan prometheus dan konsul.

TK

Mula-mula, mari kita rumuskan terma rujukan - apa sebenarnya yang ingin kita perolehi sebagai hasilnya.

  1. Kami mahu mempunyai titik akhir seperti events.kis.im (kis.im ialah domain ujian yang akan kami gunakan sepanjang semua artikel), yang sepatutnya menerima acara menggunakan HTTPS.
  2. Acara ialah json mudah seperti: {β€œevent”: β€œview”, β€œos”: β€œlinux”, β€œbrowser”: β€œchrome”}. Pada peringkat akhir kami akan menambah sedikit lagi medan, tetapi ini tidak akan memainkan peranan yang besar. Jika anda mahu, anda boleh bertukar kepada protobuf.
  3. Perkhidmatan mesti boleh memproses 10 acara sesaat.
  4. Anda boleh membuat skala secara mendatar dengan hanya menambah kejadian baharu pada penyelesaian kami. Dan adalah bagus jika kita boleh mengalihkan bahagian hadapan ke geolokasi yang berbeza untuk mengurangkan kependaman untuk permintaan pelanggan.
  5. Toleransi kesalahan. Penyelesaiannya mestilah cukup stabil dan dapat bertahan dari kejatuhan mana-mana bahagian (sehingga bilangan tertentu, sudah tentu).

seni bina

Secara umum, untuk jenis tugas ini, seni bina klasik telah lama dicipta yang membolehkan penskalaan yang cekap. Rajah menunjukkan contoh penyelesaian kami.

Kami menerima 10 acara dalam Yandex.Cloud. Bahagian 000

Jadi apa yang kita ada:

1. Di sebelah kiri ialah peranti kami yang menjana pelbagai acara, sama ada pemain melengkapkan tahap dalam mainan pada telefon pintar atau membuat pesanan di kedai dalam talian melalui pelayar biasa. Peristiwa, seperti yang dinyatakan dalam spesifikasi, ialah json mudah yang dihantar ke titik akhir kami - events.kis.im.

2. Dua pelayan pertama adalah pengimbang mudah, tugas utama mereka ialah:

  • Sentiasa tersedia. Untuk melakukan ini, anda boleh menggunakan, sebagai contoh, keepalived, yang akan menukar IP maya antara nod sekiranya berlaku masalah.
  • Tamatkan TLS. Ya, kami akan menamatkan TLS pada mereka. Pertama, supaya penyelesaian kami mematuhi spesifikasi teknikal, dan kedua, untuk meringankan beban mewujudkan sambungan yang disulitkan daripada pelayan bahagian belakang kami.
  • Imbangkan permintaan masuk ke pelayan bahagian belakang yang tersedia. Kata kunci di sini boleh diakses. Berdasarkan ini, kami mendapat pemahaman bahawa pengimbang beban mesti dapat memantau pelayan kami dengan aplikasi dan menghentikan mengimbangi trafik ke nod yang gagal.

3. Selepas pengimbang, kami mempunyai pelayan aplikasi yang menjalankan aplikasi yang agak mudah. Ia sepatutnya dapat menerima permintaan masuk melalui HTTP, mengesahkan json yang dihantar dan meletakkan data ke dalam penimbal.

4. Rajah menunjukkan kafka sebagai penampan, walaupun, sudah tentu, perkhidmatan lain yang serupa boleh digunakan pada tahap ini. Kami akan membandingkan Kafka, rabbitmq dan yqs dalam artikel ketiga.

5. Titik terakhir seni bina kami ialah Clickhouse - pangkalan data kolumnar yang membolehkan anda menyimpan dan memproses sejumlah besar data. Pada tahap ini, kita perlu memindahkan data daripada penimbal ke sistem storan itu sendiri (lebih lanjut mengenai perkara ini dalam artikel 4).

Reka bentuk ini membolehkan kami menskalakan setiap lapisan secara bebas secara mendatar. Pelayan bahagian belakang tidak dapat mengatasinya - mari tambah satu perkara lagi - lagipun, ia adalah aplikasi tanpa negara, dan oleh itu, ini boleh dilakukan secara automatik. Penampan gaya Kafka tidak berfungsiβ€”mari tambahkan lebih banyak pelayan dan pindahkan beberapa partition topik kita kepada mereka. Clickhouse tidak dapat mengendalikannya - mustahil :) Malah, kami juga akan menyambungkan pelayan dan memecahkan data.

Ngomong-ngomong, jika anda ingin melaksanakan bahagian pilihan spesifikasi teknikal dan skala kami dalam geolokasi yang berbeza, maka tiada yang lebih mudah:

Kami menerima 10 acara dalam Yandex.Cloud. Bahagian 000

Dalam setiap geolokasi kami menggunakan pengimbang beban dengan aplikasi dan kafka. Secara umum, 2 pelayan aplikasi, 3 nod kafka dan pengimbang awan, contohnya, cloudflare, sudah mencukupi, yang akan menyemak ketersediaan nod aplikasi dan permintaan baki mengikut geolokasi berdasarkan alamat IP sumber pelanggan. Oleh itu, data yang dihantar oleh pelanggan Amerika akan mendarat di pelayan Amerika. Dan data dari Afrika adalah dalam bahasa Afrika.

Kemudian semuanya agak mudah - kami menggunakan alat cermin dari set Kafka dan menyalin semua data dari semua lokasi ke pusat data pusat kami yang terletak di Rusia. Secara dalaman, kami menghuraikan data dan merekodkannya dalam Clickhouse untuk visualisasi seterusnya.

Jadi, kami telah menyelesaikan seni bina - mari kita mula menggegarkan Yandex.Cloud!

Menulis permohonan

Sebelum Cloud, anda masih perlu bersabar sedikit dan menulis perkhidmatan yang agak mudah untuk memproses acara masuk. Kami akan menggunakan golang kerana ia telah membuktikan dirinya dengan baik sebagai bahasa untuk menulis aplikasi rangkaian.

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

Apakah perkara utama yang saya ingin perhatikan di sini:

1. Apabila memulakan aplikasi, anda boleh menentukan dua bendera. Seseorang bertanggungjawab untuk port di mana kita akan mendengar permintaan http masuk (-addr). Yang kedua adalah untuk alamat pelayan kafka di mana kami akan merekodkan acara kami (-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 menghantar mesej kepada kelompok kafka. Kami segera menetapkan tetapan yang bertujuan untuk kelajuan pemprosesan maksimum:

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

3. Aplikasi kami juga mempunyai klien prometheus terbina dalam, yang mengumpulkan pelbagai metrik, seperti:

  • bilangan permintaan kepada permohonan kami;
  • bilangan ralat semasa melaksanakan permintaan (tidak mungkin membaca permintaan siaran, json rosak, mustahil untuk menulis kepada Kafka);
  • masa pemprosesan untuk satu permintaan daripada pelanggan, termasuk masa untuk menulis mesej kepada Kafka.

4. Tiga titik akhir yang diproses permohonan kami:

  • /status - hanya kembali ok untuk menunjukkan bahawa kita masih hidup. Walaupun anda boleh menambah beberapa semakan, seperti ketersediaan gugusan Kafka.
  • /metrics - mengikut url ini, klien prometheus akan mengembalikan metrik yang telah dikumpulkannya.
  • /post ialah titik akhir utama di mana permintaan POST dengan json di dalam akan dihantar. Aplikasi kami menyemak json untuk kesahihan dan jika semuanya ok, ia menulis data ke gugusan Kafka.

Saya akan membuat tempahan bahawa kod itu tidak sempurna - ia boleh (dan sepatutnya!) disiapkan. Sebagai contoh, anda boleh berhenti menggunakan net/http terbina dalam dan beralih kepada http cepat yang lebih pantas. Atau anda boleh mendapatkan masa pemprosesan dan sumber cpu dengan mengalihkan semakan kesahihan json ke peringkat seterusnya - apabila data dipindahkan daripada penimbal ke kluster clickhouse.

Sebagai tambahan kepada bahagian pembangunan isu, kami segera memikirkan tentang infrastruktur masa depan kami dan memutuskan untuk menggunakan aplikasi kami melalui docker. Fail Docker terakhir untuk membina aplikasi ialah https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Secara umum, ia agak mudah, satu-satunya perkara yang saya ingin perhatikan ialah pemasangan berbilang peringkat, yang membolehkan kami mengurangkan imej akhir bekas kami.

Langkah pertama dalam awan

Pertama sekali, daftar pada cloud.yandex.ru. Selepas mengisi semua medan yang diperlukan, kami akan membuat akaun dan diberi geran untuk sejumlah wang, yang boleh digunakan untuk menguji perkhidmatan awan. Jika anda ingin mengulangi semua langkah dari artikel kami, geran ini sepatutnya mencukupi untuk anda.

Selepas pendaftaran, awan yang berasingan dan direktori lalai akan dibuat untuk anda, di mana anda boleh mula mencipta sumber awan. Secara umum, dalam Yandex.Cloud, hubungan sumber kelihatan seperti ini:

Kami menerima 10 acara dalam Yandex.Cloud. Bahagian 000

Anda boleh membuat beberapa awan untuk satu akaun. Dan di dalam awan, buat direktori yang berbeza untuk projek syarikat yang berbeza. Anda boleh membaca lebih lanjut mengenai ini dalam dokumentasi - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. By the way, saya akan sering merujuknya di bawah dalam teks. Apabila saya menyediakan keseluruhan infrastruktur dari awal, dokumentasi membantu saya lebih daripada sekali, jadi saya menasihati anda untuk mengkajinya.

Untuk mengurus awan, anda boleh menggunakan kedua-dua antara muka web dan utiliti konsol - yc. Pemasangan dilakukan dengan satu arahan (untuk Linux dan Mac Os):

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

Jika pakar keselamatan dalaman anda marah tentang menjalankan skrip dari Internet, maka, pertama sekali, anda boleh membuka skrip dan membacanya, dan kedua, kami menjalankannya di bawah pengguna kami - tanpa hak akar.

Jika anda ingin memasang klien untuk Windows, anda boleh menggunakan arahan di sini dan kemudian laksanakan 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 dasarnya, prosesnya mudah - mula-mula anda perlu mendapatkan token oauth untuk mengurus awan, pilih awan dan folder yang akan anda gunakan.

Jika anda mempunyai beberapa akaun atau folder dalam awan yang sama, anda boleh membuat profil tambahan dengan tetapan berasingan melalui yc config profile create and switch between them.

Sebagai tambahan kepada kaedah di atas, pasukan Yandex.Cloud menulis yang sangat baik pemalam untuk terraform untuk menguruskan sumber awan. Bagi pihak saya, saya menyediakan repositori git, di mana saya menerangkan semua sumber yang akan dibuat sebagai sebahagian daripada artikel - https://github.com/rebrainme/yandex-cloud-events/. Kami berminat dengan cawangan induk, mari kita klon secara tempatan:


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 pembolehubah utama yang digunakan dalam terraform ditulis dalam fail utama.tf. Untuk bermula, cipta fail private.auto.tfvars dalam folder terraform dengan kandungan 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 pembolehubah boleh diambil dari senarai konfigurasi yc, kerana kami telah pun mengkonfigurasi utiliti konsol. Saya menasihati anda untuk segera menambah private.auto.tfvars pada .gitignore, supaya tidak menerbitkan data peribadi secara tidak sengaja.

Dalam private.auto.tfvars kami juga menetapkan data daripada Cloudflare - untuk mencipta rekod DNS dan memproksi domain utama events.kis.im kepada pelayan kami. Jika anda tidak mahu menggunakan cloudflare, kemudian alih keluar pengamulaan penyedia cloudflare dalam main.tf dan fail dns.tf, yang bertanggungjawab untuk mencipta rekod dns yang diperlukan.

Dalam kerja kami, kami akan menggabungkan ketiga-tiga kaedah - antara muka web, utiliti konsol dan terraform.

Rangkaian maya

Sejujurnya, anda boleh melangkau langkah ini, kerana apabila anda mencipta awan baharu, anda akan mempunyai rangkaian berasingan dan 3 subnet secara automatik dibuat - satu untuk setiap zon ketersediaan. Tetapi kami masih ingin membuat rangkaian berasingan untuk projek kami dengan pengalamatannya sendiri. Gambar rajah umum bagaimana rangkaian berfungsi dalam Yandex.Cloud ditunjukkan dalam rajah di bawah (sejujurnya diambil dari https://cloud.yandex.ru/docs/vpc/concepts/)

Kami menerima 10 acara dalam Yandex.Cloud. Bahagian 000

Jadi, anda mencipta rangkaian biasa di mana sumber boleh berkomunikasi antara satu sama lain. Untuk setiap zon ketersediaan, subnet dicipta dengan pengalamatannya sendiri dan disambungkan ke rangkaian umum. Akibatnya, semua sumber awan di dalamnya boleh berkomunikasi, walaupun mereka berada dalam zon ketersediaan yang berbeza. Sumber yang disambungkan ke rangkaian awan yang berbeza boleh melihat satu sama lain hanya melalui alamat luaran. Ngomong-ngomong, bagaimana sihir ini berfungsi di dalam, telah diterangkan dengan baik pada HabrΓ©.

Penciptaan rangkaian diterangkan dalam fail network.tf daripada repositori. Di sana kami mencipta satu dalaman rangkaian peribadi biasa dan menyambungkan tiga subnet kepadanya dalam zon ketersediaan yang berbeza - dalaman-a (172.16.1.0/24), dalaman-b (172.16.2.0/24), dalaman-c (172.16.3.0/24 ).

Mulakan terraform dan buat rangkaian:

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 telah mencipta rangkaian kami dan kini bersedia untuk mencipta perkhidmatan dalaman kami.

Mencipta mesin maya

Untuk menguji aplikasi, kami hanya perlu mencipta dua mesin maya - kami memerlukan yang pertama untuk membina dan menjalankan aplikasi, yang kedua untuk menjalankan kafka, yang akan kami gunakan untuk menyimpan mesej masuk. Dan kami akan mencipta mesin lain di mana kami akan mengkonfigurasi prometheus untuk memantau aplikasi.

Mesin maya akan dikonfigurasikan menggunakan ansible, jadi sebelum memulakan terraform, pastikan anda mempunyai salah satu versi terbaharu ansible. Dan pasang peranan yang diperlukan dengan 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 dalam folder ansible terdapat contoh fail konfigurasi .ansible.cfg yang saya gunakan. Ia mungkin berguna.

Sebelum mencipta mesin maya, pastikan anda menjalankan ssh-agent dan kunci ssh ditambah, jika tidak terraform tidak akan dapat menyambung ke mesin yang dibuat. Saya, sudah tentu, menemui pepijat dalam os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Untuk mengelakkan perkara ini berlaku lagi, tambahkan pembolehubah kecil pada env sebelum melancarkan Terraform:

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

Dalam folder dengan terraform kami mencipta sumber 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 jayanya (dan sepatutnya), maka kita akan mempunyai tiga mesin maya:

  1. bina - mesin untuk menguji dan membina aplikasi. Docker telah dipasang secara automatik oleh Ansible.
  2. pemantauan - mesin pemantauan - prometheus & grafana dipasang padanya. Log masuk / kata laluan standard: admin / admin
  3. kafka ialah mesin kecil dengan kafka dipasang, boleh diakses pada port 9092.

Mari pastikan semuanya berada 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 telah tersedia, dan dari sini kita boleh mendapatkan alamat IP mereka. Sepanjang perkara berikut saya akan menggunakan alamat IP untuk menyambung melalui ssh dan menguji aplikasi. Jika anda mempunyai akaun cloudflare yang disambungkan ke terraform, sila gunakan nama DNS yang baru dibuat.
Dengan cara ini, apabila mencipta mesin maya, IP dalaman dan nama DNS dalaman diberikan, supaya anda boleh mengakses pelayan dalam rangkaian 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 berguna untuk kami menunjukkan kepada aplikasi titik akhir dengan kafk.

Memasang aplikasi

Hebat, ada pelayan, ada aplikasi - yang tinggal hanyalah memasang dan menerbitkannya. Untuk binaan kami akan menggunakan binaan docker biasa, tetapi sebagai storan imej kami akan menggunakan perkhidmatan daripada Yandex - pendaftaran kontena. Tetapi perkara pertama dahulu.

Kami menyalin aplikasi ke mesin binaan, log masuk melalui ssh dan kumpulkan imej:

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

Separuh pertempuran telah selesai - kini kami boleh menyemak kefungsian aplikasi kami dengan melancarkannya dan menghantarnya 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 bertindak balas dengan kejayaan rakaman dan menunjukkan id partition dan offset di mana mesej itu disertakan. Apa yang perlu dilakukan ialah membuat pendaftaran dalam Yandex.Cloud dan muat naik imej kami di sana (cara melakukan ini menggunakan tiga baris diterangkan dalam fail registry.tf). Buat storan:

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.

Terdapat beberapa cara untuk mengesahkan dalam pendaftaran kontena - menggunakan token oauth, token iam atau kunci akaun perkhidmatan. Butiran lanjut tentang kaedah ini boleh didapati dalam dokumentasi. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Kami akan menggunakan kunci akaun perkhidmatan, jadi kami membuat akaun:

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 tinggal hanyalah membuat kunci untuknya:

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 maklumat tentang id storan kami, memindahkan kunci dan log 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 memuat naik imej ke pendaftaran, kami memerlukan ID pendaftaran kontena, kami mengambilnya daripada 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"

Selepas itu, kami menandakan imej kami dengan nama baharu dan memuat naik:

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 boleh mengesahkan bahawa imej berjaya dimuatkan:

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

Dengan cara ini, jika anda memasang utiliti yc pada mesin Linux, anda boleh menggunakan arahan itu

yc container registry configure-docker

untuk mengkonfigurasi docker.

Kesimpulan

Kami telah melakukan banyak kerja keras dan hasilnya:

  1. Kami menghasilkan seni bina perkhidmatan masa depan kami.
  2. Kami menulis aplikasi dalam golang yang melaksanakan logik perniagaan kami.
  3. Kami mengumpulnya dan menuangkannya ke dalam daftar kontena persendirian.

Dalam bahagian seterusnya, kami akan beralih kepada perkara yang menarik - kami akan mengeluarkan aplikasi kami ke dalam pengeluaran dan akhirnya melancarkan beban padanya. Jangan tukar!

Bahan ini ada dalam rakaman video bengkel terbuka REBRAIN & Yandex.Cloud: Kami menerima 10 permintaan sesaat di Yandex Cloud - https://youtu.be/cZLezUm0ekE

Jika anda berminat untuk menghadiri acara sedemikian dalam talian dan bertanya soalan dalam masa nyata, sambung ke DevOps oleh saluran REBRAIN.

Kami ingin mengucapkan terima kasih kepada Yandex.Cloud atas peluang untuk menganjurkan acara sebegini. Pautan kepada mereka - https://cloud.yandex.ru/prices

Jika anda perlu beralih ke awan atau mempunyai soalan tentang infrastruktur anda, Jangan ragu untuk menghantar permintaan.

PS Kami mempunyai 2 audit percuma setiap bulan, mungkin projek anda akan menjadi salah satu daripadanya.

Sumber: www.habr.com

Tambah komen