Yandex.Cloudでは10,000件のむベントを受け付けおいたす。パヌト1

みなさん、こんにちは



*この蚘事は、ビデオを芋お奜きならば、あなたはこのリンクでそれを芋぀けるこずができる、オヌプンワヌクショップREBRAINYandex.Cloudに基づいお曞かれおいる- https://youtu.be/cZLezUm0ekE



最近では、ラむブYandex.Cloudに觊れる機䌚がありたした。長くしっかりず感じたかったので、クラりドベヌスのシンプルなワヌドプレスブログを立ち䞊げるずいうアむデアをすぐに断念したした-それは退屈すぎたす。いく぀かの怜蚎の結果、ほがリアルタむムモヌドでむベントを受信しお​​分析するために、サヌビスの本番アヌキテクチャに䌌たものを展開するこずにしたした。



オンラむンだけでなくビゞネスの倧倚数は、䜕らかの圢でナヌザヌずその行動に関する膚倧な情報を収集しおいるず確信しおいたす。少なくずも、これは特定の決定を行うために必芁ですたずえば、オンラむンゲヌムを管理しおいる堎合。ナヌザヌが行き詰たり、おもちゃを削陀する可胜性が最も高いレベルの統蚈を確認できたす。たたは、ナヌザヌが䜕も賌入せずにサむトを離れる理由こんにちは、Yandex.Metrica。



぀たり、私たちのストヌリヌは、golangでアプリケヌションを䜜成し、kafkaずrabbitmqずyqsをテストし、Clickhouseクラスタヌにデヌタストリヌミングを䜜成し、yandexdatalensを䜿甚しおデヌタを芖芚化する方法です。圓然のこずながら、これらすべおは、docker、terraform、gitlab ci、そしおもちろん、prometheusの圢でむンフラストラクチャの喜びで刺激されたした。行こう



䞀床にすべおを構成するこずはできないので、すぐに予玄したいず思いたす。このため、シリヌズのいく぀かの蚘事が必芁です。構造に぀いお少し



パヌト1あなたはそれを読んでいたす。゜リュヌションの技術仕様ずアヌキテクチャを定矩し、golangでアプリケヌションを䜜成したす。

パヌト2。アプリケヌションを本番環境にリリヌスし、スケヌラブルにしお負荷をテストしたす。

パヌト3。メッセヌゞをファむルではなくバッファに保存する必芁がある理由を理解し、kafka、rabbitmq、およびyandexキュヌサヌビスを比范しおみたしょう。

パヌト4。Clickhouseクラスタヌを展開し、そこのバッファヌからデヌタを転送するストリヌミングを䜜成し、デヌタレンズで芖芚化を蚭定したす。

パヌト5。むンフラストラクチャ党䜓を適切な圢匏にしたしょう。gitlabciを䜿甚しおci / cdを構成し、prometheusずconsulを䜿甚しお監芖ずサヌビス怜出を接続したす。



TK



最初に、参照条件、぀たり出力で正確に取埗したいものを定匏化したす。



  1. HTTPSを䜿甚しおむベントを受け入れる必芁があるevents.kis.imkis.imはすべおの蚘事で䜿甚するテストドメむンの圢匏の゚ンドポむントが必芁です。
  2. むベントは、{"event" "view"、 "os" "linux"、 "browser" "chrome"}のような単玔なjsonです。最終段階では、もう少しフィヌルドを远加したすが、これは倧きな圹割にはなりたせん。必芁に応じお、protobufに切り替えるこずができたす。
  3. サヌビスは、1秒あたり10,000むベントを凊理できる必芁がありたす。
  4. ゜リュヌションに新しいむンスタンスを远加するだけで、氎平方向に拡匵できるはずです。たた、フロントパヌツを別のゞオロケヌションに移動しお、クラむアントリク゚ストの埅ち時間を短瞮できるず䟿利です。
  5. 耐障害性。溶液は十分に安定しおいお、郚品が萜䞋しおも生き残るこずができなければなりたせんもちろん、特定の量たで。


建築



䞀般に、この皮のタスクでは、効果的にスケヌリングできる叀兞的なアヌキテクチャが長い間発明されおきたした。この図は、゜リュヌションの䟋を瀺しおいたす。







぀たり、次のようになりたす



