Acceptăm 10 de evenimente în Yandex.Cloud. Partea 000

Salutare tuturor, prieteni!

* Acest articol se bazează pe atelierul deschis REBRAIN & Yandex.Cloud, dacă preferați să vizionați videoclipul, îl puteți găsi la acest link - https://youtu.be/cZLezUm0ekE

Recent am avut ocazia să încercăm live Yandex.Cloud. Deoarece am vrut să cercetăm lung și greu, am abandonat imediat ideea de a lansa un blog Wordpress simplu cu o bază de cloud - era prea plictisitor. După ce ne-am gândit, am decis să implementăm ceva similar cu o arhitectură de serviciu de producție pentru primirea și analizarea evenimentelor în mod aproape în timp real.

Sunt absolut sigur că marea majoritate a afacerilor online (și nu numai) colectează cumva o mulțime de informații despre utilizatorii și acțiunile lor. Cel puțin, acest lucru este necesar pentru a lua anumite decizii - de exemplu, dacă gestionați un joc online, puteți să vă uitați la statisticile la care nivel utilizatorii se blochează cel mai adesea și să vă ștergeți jucăria. Sau de ce utilizatorii părăsesc site-ul tău fără să cumpere nimic (bună ziua, Yandex.Metrica).

Deci, povestea noastră: cum am scris o aplicație în golang, am testat kafka vs rabbitmq vs yqs, am scris fluxul de date într-un cluster Clickhouse și am vizualizat datele folosind yandex datalens. Desigur, toate acestea au fost asezonate cu delicii de infrastructură sub formă de docker, terraform, gitlab ci și, bineînțeles, prometheus. Să mergem!

Aș dori să fac imediat o rezervare că nu vom putea configura totul dintr-o singură ședință - pentru asta vom avea nevoie de mai multe articole din serie. Câteva despre structură:

Partea 1 (o citești). Vom decide asupra specificațiilor și arhitecturii soluției și, de asemenea, vom scrie o aplicație în golang.
Partea 2. Lansăm aplicația noastră în producție, o facem scalabilă și testăm încărcarea.
Partea 3. Să încercăm să ne dăm seama de ce trebuie să stocăm mesajele într-un buffer și nu în fișiere și, de asemenea, să comparăm serviciul de coadă kafka, rabbitmq și yandex.
Partea 4 Vom implementa un cluster Clickhouse, vom scrie un serviciu de streaming pentru a transfera date din buffer acolo și vom configura vizualizarea în lens de date.
Partea 5 Să aducem întreaga infrastructură într-o formă adecvată - configurați ci/cd folosind gitlab ci, conectați monitorizarea și descoperirea serviciilor folosind prometheus și consul.

TK

În primul rând, să formulăm termenii de referință - ce anume vrem să obținem ca rezultat.

  1. Dorim să avem un punct final precum events.kis.im (kis.im este domeniul de testare pe care îl vom folosi în toate articolele), care ar trebui să primească evenimente folosind HTTPS.
  2. Evenimentele sunt un json simplu, cum ar fi: {“event”: “view”, “os”: “linux”, “browser”: “chrome”}. În etapa finală vom adăuga un pic mai multe câmpuri, dar acest lucru nu va juca un rol important. Dacă doriți, puteți trece la protobuf.
  3. Serviciul trebuie să poată procesa 10 de evenimente pe secundă.
  4. Ar trebui să fie posibilă scalarea orizontală prin simpla adăugare de noi instanțe la soluția noastră. Și va fi frumos dacă putem muta partea frontală în diferite locații geografice pentru a reduce latența la solicitările clienților.
  5. Toleranță la erori. Soluția trebuie să fie suficient de stabilă și să poată supraviețui căderii oricăror părți (până la un anumit număr, desigur).

Arhitectură

În general, pentru acest tip de sarcină au fost inventate de multă vreme arhitecturile clasice care permit scalarea eficientă. Figura prezintă un exemplu al soluției noastre.

Acceptăm 10 de evenimente în Yandex.Cloud. Partea 000

