Yandex.Cloud では 10 件のむベントを受け入れたす。 パヌト000

みなさん、こんにちは

* この蚘事は REBRAIN ず Yandex.Cloud オヌプン ワヌクショップに基づいおいたす。ビデオを芋たい堎合は、このリンクから芋぀けるこずができたす。 https://youtu.be/cZLezUm0ekE

最近、Yandex.Cloud をラむブで詊す機䌚がありたした。 私たちは長く培底的に調査したかったので、クラりド ベヌスでシンプルな Wordpress ブログを立ち䞊げるずいう考えはあたりにも退屈だったのですぐに攟棄したした。 少し考えた結果、ほがリアルタむム モヌドでむベントを受信しお​​分析するための実皌働サヌビス アヌキテクチャに䌌たものをデプロむするこずにしたした。

私は、倧倚数のオンラむン䌁業 (オンラむン䌁業に限らず) が、䜕らかの方法でナヌザヌずその行動に関する倧量の情報を収集しおいるず確信しおいたす。 少なくずも、これは特定の決定を䞋すために必芁です。たずえば、オンラむン ゲヌムを管理しおいる堎合、ナヌザヌがどのレベルでスタックするこずが最も倚く、おもちゃを削陀するかずいう統蚈を確認できたす。 たたは、ナヌザヌが䜕も賌入せずにサむトを離れる理由 (こんにちは、Yandex.Metrica)。

ずいうこずで、私たちのストヌリヌは、どのようにしお golang でアプリケヌションを䜜成し、kafka、rabbitmq、yqs をテストし、Clickhouse クラスタヌでデヌタ ストリヌミングを䜜成し、yandex datalens を䜿甚しおデヌタを芖芚化したかです。 圓然のこずながら、これらすべおは、docker、terraform、gitlab ci、そしおもちろん prometheus の圢でのむンフラストラクチャの喜びで味付けされおいたす。 さあ行こう

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

パヌト 1 (あなたは読んでいたす)。 ゜リュヌションの仕様ずアヌキテクチャを決定し、golang でアプリケヌションを䜜成したす。
パヌト2。 アプリケヌションを実皌働環境にリリヌスし、スケヌラブルにしお負荷をテストしたす。
パヌト 3。 なぜメッセヌゞをファむルではなくバッファヌに保存する必芁があるのか​​を理解しお、kafka、rabbitmq、yandex キュヌ サヌビスを比范しおみたしょう。
パヌト 4 Clickhouse クラスタヌをデプロむし、そこにあるバッファヌからデヌタを転送するストリヌミング サヌビスを䜜成し、datalens で芖芚化をセットアップしたす。
パヌト5 むンフラストラクチャ党䜓を適切な圢に敎えたしょう。gitlab ci を䜿甚しお ci/cd をセットアップし、prometheus ず consul を䜿甚しおモニタリングずサヌビス怜出を接続したす。

TK

たず、結果ずしお正確に䜕を取埗したいのかずいう委蚗条件を定匏化したしょう。

  1. events.kis.im (kis.im はすべおの蚘事で䜿甚するテスト ドメむン) のような゚ンドポむントが必芁で、HTTPS を䜿甚しおむベントを受信する必芁がありたす。
  2. むベントは、{“event”: “view”, “os”: “linux”, “browser”: “chrome”} のような単玔な json です。 最終段階ではさらにフィヌルドを远加したすが、これは倧きな圹割を果たしたせん。 必芁に応じお、protobuf に切り替えるこずができたす。
  3. サヌビスは 10 秒あたり 000 件のむベントを凊理できる必芁がありたす。
  4. 新しいむンスタンスを゜リュヌションに远加するだけで、氎平方向に拡匵できるはずです。 たた、クラむアントリク゚ストのレむテンシを短瞮するために、フロント郚分を別の地理的䜍眮に移動できれば玠晎らしいでしょう。
  5. フォヌルトトレランス。 ゜リュヌションは十分に安定しおおり、郚品が萜䞋しおも耐えられる必芁がありたす (もちろん、䞀定数たで)。

アヌキテクチャ

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

Yandex.Cloud では 10 件のむベントを受け入れたす。 パヌト000

それで、私たちが持っおいるものは次のずおりです。

1. 巊偎には、プレヌダヌがスマヌトフォン䞊のおもちゃのレベルを完了したり、通垞のブラりザヌを通じおオンラむン ストアで泚文を䜜成したりするさたざたなむベントを生成するデバむスがありたす。 仕様で指定されおいるむベントは、゚ンドポむント events.kis.im に送信される単玔な JSON です。

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

  • 垞に利甚できるようにしおください。 これを行うには、たずえば、問題が発生した堎合にノヌド間で仮想 IP を切り替える keepalived を䜿甚できたす。
  • TLSを終了したす。 はい、それらの TLS を終了したす。 第䞀に、圓瀟の゜リュヌションが技術仕様に準拠するため、第二に、バック゚ンド サヌバヌから暗号化された接続を確立する負担を軜枛するためです。
  • 受信リク゚ストのバランスを利甚可胜なバック゚ンド サヌバヌに分散したす。 ここでのキヌワヌドはアクセス可胜です。 これに基づいお、ロヌド バランサヌはアプリケヌションを䜿甚しおサヌバヌを監芖し、障害が発生したノヌドぞのトラフィックの分散を停止できなければならないずいう理解に達したした。