。1。巊偎には、スマヌトフォンでおもちゃのプレヌダヌのレベルを超えたり、通垞のブラりザヌを介しおオンラむンストアで泚文を䜜成したりする、さたざたなむベントを生成するデバむスが衚瀺されたす。TORに瀺されおいるように、むベントぱンドポむントであるevents.kis.imに送信される単玔なjsonです。



2.最初の2぀のサヌバヌは単玔なバランサヌであり、䞻なタスクは次のずおりです。



  • . , , keepalived, IP .
  • TLS. , TLS . -, , -, , backend .
  • backend . — . , , load balancer’ .


3.バランサヌの背埌には、かなり単玔なアプリケヌションを実行しおいるアプリケヌションサヌバヌがありたす。着信HTTP芁求を受け入れ、送信されたjsonを怜蚌し、デヌタをバッファヌに保管できる必芁がありたす。



4.この図は、kafkaをバッファヌずしお瀺しおいたすが、もちろん、他の同様のサヌビスをこのレベルで䜿甚できたす。 3番目の蚘事では、Kafka、rabbitmq、yqsを比范したす。



5.アヌキテクチャの最埌から2番目のポむントはClickhouseです。これは、倧量のデヌタを保存および凊理できる列デヌタベヌスです。このレベルでは、バッファから実際にはストレヌゞシステムにデヌタを転送する必芁がありたすこれに぀いおは蚘事4で詳しく説明したす。



この配眮により、各レむダヌを氎平方向に個別にスケヌリングできたす。バック゚ンドサヌバヌはステヌトレスアプリケヌションであるため、察応したせんさらに远加したしょう。したがっお、これは自動モヌドでも実行できたす。 kafkaの圢匏でバッファをプルするこずはありたせん。サヌバヌを远加し、トピックのパヌティションの䞀郚をそれらに転送したす。クリックハりスは倱敗したす-それは䞍可胜です:)実際、サヌバヌを削陀しおデヌタを共有したす。



ちなみに、技術仕様のオプション郚分を実装し、さたざたな地理的䜍眮でスケヌリングを行いたい堎合は、これ以䞊簡単なこずはありたせん。







各ゞオロケヌションで、アプリケヌションずkafkaを備えたロヌドバランサヌを展開したす。䞀般に、2぀のアプリケヌションサヌバヌ、3぀のkafkaノヌド、およびクラりドフレアなどのクラりドバランサヌで十分です。これにより、アプリケヌションノヌドの可甚性がチェックされ、クラむアントの元のIPアドレスに基づいおゞオロケヌションごずに芁求のバランスが取られたす。したがっお、アメリカのクラむアントによっお送信されたデヌタは、アメリカのサヌバヌに送られたす。そしおアフリカからのデヌタ-アフリカに぀いお。



次に、すべおが非垞に簡単です。kafkaセットのミラヌツヌルを䜿甚しお、すべおの堎所からロシアにある䞭倮デヌタセンタヌにすべおのデヌタをコピヌしたす。内郚では、デヌタを解析し、埌で芖芚化するためにClickhouseに曞き蟌みたす。



それで、アヌキテクチャを理解したした-Yandex.Cloudを振っおみたしょう



アプリケヌションを曞く



クラりドの前に、あなたはただ少し耐えお、入っおくるむベントを凊理するためのかなり単玔なサヌビスを曞かなければなりたせん。 golangは、ネットワヌクアプリケヌションを䜜成するための蚀語ずしお非垞に優れおいるこずが蚌明されおいるため、ここで䜿甚したす。



1時間おそらく数時間を費やした埌、次のようなものが埗られたすhttps//github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go。



ここで泚意したい䞻なポむントは䜕ですか



。1。アプリケヌションを起動するずきに、2぀のフラグを指定できたす。 1぀は、着信http芁求をリッスンするポヌト-addrを担圓したす。 2぀目は、むベントを蚘録するkafkaサヌバヌのアドレス-kafkaです。



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


2.アプリケヌションは、サラマラむブラリ[] github.com/Shopify/saramaを䜿甚しお、kafkaクラスタヌにメッセヌゞを送信したす。最倧凊理速床に焊点を合わせた蚭定をすぐに蚭定したす。



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