Deci ce avem:

1. În stânga sunt dispozitivele noastre care generează diverse evenimente, fie că este vorba de jucători care finalizează un nivel într-o jucărie de pe un smartphone sau creează o comandă într-un magazin online printr-un browser obișnuit. Un eveniment, așa cum este specificat în specificație, este un json simplu care este trimis către punctul nostru final - events.kis.im.

2. Primele două servere sunt simple echilibrare, sarcinile lor principale sunt:

  • Fii disponibil în mod constant. Pentru a face acest lucru, puteți utiliza, de exemplu, keepalived, care va comuta IP-ul virtual între noduri în caz de probleme.
  • Terminați TLS. Da, vom rezilia TLS pentru ele. În primul rând, pentru ca soluția noastră să respecte specificațiile tehnice și, în al doilea rând, pentru a scăpa de sarcina stabilirii unei conexiuni criptate de la serverele noastre backend.
  • Echilibrați cererile primite către serverele backend disponibile. Cuvântul cheie aici este accesibil. Pe baza acestui fapt, ajungem la înțelegerea că echilibratorii de încărcare trebuie să poată monitoriza serverele noastre cu aplicații și să nu mai echilibreze traficul către nodurile eșuate.

3. După echilibrare, avem servere de aplicații care rulează o aplicație destul de simplă. Ar trebui să poată accepta cererile primite prin HTTP, să valideze json-ul trimis și să pună datele într-un buffer.

4. Diagrama prezintă kafka ca un buffer, deși, desigur, alte servicii similare pot fi folosite la acest nivel. Vom compara Kafka, rabbitmq și yqs în al treilea articol.

5. Penultimul punct al arhitecturii noastre este Clickhouse - o bază de date coloană care vă permite să stocați și să procesați o cantitate imensă de date. La acest nivel, trebuie să transferăm date din buffer în sistemul de stocare în sine (mai multe despre asta în articolul 4).

Acest design ne permite să scalam fiecare strat în mod independent pe orizontală. Serverele de backend nu pot face față - să mai adăugăm un lucru - la urma urmei, sunt aplicații fără stat și, prin urmare, acest lucru se poate face chiar și automat. Buffer-ul în stil Kafka nu funcționează - să adăugăm mai multe servere și să le transferăm unele dintre partițiile subiectului nostru. Clickhouse nu se poate descurca - este imposibil :) De fapt, vom conecta și serverele și vom fragmenta datele.

Apropo, dacă doriți să implementați partea opțională a specificațiilor noastre tehnice și să scalați în diferite geolocații, atunci nu este nimic mai simplu:

Acceptăm 10 de evenimente în Yandex.Cloud. Partea 000

În fiecare locație geografică implementăm un echilibrator de încărcare cu aplicație și kafka. În general, sunt suficiente 2 servere de aplicații, 3 noduri kafka și un echilibrator cloud, de exemplu, cloudflare, care va verifica disponibilitatea nodurilor de aplicație și a echilibra cererile prin geolocalizare în funcție de adresa IP sursă a clientului. Astfel, datele trimise de un client american vor ateriza pe serverele americane. Și datele din Africa sunt în african.

Apoi totul este destul de simplu - folosim instrumentul oglindă din setul Kafka și copiem toate datele din toate locațiile în centrul nostru central de date situat în Rusia. Intern, analizăm datele și le înregistrăm în Clickhouse pentru vizualizare ulterioară.

Deci, am rezolvat arhitectura - să începem să tremurăm Yandex.Cloud!

Scrierea unei cereri

Înainte de Cloud, mai trebuie să aveți puțină răbdare și să scrieți un serviciu destul de simplu pentru a procesa evenimentele primite. Vom folosi golang pentru că s-a dovedit foarte bine ca limbaj pentru scrierea aplicațiilor de rețea.

După ce am petrecut o oră (poate câteva ore), obținem ceva de genul acesta: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Care sunt principalele puncte pe care aș dori să le remarc aici:

