Gidawat namo ang 10 ka panghitabo sa Yandex.Cloud. Bahin 000

Kumusta sa tanan, mga higala!

* Kini nga artikulo gibase sa REBRAIN & Yandex.Cloud open workshop, kung gusto nimo nga tan-awon ang video, makit-an nimo kini nga link - https://youtu.be/cZLezUm0ekE

Bag-ohay lang kami nakahigayon sa pagsulay sa Yandex.Cloud nga live. Tungod kay gusto namong susihon ang dugay ug lisud, gibiyaan dayon namon ang ideya sa paglansad sa usa ka yano nga blog sa Wordpress nga adunay base sa panganod - kini labi ka makalaay. Human sa pipila ka paghunahuna, nakahukom kami nga mag-deploy og butang nga susama sa arkitektura sa serbisyo sa produksiyon para sa pagdawat ug pag-analisar sa mga panghitabo sa duol nga real time mode.

Sigurado ako nga ang kadaghanan sa mga online (ug dili lamang) nga mga negosyo sa usa ka paagi nangolekta usa ka bukid nga kasayuran bahin sa ilang mga tiggamit ug sa ilang mga aksyon. Sa labing gamay, gikinahanglan kini alang sa paghimo sa pipila nga mga desisyon - pananglitan, kung nagdumala ka sa usa ka online nga dula, mahimo nimong tan-awon ang mga estadistika kung diin ang lebel sa mga tiggamit kanunay nga ma-stuck ug matangtang ang imong dulaan. O nganong gibiyaan sa mga tiggamit ang imong site nga wala mopalit bisan unsa (hello, Yandex.Metrica).

Busa, ang among istorya: giunsa namo pagsulat ang usa ka aplikasyon sa golang, gisulayan ang kafka vs rabbitmq vs yqs, nagsulat sa data streaming sa usa ka Clickhouse cluster ug nagtan-aw sa datos gamit ang yandex datalens. Siyempre, kining tanan gitimplahan sa mga kalipayan sa imprastraktura sa porma sa docker, terraform, gitlab ci ug, siyempre, prometheus. Adto na ta!

Gusto nako nga maghimo dayon usa ka reserbasyon nga dili namon ma-configure ang tanan sa usa ka paglingkod - alang niini magkinahanglan kami daghang mga artikulo sa serye. Usa ka gamay bahin sa istruktura:

Part 1 (nagbasa ka niini). Magdesisyon kami sa mga detalye ug arkitektura sa solusyon, ug magsulat usab usa ka aplikasyon sa golang.
Bahin 2. Gipagawas namo ang among aplikasyon ngadto sa produksyon, gihimo kini nga scalable ug gisulayan ang load.
Bahin 3. Atong sulayan nga mahibal-an kung nganong kinahanglan natong tipigan ang mga mensahe sa usa ka buffer ug dili sa mga file, ug itandi usab ang kafka, rabbitmq ug yandex queue service.
Bahin 4 Mag-deploy kami og Clickhouse cluster, magsulat og streaming nga serbisyo aron mabalhin ang data gikan sa buffer didto, ug mag-set up og visualization sa datalens.
Bahin 5 Atong dad-on ang tibuok nga imprastraktura sa saktong porma - i-set up ang ci/cd gamit ang gitlab ci, ikonektar ang monitoring ug service discovery gamit ang prometheus ug consul.

TK

Una, atong mugnaon ang mga termino sa pakisayran - unsa gayud ang gusto natong makuha isip resulta.

  1. Gusto namo nga adunay endpoint sama sa events.kis.im (kis.im mao ang test domain nga among gamiton sa tanang artikulo), nga kinahanglang makadawat og mga panghitabo gamit ang HTTPS.
  2. Ang mga panghitabo kay yano nga json sama sa: {β€œevent”: β€œview”, β€œos”: β€œlinux”, β€œbrowser”: β€œchrome”}. Sa katapusan nga yugto magdugang kami og gamay pa nga mga natad, apan dili kini adunay dako nga papel. Kung gusto nimo, mahimo kang mobalhin sa protobuf.
  3. Ang serbisyo kinahanglan nga makahimo sa pagproseso sa 10 nga mga panghitabo matag segundo.
  4. Mahimong posible ang pagsukod nga pinahigda pinaagi lamang sa pagdugang og bag-ong mga higayon sa among solusyon. Ug kini maayo kung mahimo naton ibalhin ang atubangan nga bahin sa lainlaing mga geolocation aron makunhuran ang latency alang sa mga hangyo sa kliyente.
  5. Ang pagtugot sa sayup. Ang solusyon kinahanglan nga igo nga lig-on ug makalahutay sa pagkahulog sa bisan unsang mga bahin (hangtod sa usa ka piho nga numero, siyempre).