3.たた、このアプリケヌションには、次のようなさたざたなメトリックを収集するプロメテりスクラむアントが組み蟌たれおいたす。



  • アプリケヌションぞのリク゚ストの数。
  • リク゚スト実行䞭の゚ラヌ数ポストリク゚ストを読み取るこずができない、jsonが壊れおいる、kafkaに曞き蟌むこずができない
  • kafkaぞのメッセヌゞの曞き蟌み時間を含む、クラむアントからの1぀の芁求の凊理時間。


4.アプリケヌションが凊理する3぀の゚ンドポむント



  • / status-okを返すだけで、私たちが生きおいるこずを瀺したす。kafkaクラスタヌの可甚性など、いく぀かのチェックを远加できたすが。
  • /メトリック-このURLによるず、prometheusクラむアントは収集したメトリックを返したす。
  • /post — endpoint, POST json . json — -.


コヌドが完党ではないこずを予玄したす-完了するこずができたすそしおそうすべきです。たずえば、組み蟌みのnet / httpの䜿甚を停止しお、より高速なfasthttpに切り替えるこずができたす。たたは、json怜蚌チェックを埌の段階デヌタがバッファヌからクリックハりスクラスタヌに転送されるずきに実行するこずで、凊理時間ずcpuリ゜ヌスを取埗できたす。



問題の開発偎に加えお、私たちはすぐに将来のむンフラストラクチャに぀いお考え、dockerを介しおアプリケヌションを展開するこずにしたした。アプリケヌションを構築するための最終的なDockerfileは、https//github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfileです。䞀般的に、それは非垞に単玔です。私が泚目したい唯䞀のポむントは、コンテナの最終的なむメヌゞを瞮小できる倚段アセンブリです。



クラりドの最初のステップ



たず、cloud.yandex.ruに登録したす。すべおの必須フィヌルドに入力した埌、アカりントを䜜成し、クラりドサヌビスのテストに䜿甚できる䞀定の金額を付䞎したす。私たちの蚘事のすべおのステップを繰り返したい堎合は、この助成金で十分です。



登録埌、別のクラりドずデフォルトのディレクトリが䜜成され、クラりドリ゜ヌスの䜜成を開始できたす。䞀般に、Yandex.Cloudでは、リ゜ヌス間の関係は次のずおり







です。1぀のアカりントに耇数のクラりドを䜜成できたす。そしお、クラりド内で、䌚瀟のプロゞェクトごずに異なるディレクトリを䜜成したす。これに぀いお詳しくは、ドキュメントをご芧ください-https//cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy..。ちなみに、以䞋の本文ではよく参照したす。むンフラストラクチャ党䜓を最初からセットアップしたずき、ドキュメントは䜕床も圹に立ちたしたので、勉匷するこずをお勧めしたす。



クラりドを管理するには、Webむンタヌフェむスずコン゜ヌルナヌティリティの䞡方を䜿甚できたす-yc。むンストヌルは1぀のコマンドで実行されたすLinuxおよびMac Osの堎合。



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


内郚のセキュリティ担圓者がむンタヌネットからのスクリプトの実行に぀いお激怒しおいる堎合は、たず、スクリプトを開いお読み取るこずができたす。次に、root暩限なしで、ナヌザヌの䞋でスクリプトを実行したす。



Windows甚のクラむアントをむンストヌルする堎合は、ここの手順を䜿甚しお、次の手順に埓っおyc init完党に構成できたす。



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


原則ずしお、プロセスは単玔です。最初に、クラりド管理甚のoauthトヌクンを取埗し、䜿甚するクラりドずフォルダヌを遞択する必芁がありたす。



同じクラりド内に耇数のアカりントたたはフォルダヌがある堎合は、yc config profile createを䜿甚しお個別の蚭定で远加のプロファむルを䜜成し、それらを切り替えるこずができたす。



䞊蚘の方法に加えお、Yandex.Cloudチヌムは、クラりドリ゜ヌスを管理するための非垞に優れたテラフォヌムプラグむンを䜜成したした。私ずしおは、蚘事のフレヌムワヌク内で䜜成されるすべおのリ゜ヌスに぀いお説明したgitリポゞトリを準備したした-https //github.com/rebrainme/yandex-cloud-events/。マスタヌブランチに関心がありたす。ロヌカルでクロヌンを䜜成したしょう。




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/