3. バランサヌの埌には、非垞に単玔なアプリケヌションを実行するアプリケヌション サヌバヌがありたす。 HTTP 経由で受信リク゚ストを受け入れ、送信された JSON を怜蚌し、デヌタをバッファヌに入れるこずができる必芁がありたす。

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

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

この蚭蚈により、各レむダヌを氎平方向に独立しお拡倧瞮小するこずができたす。 バック゚ンド サヌバヌは察応できたせん。もう XNUMX ぀付け加えおおきたす。結局のずころ、バック゚ンド サヌバヌはステヌトレス アプリケヌションなので、これは自動的に行うこずもできたす。 Kafka スタむルのバッファヌは機胜したせん。サヌバヌをさらに远加しお、トピックのパヌティションの䞀郚をサヌバヌに転送したしょう。 Clickhouse はそれを凊理できたせん - 䞍可胜です :) 実際、サヌバヌに接続しおデヌタをシャヌディングするこずもしたす。

ちなみに、技術仕様のオプション郚分を実装しお、さたざたな地理䜍眮情報に拡匵したい堎合、これほど簡単なものはありたせん。

Yandex.Cloud では 10 件のむベントを受け入れたす。 パヌト000

各地理䜍眮情報に、アプリケヌションず Kafka を備えたロヌド バランサヌをデプロむしたす。 䞀般に、2 ぀のアプリケヌション サヌバヌ、3 ぀の Kafka ノヌド、およびクラりド バランサヌ (cloudflare など) で十分です。クラりド バランサヌは、アプリケヌション ノヌドの可甚性をチェックし、クラむアントの゜ヌス IP アドレスに基づいお地理䜍眮情報によっおリク゚ストのバランスをずりたす。 したがっお、アメリカのクラむアントから送信されたデヌタはアメリカのサヌバヌに到達したす。 そしおアフリカのデヌタはアフリカにありたす。

その埌、すべおが非垞に簡単になりたす。Kafka セットのミラヌ ツヌルを䜿甚し、すべおのデヌタをすべおの堎所からロシアにある䞭倮デヌタ センタヌにコピヌしたす。 内郚的にはデヌタを解析し、その埌の芖芚化のために Clickhouse に蚘録したす。

アヌキテクチャを敎理したした。Yandex.Cloud を動かし始めたしょう。

アプリケヌションの䜜成

クラりドが登堎する前は、ただ少し蟛抱匷く、受信むベントを凊理する非垞に単玔なサヌビスを䜜成する必芁がありたす。 golang はネットワヌク アプリケヌションを䜜成するための蚀語ずしお非垞に優れおいるこずが蚌明されおいるため、ここでは golang を䜿甚したす。

XNUMX 時間 (おそらく数時間) 費やした埌、次のような結果が埗られたす。 https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

ここで泚意したい䞻な点は次のずおりです。

1. アプリケヌションの起動時に、XNUMX ぀のフラグを指定できたす。 XNUMX ぀は、受信 http リク゚ストをリッスンするポヌト (-addr) を担圓したす。 XNUMX 番目は、むベントを蚘録する kafka サヌバヌのアドレス甚です (-kafka)。

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

2. アプリケヌションは、sarama ラむブラリ ([]github.com/Shopify/sarama) メッセヌゞを Kafka クラスタヌに送信したす。 すぐに最倧の凊理速床を目的ずした蚭定を行いたした。

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

3. 私たちのアプリケヌションには、次のようなさたざたなメトリクスを収集する組み蟌みの prometheus クラむアントもありたす。

  • アプリケヌションぞのリク゚ストの数。
  • リク゚スト実行時の゚ラヌの数 (ポストリク゚ストを読み取るこずができない、JSON が壊れる、Kafka に曞き蟌むこずができない)。
  • Kafka ぞのメッセヌゞの曞き蟌み時間を含む、クラむアントからの XNUMX ぀のリク゚ストの凊理時間。

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

  • /status - 生きおいるこずを瀺すには単に ok を返したす。 ただし、Kafka クラスタヌの可甚性など、いく぀かのチェックを远加できたす。
  • /metrics - この URL に埓っお、prometheus クラむアントは収集したメトリクスを返したす。
  • /post は、内郚に json を含む POST リク゚ストが送信されるメむン ゚ンドポむントです。 私たちのアプリケヌションは、json の有効性をチェックし、すべおが正垞であれば、デヌタを Kafka クラスタヌに曞き蟌みたす。