1. La pornirea aplicației, puteți specifica două steaguri. Unul este responsabil pentru portul pe care vom asculta cererile http (-addr). Al doilea este pentru adresa serverului kafka unde ne vom înregistra evenimentele (-kafka):

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

2. Aplicația folosește biblioteca sarama ([] github.com/Shopify/sarama) pentru a trimite mesaje grupului kafka. Setăm imediat setările care vizează viteza maximă de procesare:

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

3. Aplicația noastră are și un client prometheus încorporat, care colectează diverse valori, cum ar fi:

  • numărul de solicitări la aplicația noastră;
  • numărul de erori la executarea cererii (imposibil de citit solicitarea postării, json rupt, imposibil de scris către Kafka);
  • timpul de procesare pentru o solicitare din partea clientului, inclusiv timpul pentru scrierea unui mesaj către Kafka.

4. Trei puncte finale pe care le procesează aplicația noastră:

  • /status - pur și simplu întoarceți ok pentru a arăta că suntem în viață. Deși puteți adăuga câteva verificări, cum ar fi disponibilitatea clusterului Kafka.
  • /metrics - conform acestei adrese URL, clientul prometheus va returna valorile pe care le-a colectat.
  • /post este punctul final principal unde vor fi trimise cererile POST cu json în interior. Aplicația noastră verifică validitatea json și, dacă totul este ok, scrie datele în clusterul Kafka.

Voi face o rezervare că codul nu este perfect - poate (și ar trebui!) să fie completat. De exemplu, puteți înceta să utilizați net/http încorporat și să comutați la cel mai rapid fasthttp. Sau puteți câștiga timp de procesare și resurse CPU prin mutarea verificării validității json într-o etapă ulterioară - când datele sunt transferate din buffer în cluster-ul clickhouse.

Pe lângă partea de dezvoltare a problemei, ne-am gândit imediat la infrastructura noastră viitoare și am decis să implementăm aplicația noastră prin docker. Dockerfile final pentru construirea aplicației este https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. În general, este destul de simplu, singurul punct la care aș dori să fiu atent este ansamblul în mai multe etape, care ne permite să reducem imaginea finală a containerului nostru.

Primii pași în cloud

În primul rând, înregistrează-te pe cloud.yandex.ru. După completarea tuturor câmpurilor necesare, ni se va crea un cont și ni se va acorda un grant pentru o anumită sumă de bani, care poate fi folosită pentru a testa serviciile cloud. Dacă doriți să repetați toți pașii din articolul nostru, acest grant ar trebui să vă fie suficient.

După înregistrare, un cloud separat și un director implicit vor fi create pentru dvs., în care puteți începe să creați resurse cloud. În general, în Yandex.Cloud, relația dintre resurse arată astfel:

Acceptăm 10 de evenimente în Yandex.Cloud. Partea 000

Puteți crea mai multe nori pentru un singur cont. Și în interiorul cloud, creați directoare diferite pentru diferite proiecte ale companiei. Puteți citi mai multe despre acest lucru în documentație - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Apropo, mă voi referi adesea la el mai jos în text. Când am configurat întreaga infrastructură de la zero, documentația m-a ajutat de mai multe ori, așa că vă sfătuiesc să o studiați.

Pentru a gestiona cloud-ul, puteți utiliza atât interfața web, cât și utilitarul consolă - yc. Instalarea se realizează cu o singură comandă (pentru Linux și Mac Os):

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

Dacă specialistul în securitate internă se înfurie să ruleze scripturi de pe Internet, atunci, în primul rând, puteți deschide scriptul și îl puteți citi, iar în al doilea rând, îl rulăm sub utilizatorul nostru - fără drepturi de root.

Dacă doriți să instalați un client pentru Windows, puteți utiliza instrucțiunile aici și apoi executați yc initpentru a-l personaliza complet:

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

În principiu, procesul este simplu - mai întâi trebuie să obțineți un token de auth pentru a gestiona cloud-ul, selectați cloud-ul și folderul pe care îl veți folosi.

Dacă aveți mai multe conturi sau foldere în același nor, puteți crea profiluri suplimentare cu setări separate prin crearea profilului yc config și comutați între ele.