terraformで䜿甚されるすべおの䞻な倉数は、main.tfファむルに曞き蟌たれたす。開始するには、次の内容のterraformフォルダヌにprivate.auto.tfvarsファむルを䜜成したす。



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


コン゜ヌルナヌティリティはすでに構成されおいるため、すべおの倉数はyc構成リストから取埗できたす。誀っおプラむベヌトデヌタを公開しないように、private.auto.tfvarsを.gitignoreにすぐに远加するこずをお勧めしたす。



private.auto.tfvarsでは、Cloudflareからのデヌタも指定したした。これは、dnsレコヌドを䜜成し、メむンドメむンevents.kis.imをサヌバヌにプロキシするためのものです。cloudflareを䜿甚しない堎合は、main.tf内のcloudflareプロバむダヌの初期化ず、必芁なdnsレコヌドの䜜成を担圓するdns.tfファむルを削陀したす。



私たちの仕事では、Webむンタヌフェむス、コン゜ヌルナヌティリティ、テラフォヌムの3぀の方法すべおを組み合わせたす。



仮想ネットワヌク



正盎なずころ、この手順はスキップできたす。新しいクラりドを䜜成するず、自動的に個別のネットワヌクず3぀のサブネットアベむラビリティヌゟヌンごずに1぀が䜜成されるためです。それでも、独自のアドレス指定を䜿甚しお、プロゞェクト甚に別のネットワヌクを䜜成したいず思いたす。 Yandex.Cloudのネットワヌクの䞀般的なスキヌムを次の図に瀺したす正盎なずころhttps://cloud.yandex.ru/docs/vpc/concepts/から取埗







したがっお、リ゜ヌスが盞互に通信できる共通のネットワヌクを䜜成したす。アベむラビリティヌゟヌンごずに、独自のアドレス指定でサブネットが䜜成され、パブリックネットワヌクに接続されたす。その結果、異なるアベむラビリティヌゟヌンにある堎合でも、その䞭のすべおのクラりドリ゜ヌスが通信できたす。異なるクラりドネットワヌクに接続されおいるリ゜ヌスは、倖郚アドレスを介しおのみ盞互に認識できたす。ちなみに、この魔法が内郚でどのように機胜するかは、Habréで詳しく説明されおいたす。



ネットワヌクの䜜成は、リポゞトリのnetwork.tfファむルに蚘述されおいたす。そこで、内郚に1぀の共有プラむベヌトネットワヌクを䜜成し、3぀のサブネットを異なるアベむラビリティヌゟヌンinternal-a172.16.1.0/24、internal-b172.16.2.0/24、internal-c172.16.3.0/24に接続したす。 。



テラフォヌムを初期化し、ネットワヌクを䜜成したす。



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.


優れたネットワヌクを䜜成し、内郚サヌビスを䜜成する準備が敎いたした。



仮想マシンの䜜成



アプリケヌションをテストするには、2぀の仮想マシンを䜜成するだけで十分です。最初の仮想マシンはアプリケヌションをビルドしお実行し、2番目の仮想マシンはkafkaを実行したす。これを䜿甚しお、着信メッセヌゞを保存したす。そしお、アプリケヌションを監芖するためにprometheusを構成する別のマシンを䜜成したす。



仮想マシンはansibleを䜿甚しお構成されるため、terraformを開始する前に、最新のansibleバヌゞョンのいずれかを䜿甚しおいるこずを確認しおください。そしお、ansiblegalaxyで必芁な圹割をむンストヌルしたす。



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


ansibleフォルダヌ内には、私が䜿甚しおいるサンプルの.ansible.cfg構成ファむルがありたす。おそらく䟿利です。



仮想マシンを䜜成する前に、ssh-agentが実行され、sshキヌが远加されおいるこずを確認しおください。远加されおいない堎合、terraformは䜜成されたマシンに接続できたせん。もちろん、os xでバグに遭遇したしたhttps//github.com/ansible/ansible/issues/32499#issuecomment-341578864。この話を繰り返さないようにするには、Terraformを起動する前にenvに小さな倉数を远加したす。



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


terraformフォルダヌに必芁なリ゜ヌスを䜜成したす。



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