このコヌドは完璧ではないこずを留保しおおきたすが、完成させるこずは可胜です (そしおそうすべきです!)。 たずえば、組み蟌みの net/http の䜿甚を停止し、より高速な fasthttp に切り替えるこずができたす。 たたは、json 劥圓性チェックを埌の段階 (デヌタがバッファヌからクリックハりス クラスタヌに転送されるずき) に移動するこずで、凊理時間ず CPU リ゜ヌスを獲埗できたす。

この問題の開発面に加えお、私たちはすぐに将来のむンフラストラクチャに぀いお怜蚎し、Docker 経由でアプリケヌションをデプロむするこずにしたした。 アプリケヌションを構築するための最終的な Dockerfile は次のずおりです。 https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile。 䞀般に、これは非垞に単玔ですが、泚意したい唯䞀の点は、コンテナの最終むメヌゞを削枛できる倚段階アセンブリです。

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

たずは、こちらに登録しおください クラりド.yandex.ru。 必芁なフィヌルドをすべお入力するず、アカりントが䜜成され、クラりド サヌビスのテストに䜿甚できる䞀定額の助成金が䞎えられたす。 この蚘事のすべおの手順を繰り返したい堎合は、この補助金で十分です。

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

Yandex.Cloud では 10 件のむベントを受け入れたす。 パヌト000

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

クラりドを管理するには、Web むンタヌフェむスずコン゜ヌル ナヌティリティ (yc) の䞡方を䜿甚できたす。 むンストヌルは XNUMX ぀のコマンドで実行されたす (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/。 master ブランチに興味があるので、ロヌカルにクロヌンを䜜成したしょう。


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 ファむルに曞き蟌たれたす。 たず、次の内容を含む private.auto.tfvars ファむルを terraform フォルダヌに䜜成したす。

# 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 config リストから取埗できたす。 プラむベヌト デヌタを誀っお公開しないように、盎ちに private.auto.tfvars を .gitignore に远加するこずをお勧めしたす。

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

私たちの䜜業では、Web むンタヌフェむス、コン゜ヌル ナヌティリティ、Terraform の XNUMX ぀のメ゜ッドをすべお組み合わせたす。

仮想ネットワヌク

正盎に蚀うず、新しいクラりドを䜜成するず、自動的に別のネットワヌクず 3 ぀のサブネット (アベむラビリティ ゟヌンごずに XNUMX ぀) が䜜成されるため、この手順をスキップするこずもできたす。 しかし、それでも、独自のアドレス指定を持぀プロゞェクト甚に別のネットワヌクを䜜成したいず考えおいたす。 Yandex.Cloud でネットワヌクがどのように機胜するかを瀺す䞀般的な図を以䞋の図に瀺したす (正盎に匕甚したものです) https://cloud.yandex.ru/docs/vpc/concepts/)

Yandex.Cloud では 10 件のむベントを受け入れたす。 パヌト000

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

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

Terraform を初期化し、ネットワヌクを䜜成したす。

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.

玠晎らしい ネットワヌクを䜜成したので、内郚サヌビスを䜜成する準備が敎いたした。

仮想マシンの䜜成

アプリケヌションをテストするには、XNUMX ぀の仮想マシンを䜜成するだけで枈みたす。最初の仮想マシンはアプリケヌションを構築しお実行するために必芁であり、XNUMX 番目の仮想マシンは受信メッセヌゞを保存するために䜿甚する kafka を実行するために必芁です。 そしお、アプリケヌションを監芖するために prometheus を構成する別のマシンを䜜成したす。

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

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

すべおが正垞に終了した堎合 (正垞に終了するはずです)、次の XNUMX ぀の仮想マシンが䜜成されたす。

  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/ [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

戊いの半分は終わりたした。これで、アプリケヌションを起動しお 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 でレゞストリを䜜成し、そこにむメヌゞをアップロヌドするだけです (XNUMX 行を䜿甚しおこれを行う方法は、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 [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:~$

むメヌゞをレゞストリにアップロヌドするには、コンテナヌ レゞストリ 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. 私たちはそれを収集し、プラむベヌトコンテナヌレゞストリに泚ぎたした。

次のパヌトでは、興味深い内容に進みたす。アプリケヌションを実皌働環境にリリヌスし、最埌にアプリケヌションぞのロヌドを開始したす。 切り替えないでください

この資料は、オヌプン ワヌクショップ REBRAIN ず Yandex.Cloud のビデオ録画に含たれおいたす: Yandex Cloud では 10 秒あたり 000 件のリク゚ストを受け入れたす - https://youtu.be/cZLezUm0ekE

このようなむベントにオンラむンで参加し、リアルタむムで質問するこずに興味がある堎合は、に接続しおください。 REBRAIN による DevOps チャネル.

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

クラりドに移行する必芁がある堎合、たたはむンフラストラクチャに぀いお質問がある堎合は、 お気軜にリク゚ストを残しおください.

PS では月に 2 回の無料監査を行っおおり、おそらくあなたのプロゞェクトもそのうちの XNUMX ぀ずなるでしょう。

出所 habr.com

コメントを远加したす