arkitektura

Sa kinatibuk-an, alang niini nga matang sa buluhaton, ang mga klasikal nga arkitektura dugay na nga naimbento nga nagtugot sa episyente nga pag-scale. Ang numero nagpakita sa usa ka pananglitan sa among solusyon.

Gidawat namo ang 10 ka panghitabo sa Yandex.Cloud. Bahin 000

Busa unsay naa nato:

1. Sa wala mao ang among mga himan nga nagmugna og lain-laing mga panghitabo, kini man ang mga magdudula nga nagkompleto sa usa ka lebel sa usa ka dulaan sa usa ka smartphone o paghimo og usa ka order sa usa ka online nga tindahan pinaagi sa usa ka regular nga browser. Ang usa ka panghitabo, ingon nga gipiho sa espesipikasyon, usa ka yano nga json nga gipadala sa among endpoint - events.kis.im.

2. Ang unang duha ka server kay yanong mga tigbalanse, ang ilang nag-unang buluhaton mao ang:

  • Kanunay nga magamit. Aron mahimo kini, mahimo nimong gamiton, pananglitan, keepalived, nga magbalhin sa virtual IP tali sa mga node kung adunay mga problema.
  • Ihunong ang TLS. Oo, atong tapuson ang TLS sa kanila. Una, aron ang among solusyon nagsunod sa teknikal nga mga detalye, ug ikaduha, aron mahupay ang palas-anon sa pag-establisar sa usa ka naka-encrypt nga koneksyon gikan sa among mga backend server.
  • Balanse ang umaabot nga mga hangyo sa mga magamit nga backend server. Ang yawe nga pulong dinhi ma-access. Pinasukad niini, nahibal-an namon nga ang mga balanse sa pagkarga kinahanglan nga ma-monitor ang among mga server gamit ang mga aplikasyon ug ihunong ang pagbalanse sa trapiko sa mga napakyas nga node.

3. Human sa mga balancer, kami adunay mga server sa aplikasyon nga nagpadagan sa usa ka yano nga aplikasyon. Kini kinahanglan nga makadawat sa umaabot nga mga hangyo pinaagi sa HTTP, balido ang gipadala nga json ug ibutang ang datos sa usa ka buffer.

4. Ang diagram nagpakita sa kafka isip buffer, bisan pa, siyempre, ang ubang susama nga mga serbisyo mahimong gamiton niini nga lebel. Atong itandi ang Kafka, rabbitmq ug yqs sa ikatulo nga artikulo.

5. Ang penultimate nga punto sa among arkitektura mao ang Clickhouse - usa ka columnar database nga nagtugot kanimo sa pagtipig ug pagproseso sa usa ka dako nga kantidad sa datos. Niini nga lebel, kinahanglan natong ibalhin ang datos gikan sa buffer ngadto sa storage system mismo (labaw pa niini sa artikulo 4).

Kini nga disenyo nagtugot kanato sa pag-scale sa matag layer nga independente nga pinahigda. Ang mga backend server dili makasagubang - magdugang kita og usa pa ka butang - human sa tanan, sila mga stateless nga mga aplikasyon, ug busa, mahimo kini nga awtomatiko. Ang Kafka-style buffer dili molihok-atong idugang ang daghang mga server ug ibalhin ang pipila ka mga partisyon sa among hilisgutan ngadto kanila. Dili makaya sa Clickhouse - imposible :) Sa tinuud, ikonektar usab namon ang mga server ug i-shard ang datos.

Pinaagi sa dalan, kung gusto nimo ipatuman ang opsyonal nga bahin sa among teknikal nga mga detalye ug sukod sa lainlaing mga geolocation, nan wala’y mas simple:

Gidawat namo ang 10 ka panghitabo sa Yandex.Cloud. Bahin 000

Sa matag geolocation nag-deploy kami og load balancer nga adunay aplikasyon ug kafka. Sa kinatibuk-an, igo na ang 2 nga mga server sa aplikasyon, 3 kafka nodes ug usa ka balanse sa panganod, pananglitan, cloudflare, nga magsusi sa pagkaanaa sa mga node sa aplikasyon ug mga hangyo sa balanse pinaagi sa geolocation base sa gigikanan nga IP address sa kliyente. Sa ingon, ang datos nga gipadala sa usa ka kliyente nga Amerikano moabut sa mga server sa Amerika. Ug ang datos gikan sa Africa naa sa Africa.