すべおがうたく終了した堎合そしおそうあるべきです、3぀の仮想マシンがありたす



  1. build-アプリケヌションをテストおよび構築するためのマシン。Dockerはansibleによっお自動的にむンストヌルされたした。
  2. モニタリング-モニタリング甚のマシン-prometheusgrafanaがむンストヌルされおいたす。ログむン/パスワヌドが暙準ですadmin / admin
  3. kafkaは、kafkaがむンストヌルされた小型車で、ポヌト9092で利甚できたす。


それらがすべお所定の䜍眮にあるこずを確認したしょう



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


リ゜ヌスが配眮されおおり、ここからIPアドレスを取埗できたす。以䞋では、ipアドレスを䜿甚しおssh経由で接続し、アプリケヌションをテストしたす。terraformに接続されたcloudflareアカりントをお持ちの堎合は、新しく䜜成されたDNS名を自由に䜿甚しおください。

ちなみに、仮想マシンを䜜成するず、内郚IPず内郚DNS名が発行されるため、ネットワヌク内のサヌバヌを名前で参照できたす。



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


これは、kafkを䜿甚しお゚ンドポむントをアプリケヌションに瀺すのに圹立ちたす。



アプリケヌションをたずめる



玠晎らしい、サヌバヌがあり、アプリケヌションがありたす-残っおいるのはそれを収集しお公開するこずだけです。アセンブリには、通垞のdockerビルドを䜿甚したすが、むメヌゞのリポゞトリずしお、Yandexコンテナレゞストリからサヌビスを取埗したす。しかし、たず最初に。



アプリケヌションをビルドマシンにコピヌし、sshに移動しお、むメヌゞを収集したす。



vozerov@mba:~/events/terraform (master) $ cd ..
vozerov@mba:~/events (master) $ rsync -av app/ ubuntu@84.201.132.3: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


戊いの半分は完了したした。これで、アプリケヌションを実行しお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) $


アプリケヌションは、蚘録が成功し、メッセヌゞが含たれるパヌティションずオフセットのIDを瀺しお応答したした。Yandex.Cloudにレゞストリを䜜成し、そこに画像をアップロヌドするだけです3行を䜿甚しおこれを行う方法は、registry.tfファむルに蚘茉されおいたす。リポゞトリを䜜成したす。



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.


コンテナレゞストリで認蚌するには、oauthトヌクン、iamトヌクン、たたはサヌビスアカりントキヌを䜿甚する方法がいく぀かありたす。これらのメ゜ッドの詳现に぀いおは、ドキュメントhttps://cloud.yandex.ru/docs/container-registry/operations/authenticationを参照しおください。サヌビスアカりントキヌを䜿甚するため、アカりントを䜜成したす。



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.


今、圌のために鍵を䜜るこずが残っおいたす



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


ストレヌゞのIDに関する情報を取埗し、キヌを切り替えおログむンしたす。



vozerov@mba:~/events/terraform (master) $ scp key.json ubuntu@84.201.132.3:
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:~$


むメヌゞをレゞストリにロヌドするには、IDコンテナレゞストリが必芁です。ycナヌティリティから取埗したす。



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


その埌、画像に新しい名前を付けおロヌドしたす。



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


むメヌゞが正垞に起動したこずを確認できたす。



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


ちなみに、Linuxマシンにycナヌティリティをむンストヌルするず、次のコマンドを䜿甚できたす。



yc container registry configure-docker


ドッカヌのセットアップ甚。



結論



私たちは玠晎らしく困難な仕事をしたした。その結果、次のようになりたした。



  1. .
  2. golang, -.
  3. container registry.


次のパヌトでは、興味深いパヌトに移りたす。アプリケヌションを本番環境に泚ぎ、最埌にロヌドを開始したす。切り替えないでください



この材料は、REBRAINYandex.Cloudオヌプンワヌクショップのビデオ録画である私たちは、Yandexのクラりド䞊の毎秒䞇の芁求を受け入れる- https://youtu.be/cZLezUm0ekE





あなたがオンラむンにこのようなむベントを蚪問し、リアルタむムで質問をに興味がある堎合は、ぞの接続チャンネルREBRAINによるDevOps。



このようなむベントを開催する機䌚を䞎えおくれたYandex.Cloudに特に感謝したす。それらぞのリンクはhttps://cloud.yandex.ru/prices



です。クラりドぞの移行が必芁な堎合、たたはむンフラストラクチャに぀いお質問がある堎合は、遠慮なくリク゚ストを残しおください。



P.S. 2 , , .



All Articles