Pe lângă metodele de mai sus, echipa Yandex.Cloud a scris un foarte bun plugin pentru terraform pentru gestionarea resurselor cloud. La mine, am pregătit un depozit git, unde am descris toate resursele care vor fi create ca parte a articolului - https://github.com/rebrainme/yandex-cloud-events/. Suntem interesați de ramura principală, să o clonăm local:


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/

Toate variabilele principale care sunt utilizate în terraform sunt scrise în fișierul main.tf. Pentru a începe, creați un fișier private.auto.tfvars în folderul terraform cu următorul conținut:

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

Toate variabilele pot fi preluate din lista yc config, deoarece am configurat deja utilitarul consolei. Vă sfătuiesc să adăugați imediat private.auto.tfvars la .gitignore, pentru a nu publica accidental date private.

În private.auto.tfvars am specificat și date de la Cloudflare - pentru a crea înregistrări DNS și a trimite prin proxy domeniul principal events.kis.im către serverele noastre. Dacă nu doriți să utilizați cloudflare, eliminați inițializarea furnizorului cloudflare din main.tf și fișierul dns.tf, care este responsabil pentru crearea înregistrărilor dns necesare.

În munca noastră, vom combina toate cele trei metode - interfața web, utilitarul consolei și terraform.

Rețele virtuale

Sincer să fiu, ai putea sări peste acest pas, deoarece atunci când creezi un nou cloud, vei avea automat o rețea separată și 3 subrețele create - câte una pentru fiecare zonă de disponibilitate. Dar am dori totuși să facem o rețea separată pentru proiectul nostru, cu propria sa adresare. Diagrama generală a modului în care funcționează rețeaua în Yandex.Cloud este prezentată în figura de mai jos (luată sincer din https://cloud.yandex.ru/docs/vpc/concepts/)

Acceptăm 10 de evenimente în Yandex.Cloud. Partea 000

Deci, creați o rețea comună în cadrul căreia resursele pot comunica între ele. Pentru fiecare zonă de disponibilitate se creează o subrețea cu propria adresare și se conectează la rețeaua generală. Drept urmare, toate resursele cloud din acesta pot comunica, chiar dacă se află în zone de disponibilitate diferite. Resursele conectate la diferite rețele cloud se pot vedea între ele doar prin adrese externe. Apropo, cum funcționează această magie în interior, a fost bine descris pe Habré.

Crearea rețelei este descrisă în fișierul network.tf din depozit. Acolo creăm o rețea privată comună internă și conectăm trei subrețele la ea în diferite zone de disponibilitate - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24). ).

Inițializați terraform și creați rețele:

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.

Grozav! Ne-am creat rețeaua și suntem acum pregătiți să ne creăm serviciile interne.

Crearea de mașini virtuale

Pentru a testa aplicația, va trebui doar să creăm două mașini virtuale - vom avea nevoie de prima pentru a construi și rula aplicația, a doua pentru a rula kafka, pe care o vom folosi pentru a stoca mesajele primite. Și vom crea o altă mașină în care vom configura prometheus să monitorizeze aplicația.

Mașinile virtuale vor fi configurate folosind ansible, așa că înainte de a începe terraform, asigurați-vă că aveți una dintre cele mai recente versiuni de ansible. Și instalați rolurile necesare cu galaxia 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) $

În interiorul folderului ansible există un exemplu de fișier de configurare .ansible.cfg pe care îl folosesc. Ar putea veni la îndemână.

Înainte de a crea mașini virtuale, asigurați-vă că aveți ssh-agent care rulează și o cheie ssh adăugată, altfel terraform nu se va putea conecta la mașinile create. Desigur, am dat peste o eroare în os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Pentru a preveni ca acest lucru să se întâmple din nou, adăugați o variabilă mică la env înainte de a lansa Terraform:

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

În folderul cu terraform creăm resursele necesare:

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