Unya ang tanan yano ra - gigamit namon ang himan sa salamin gikan sa set sa Kafka ug gikopya ang tanan nga datos gikan sa tanan nga mga lokasyon sa among sentro nga sentro sa datos nga nahimutang sa Russia. Sa sulod, among gi-parse ang datos ug girekord kini sa Clickhouse alang sa sunod nga pagtan-aw.

Busa, among gihan-ay ang arkitektura - magsugod ta sa pag-uyog sa Yandex.Cloud!

Pagsulat og aplikasyon

Sa wala pa ang Cloud, kinahanglan ka pa nga usa ka gamay nga pasensya ug magsulat usa ka yano nga serbisyo aron maproseso ang umaabot nga mga panghitabo. Gamiton nato ang golang tungod kay napamatud-an na niini ang kaugalingon ingon nga usa ka pinulongan alang sa pagsulat sa mga aplikasyon sa network.

Human sa paggugol ug usa ka oras (tingali duha ka oras), aduna kitay makuha nga sama niini: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

Unsa ang mga nag-unang punto nga gusto nakong timan-an dinhi:

1. Sa pagsugod sa aplikasyon, mahimo nimong ipiho ang duha ka mga bandila. Ang usa mao ang responsable sa pantalan diin kami maminaw sa umaabot nga mga hangyo sa http (-addr). Ang ikaduha alang sa kafka server address diin among irekord ang among mga panghitabo (-kafka):

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

2. Ang aplikasyon naggamit sa sarama library ([] github.com/Shopify/sarama) para magpadala ug mga mensahe sa kafka cluster. Gitakda dayon namo ang mga setting nga gitumong sa maximum nga katulin sa pagproseso:

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

3. Ang among aplikasyon aduna usab usa ka built-in nga prometheus nga kliyente, nga nagkolekta sa lainlaing mga sukatan, sama sa:

  • gidaghanon sa mga hangyo sa among aplikasyon;
  • gidaghanon sa mga kasaypanan sa dihang nagpatuman sa hangyo (imposible nga basahon ang hangyo sa post, nabuak nga json, imposible nga magsulat sa Kafka);
  • oras sa pagproseso alang sa usa ka hangyo gikan sa kliyente, lakip ang oras sa pagsulat sa usa ka mensahe sa Kafka.

4. Tulo ka mga endpoint nga giproseso sa among aplikasyon:

  • /status - balik lang ok para ipakita nga buhi ta. Bisan kung mahimo nimong idugang ang pipila nga mga tseke, sama sa pagkaanaa sa cluster sa Kafka.
  • /metrics - sumala niini nga url, ibalik sa prometheus nga kliyente ang mga sukatan nga nakolekta niini.
  • /post mao ang nag-unang katapusan diin ang mga hangyo sa POST nga adunay json sa sulod ipadala. Gisusi sa among aplikasyon ang json alang sa pagkabalido ug kung ok ang tanan, gisulat niini ang datos sa cluster sa Kafka.

Maghimo ako usa ka reserbasyon nga ang code dili perpekto - mahimo kini (ug kinahanglan!) Makompleto. Pananglitan, mahimo nimong hunongon ang paggamit sa built-in nga net/http ug mobalhin sa mas paspas nga http. O mahimo nimong makuha ang oras sa pagproseso ug mga kapanguhaan sa cpu pinaagi sa pagbalhin sa pagsusi sa kabalido sa json sa usa ka ulahi nga yugto - kung ang datos gibalhin gikan sa buffer hangtod sa cluster sa clickhouse.

Dugang pa sa bahin sa pag-uswag sa isyu, gihunahuna dayon namon ang among umaabot nga imprastraktura ug nakahukom nga i-deploy ang among aplikasyon pinaagi sa docker. Ang katapusan nga Dockerfile alang sa pagtukod sa aplikasyon mao ang https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile. Sa kinatibuk-an, kini yano ra, ang bugtong punto nga gusto nakong hatagan ug pagtagad mao ang multistage assembly, nga nagtugot kanamo sa pagpakunhod sa katapusang hulagway sa among sudlanan.

Unang mga lakang sa panganod