Dacă totul s-a încheiat cu succes (și ar trebui să fie), atunci vom avea trei mașini virtuale:

  1. build - o mașină pentru testarea și construirea unei aplicații. Docker a fost instalat automat de Ansible.
  2. monitoring - o mașină de monitorizare - prometheus & grafana instalată pe ea. Login / parola standard: admin / admin
  3. kafka este o mașină mică cu kafka instalat, accesibilă pe portul 9092.

Să ne asigurăm că sunt toate la locul lor:

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

Resursele sunt la locul lor și de aici putem obține adresele lor IP. În cele ce urmează voi folosi adrese IP pentru a vă conecta prin ssh și a testa aplicația. Dacă aveți un cont cloudflare conectat la terraform, nu ezitați să utilizați nume DNS proaspăt create.
Apropo, atunci când creați o mașină virtuală, sunt date un IP intern și un nume DNS intern, astfel încât să puteți accesa serverele din rețea după nume:

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

Acest lucru ne va fi util pentru a indica aplicației punctul final cu kafk.

Asamblarea aplicației

Super, există servere, există o aplicație - tot ce rămâne este să o asamblați și să o publicați. Pentru build vom folosi versiunea obișnuită de docker, dar ca stocare a imaginilor vom folosi un serviciu de la Yandex - registry container. Dar mai întâi lucrurile.

Copiem aplicația în mașina de construcție, conectăm prin ssh și asamblam imaginea:

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

Jumătate din luptă este încheiată - acum putem verifica funcționalitatea aplicației noastre lansând-o și trimițând-o la 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) $

Aplicația a răspuns cu succes al înregistrării și indicând id-ul partiției și offset-ului în care a fost inclus mesajul. Tot ce mai rămâne de făcut este să creați un registru în Yandex.Cloud și să încărcați imaginea noastră acolo (cum să faceți acest lucru folosind trei linii este descris în fișierul registry.tf). Creați un spațiu de stocare:

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.

Există mai multe moduri de autentificare în registrul containerului - folosind un jeton de autorizare, un jeton iam sau o cheie de cont de serviciu. Mai multe detalii despre aceste metode pot fi găsite în documentație. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Vom folosi cheia contului de serviciu, așa că vom crea un cont:

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.

Acum tot ce rămâne este să-i faci o cheie:

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

Primim informații despre id-ul stocării noastre, transferăm cheia și conectăm:

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

Pentru a încărca imaginea în registru, avem nevoie de ID-ul de registru al containerului, îl luăm din utilitarul yc:

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

După aceea, etichetăm imaginea noastră cu un nume nou și încărcăm:

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

Putem verifica dacă imaginea s-a încărcat cu succes:

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

Apropo, dacă instalați utilitarul yc pe o mașină Linux, puteți utiliza comanda

yc container registry configure-docker

pentru a configura docker.

Concluzie

Am depus multă muncă grea și ca rezultat:

  1. Am venit cu arhitectura viitorului nostru serviciu.
  2. Am scris o aplicație în golang care implementează logica noastră de afaceri.
  3. L-am colectat și l-am turnat într-un registru privat al containerelor.

În partea următoare, vom trece la lucrurile interesante - vom lansa aplicația noastră în producție și, în sfârșit, vom lansa încărcarea pe ea. Nu comuta!

Acest material se află în înregistrarea video a atelierului deschis REBRAIN & Yandex.Cloud: Acceptăm 10 de solicitări pe secundă pe Yandex Cloud - https://youtu.be/cZLezUm0ekE

Dacă sunteți interesat să participați la astfel de evenimente online și să puneți întrebări în timp real, conectați-vă la canal DevOps de REBRAIN.

Dorim să mulțumim în mod special lui Yandex.Cloud pentru oportunitatea de a găzdui un astfel de eveniment. Link către ei - https://cloud.yandex.ru/prices

Dacă trebuie să treceți la cloud sau aveți întrebări despre infrastructura dvs., nu ezitați să lăsați o cerere.

PS Avem 2 audituri gratuite pe lună, poate că proiectul tău va fi unul dintre ele.

Sursa: www.habr.com

Adauga un comentariu