Una sa tanan, magparehistro sa cloud.yandex.ru. Human mapuno ang tanan nga gikinahanglan nga mga natad, maghimo kami usa ka account ug hatagan usa ka grant alang sa usa ka piho nga kantidad sa salapi, nga magamit aron masulayan ang mga serbisyo sa panganod. Kung gusto nimo nga sublion ang tanan nga mga lakang gikan sa among artikulo, kini nga grant kinahanglan nga igo na alang kanimo.

Pagkahuman sa pagparehistro, usa ka bulag nga panganod ug usa ka default nga direktoryo ang himuon alang kanimo, diin mahimo ka magsugod sa paghimo sa mga kapanguhaan sa panganod. Sa kinatibuk-an, sa Yandex.Cloud, ang relasyon sa mga kahinguhaan ingon niini:

Gidawat namo ang 10 ka panghitabo sa Yandex.Cloud. Bahin 000

Makahimo ka og daghang mga panganod alang sa usa ka account. Ug sa sulod sa panganod, paghimo og lainlaing mga direktoryo alang sa lainlaing mga proyekto sa kompanya. Mahimo nimong mabasa ang dugang bahin niini sa dokumentasyon - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy. Pinaagi sa dalan, ako kanunay nga maghisgot niini sa ubos sa teksto. Kung gipahimutang nako ang tibuuk nga imprastraktura gikan sa wala, ang dokumentasyon nakatabang kanako labaw sa kausa, mao nga gitambagan ko ikaw nga tun-an kini.

Sa pagdumala sa panganod, mahimo nimong gamiton ang web interface ug ang console utility - yc. Ang pag-instalar gihimo sa usa ka sugo (alang sa Linux ug Mac Os):

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

Kung ang imong internal nga espesyalista sa seguridad nasuko bahin sa pagpadagan sa mga script gikan sa Internet, nan, una, mahimo nimong ablihan ang script ug basahon kini, ug ikaduha, gipadagan namon kini sa ilawom sa among tiggamit - nga wala’y mga katungod sa gamut.

Kung gusto nimo i-install ang usa ka kliyente alang sa Windows, mahimo nimong gamiton ang mga panudlo dinhi ug dayon ipatuman yc initaron hingpit nga i-customize kini:

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

Sa prinsipyo, ang proseso yano ra - una kinahanglan nimo nga makakuha usa ka oauth token aron madumala ang panganod, pilia ang panganod ug ang folder nga imong gamiton.

Kung adunay ka daghang mga account o folder sa parehas nga panganod, mahimo ka maghimo dugang nga mga profile nga adunay lahi nga mga setting pinaagi sa yc config profile paghimo ug pagbalhin sa taliwala nila.

Dugang pa sa mga pamaagi sa ibabaw, ang Yandex.Cloud team misulat sa usa ka maayo kaayo plugin alang sa terraform alang sa pagdumala sa mga kapanguhaan sa panganod. Sa akong bahin, nag-andam ako usa ka git repository, diin akong gihulagway ang tanan nga mga kahinguhaan nga himuon isip bahin sa artikulo - https://github.com/rebrainme/yandex-cloud-events/. Interesado kami sa master branch, atong i-clone kini sa 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/

Ang tanan nga mga nag-unang variable nga gigamit sa terraform gisulat sa main.tf file. Aron makasugod, paghimo ug private.auto.tfvars file sa terraform folder nga adunay mosunod nga sulod:

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

Ang tanan nga mga variable mahimong makuha gikan sa yc config list, tungod kay na-configure na namo ang console utility. Gitambagan ko ikaw nga idugang dayon ang private.auto.tfvars sa .gitignore, aron dili aksidente nga mamantala ang pribadong datos.

Sa private.auto.tfvars gipiho usab namo ang datos gikan sa Cloudflare - aron makamugna og DNS records ug proxy ang main domain events.kis.im sa among mga server. Kung dili nimo gusto nga mogamit sa cloudflare, unya kuhaa ang pagsugod sa cloudflare provider sa main.tf ug ang dns.tf file, nga responsable sa paghimo sa gikinahanglan nga mga rekord sa dns.

Sa among trabaho among i-combine ang tanang tulo ka pamaagi - ang web interface, ang console utility, ug terraform.

Mga virtual nga network

Sa tinuud, mahimo nimong laktawan kini nga lakang, tungod kay kung maghimo ka usa ka bag-ong panganod, awtomatiko ka nga adunay usa ka lahi nga network ug 3 nga mga subnet nga gihimo - usa alang sa matag availability zone. Apan gusto gihapon namon nga maghimo usa ka lahi nga network alang sa among proyekto nga adunay kaugalingon nga pag-address. Ang kinatibuk-ang diagram kung giunsa ang network nagtrabaho sa Yandex.Cloud gipakita sa numero sa ubos (matinud-anon nga gikuha gikan sa https://cloud.yandex.ru/docs/vpc/concepts/)

Gidawat namo ang 10 ka panghitabo sa Yandex.Cloud. Bahin 000

Mao nga, naghimo ka usa ka sagad nga network diin ang mga kapanguhaan mahimong makigsulti sa usag usa. Alang sa matag availability zone, usa ka subnet ang gihimo nga adunay kaugalingong addressing ug konektado sa kinatibuk-ang network. Ingon usa ka sangputanan, ang tanan nga mga kahinguhaan sa panganod nga naa niini mahimong makigkomunikar, bisan kung naa sila sa lainlaing mga lugar nga magamit. Ang mga kahinguhaan nga konektado sa lain-laing mga cloud network makita lamang sa usag usa pinaagi sa mga eksternal nga adres. Pinaagi sa dalan, giunsa kini nga salamangka sa sulod, Maayo nga gihulagway ni HabrΓ©.

Ang paghimo sa network gihulagway sa network.tf file gikan sa repository. Didto naghimo kami og usa ka komon nga pribadong network nga internal ug nagkonektar sa tulo ka mga subnet niini sa lain-laing mga availability zones - internal-a (172.16.1.0/24), internal-b (172.16.2.0/24), internal-c (172.16.3.0/24 ).

Pagsugod sa terraform ug paghimo og mga network:

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.

Nindot! Gibuhat namo ang among network ug andam na kami sa paghimo sa among internal nga serbisyo.

Paghimo og mga virtual machine

Aron masulayan ang aplikasyon, kinahanglan ra namon nga maghimo duha ka virtual nga makina - kinahanglan namon ang una nga magtukod ug magpadagan sa aplikasyon, ang ikaduha nga magpadagan sa kafka, nga among gamiton sa pagtipig sa mga umaabot nga mensahe. Ug maghimo kami usa ka makina diin among i-configure ang prometheus aron ma-monitor ang aplikasyon.

Ang mga virtual machine ma-configure gamit ang ansible, busa sa dili pa magsugod ang terraform, siguroha nga ikaw adunay usa sa pinakabag-o nga bersyon sa ansible. Ug i-install ang kinahanglan nga mga tahas sa ansible nga galaksiya:

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) $

Sa sulod sa ansible folder adunay usa ka pananglitan nga .ansible.cfg configuration file nga akong gigamit. Mahimong magamit kini.

Sa dili pa maghimo og mga virtual nga makina, siguroha nga ikaw adunay ssh-agent nga nagdagan ug usa ka ssh nga yawe nga gidugang, kung dili ang terraform dili makakonektar sa gibuhat nga mga makina. Ako, siyempre, nakakita og usa ka bug sa os x: https://github.com/ansible/ansible/issues/32499#issuecomment-341578864. Aron mapugngan kini nga mahitabo pag-usab, pagdugang usa ka gamay nga variable sa env sa wala pa ilunsad ang Terraform:

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

Sa folder nga adunay terraform naghimo kami sa gikinahanglan nga mga kapanguhaan:

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

Kung malampuson nga natapos ang tanan (ug kinahanglan kini), nan kita adunay tulo nga virtual nga makina:

  1. pagtukod - usa ka makina alang sa pagsulay ug pagtukod sa usa ka aplikasyon. Ang Docker awtomatikong gi-install sa Ansible.
  2. monitoring - usa ka monitoring machine - prometheus & grafana nga gibutang niini. Sumbanan sa pag-login / password: admin / admin
  3. Ang kafka usa ka gamay nga makina nga na-install ang kafka, ma-access sa port 9092.

Atong siguroon nga naa sila tanan:

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

Ang mga kahinguhaan anaa na, ug gikan dinhi makuha nato ang ilang mga IP address. Sa tanan nga mosunod akong gamiton ang mga IP address aron makonektar pinaagi sa ssh ug sulayan ang aplikasyon. Kung ikaw adunay usa ka cloudflare nga account nga konektado sa terraform, ayaw pagduhaduha sa paggamit sa bag-ong gibuhat nga mga ngalan sa DNS.
Pinaagi sa dalan, sa paghimo sa usa ka virtual nga makina, usa ka internal nga IP ug usa ka internal nga ngalan sa DNS gihatag, aron ma-access nimo ang mga server sa sulod sa network pinaagi sa ngalan:

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

Mapuslanon kini alang kanamo nga ipakita sa aplikasyon ang katapusan nga punto sa kafk.

Pag-assemble sa aplikasyon

Maayo, adunay mga server, adunay usa ka aplikasyon - ang nahabilin mao ang pag-assemble niini ug pagmantala niini. Alang sa pagtukod gamiton namon ang naandan nga pagtukod sa docker, apan ingon usa ka pagtipig sa imahe mogamit kami usa ka serbisyo gikan sa Yandex - container registry. Apan una sa tanan.

Gikopya namo ang aplikasyon sa makina sa pagtukod, pag-log in pinaagi sa ssh ug pag-assemble sa imahe:

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

Nahuman na ang katunga sa gubat - karon masusi na nato ang pagpaandar sa atong aplikasyon pinaagi sa paglansad niini ug ipadala kini sa 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) $

Ang aplikasyon mitubag uban sa kalampusan sa recording ug nagpakita sa id sa partition ug offset diin ang mensahe gilakip. Ang nahabilin nga buhaton mao ang paghimo usa ka rehistro sa Yandex.Cloud ug i-upload ang among imahe didto (kung giunsa kini buhaton gamit ang tulo nga linya gihulagway sa registry.tf file). Paghimo og storage:

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.

Adunay daghang mga paagi sa pag-authenticate sa container registry - gamit ang oauth token, iam token, o usa ka service account key. Ang dugang nga mga detalye bahin niini nga mga pamaagi makita sa dokumentasyon. https://cloud.yandex.ru/docs/container-registry/operations/authentication. Gamiton namo ang service account key, mao nga maghimo mi og account:

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.

Karon ang nahabilin mao ang paghimo usa ka yawe alang niini:

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

Nakadawat kami og impormasyon bahin sa id sa among storage, pagbalhin sa yawe ug pag-log in:

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

Aron ma-upload ang imahe sa rehistro, kinahanglan namon ang container registry ID, gikuha namon kini gikan sa yc utility:

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

Pagkahuman niana, among gi-tag ang among imahe nga adunay bag-ong ngalan ug i-upload:

ubuntu@build:~$ sudo docker tag app cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
ubuntu@build:~$ sudo docker push cr.yandex/crpdgj6c9umdhgaqjfmm/events:v1
The push refers to repository [cr.yandex/crpdgj6c9umdhgaqjfmm/events]
8c286e154c6e: Pushed
477c318b05cb: Pushed
beee9f30bc1f: Pushed
v1: digest: sha256:1dd5aaa9dbdde2f60d833be0bed1c352724be3ea3158bcac3cdee41d47c5e380 size: 946

Atong mapamatud-an nga ang hulagway malampusong nakarga:

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

Pinaagi sa dalan, kung imong i-install ang yc utility sa usa ka makina sa Linux, mahimo nimong gamiton ang mando

yc container registry configure-docker

aron ma-configure ang docker.

konklusyon

Nakahimo kami og daghang kakugi ug isip resulta:

  1. Naghimo kami sa arkitektura sa among umaabot nga serbisyo.
  2. Nagsulat kami usa ka aplikasyon sa golang nga nagpatuman sa among lohika sa negosyo.
  3. Gikolekta namo kini ug gibubo kini sa usa ka pribadong rehistro sa sudlanan.

Sa sunod nga bahin, magpadayon kami sa makapaikag nga mga butang - ipagawas namon ang among aplikasyon sa produksiyon ug sa katapusan ilunsad ang load niini. Ayaw pagbalhin!

Kini nga materyal anaa sa video recording sa open workshop REBRAIN & Yandex.Cloud: Gidawat namo ang 10 ka hangyo kada segundo sa Yandex Cloud - https://youtu.be/cZLezUm0ekE

Kung interesado ka sa pagtambong sa ingon nga mga panghitabo online ug pagpangutana sa mga pangutana sa tinuud nga oras, kumonekta sa DevOps pinaagi sa REBRAIN channel.

Gusto namon nga isulti ang usa ka espesyal nga salamat sa Yandex.Cloud alang sa higayon nga mag-host sa ingon nga kalihokan. Link sa kanila - https://cloud.yandex.ru/prices

Kung kinahanglan nimo nga mobalhin sa panganod o adunay mga pangutana bahin sa imong imprastraktura, Mobati nga gawasnon sa pagsumite sa usa ka hangyo.

PS Adunay kami 2 nga libre nga pag-audit matag bulan, tingali ang imong proyekto usa na niini.

Source: www.habr.com

Idugang sa usa ka comment