我們在 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 中設定視覺化。
第五部分讓我們將整個基礎設施調整為適當的形狀 - 使用 gitlab ci 設定 ci/cd,使用 prometheus 和 consul 連接監控和服務發現。

傳統知識

首先,讓我們制定職權範圍──我們到底想要得到什麼結果。

  1. 我們希望有一個像 events.kis.im 這樣的端點(kis.im 是我們將在所有文章中使用的測試域),它應該使用 HTTPS 接收事件。
  2. 事件是一個簡單的 json,例如:{“event”: “view”, “os”: “linux”, “browser”: “chrome”}。 在最後階段我們會添加更多的字段,但這不會起到很大的作用。 如果您願意,可以切換到 protobuf。
  3. 該服務必須能夠每秒處理 10 個事件。
  4. 只需向我們的解決方案添加新實例,就可以水平擴展。 如果我們可以將前端部分移到不同的地理位置以減少客戶端請求的延遲,那就太好了。
  5. 容錯性。 該解決方案必須足夠穩定,並且能夠承受任何部件掉落的影響(當然,最多一定數量)。

架構

一般來說,對於此類任務,早已發明了允許高效擴展的經典架構。 該圖顯示了我們解決方案的範例。

我們在 Yandex.Cloud 接受 10 個事件。 第000部分

那我們有什麼:

1. 左邊是我們產生各種事件的設備,無論是玩家在智慧型手機上完成玩具關卡,還是透過常規瀏覽器在線上商店中建立訂單。 如規範中所指定的,事件是發送到我們的端點 - events.kis.im 的簡單 json。

2. 前兩台伺服器是簡單的平衡器,它們的主要任務是:

  • 隨時可用。 為此,您可以使用 keepalived 等工具,它會在出現問題時在節點之間切換虛擬 IP。
  • 終止 TLS。 是的,我們將終止它們的 TLS。 首先,我們的解決方案符合技術規範,其次,為了減輕我們後端伺服器建立加密連線的負擔。
  • 平衡傳入請求到可用後端伺服器。 這裡的關鍵字是可訪問的。 基於此,我們認識到負載平衡器必須能夠透過應用程式監控我們的伺服器並停止平衡到故障節點的流量。

3. 在平衡器之後,我們有應用程式伺服器運行一個相當簡單的應用程式。 它應該能夠透過 HTTP 接受傳入請求,驗證傳送的 json 並將資料放入緩衝區。

4. 該圖顯示 kafka 作為緩衝區,當然,其他類似的服務也可以在此層級使用。 我們將在第三篇文章中比較 Kafka、rabbitmq 和 yqs。

5.我們架構的倒數第二點是Clickhouse-一個列式資料庫,讓您可以儲存和處理大量資料。 在這個級別,我們需要將資料從緩衝區傳輸到儲存系統本身(更多內容請參見第 4 篇文章)。

這種設計允許我們獨立地水平縮放每一層。 後端伺服器無法應對 - 讓我們再添加一件事 - 畢竟它們是無狀態應用程序,因此,這甚至可以自動完成。 Kafka 式的緩衝區不起作用——讓我們添加更多伺服器並將主題的一些分區傳輸給它們。 Clickhouse 無法處理它 - 這是不可能的:) 事實上,我們還將連接伺服器並對資料進行分片。

順便說一句,如果您想在不同的地理位置實現我們技術規格和規模的可選部分,那麼沒有什麼比這更簡單的了:

我們在 Yandex.Cloud 接受 10 個事件。 第000部分

在每個地理位置中,我們都部署一個具有應用程式和 kafka 的負載平衡器。 一般來說,2個應用程式伺服器、3個kafka節點和一個雲端平衡器(例如cloudflare)就足夠了,它將檢查應用程式節點的可用性,並根據客戶端的來源IP位址透過地理位置來平衡請求。 這樣,美國客戶端發送的資料就會落在美國伺服器上。 來自非洲的數據是非洲的。

然後一切都非常簡單 - 我們使用 Kafka 集中的鏡像工具,將所有位置的所有資料複製到我們位於俄羅斯的中央資料中心。 在內部,我們解析資料並將其記錄在Clickhouse中以供後續視覺化。

所以,我們已經整理好了架構 - 讓我們開始震撼 Yandex.Cloud!

編寫應用程序

在使用雲端之前,您仍然需要有一點耐心,並編寫一個相當簡單的服務來處理傳入的事件。 我們將使用 golang,因為它已經證明自己是一種非常適合編寫網頁應用程式的語言。

花了一個小時(也許幾個小時)後,我們得到這樣的結果: https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/main.go.

這裡我想強調的要點有哪些:

1. 啟動應用程式時,您可以指定兩個標誌。 其中一個負責我們將偵聽傳入 http 請求的連接埠 (-addr)。 第二個是我們將記錄事件的 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客戶端,它收集各種指標,例如:

  • 對我們應用程式的請求數量;
  • 執行請求時的錯誤數量(無法讀取 post 請求、損壞的 json、無法寫入 Kafka);
  • 客戶端一個請求的處理時間,包括向Kafka寫入一則訊息的時間。

4. 我們的應用程式處理的三個端點:

  • /status - 只需返回 ok 即可表示我們還活著。 雖然您可以新增一些檢查,例如 Kafka 叢集的可用性。
  • /metrics - 根據此 url,prometheus 用戶端將返回其收集的指標。
  • /post 是發送帶有 json 的 POST 請求的主要端點。 我們的應用程式檢查 json 的有效性,如果一切正常,它將資料寫入 Kafka 叢集。

我會保留代碼並不完美 - 它可以(而且應該!)完成。 例如,您可以停止使用內建的 net/http 並切換到更快的 fasthttp。 或者,您可以透過將 json 有效性檢查移至稍後階段(資料從緩衝區傳輸到 clickhouse 叢集時)來獲得處理時間和 CPU 資源。

除了問題的開發方面之外,我們還立即考慮了未來的基礎設施,並決定透過 docker 部署我們的應用程式。 用於建置應用程式的最終 Dockerfile 是 https://github.com/RebrainMe/yandex-cloud-events/blob/master/app/Dockerfile。 總的來說,它非常簡單,我唯一要注意的一點是多層組裝,它允許我們減少容器的最終圖像。

雲端中的第一步

首先,註冊 雲.yandex.ru。 填寫完所有必填欄位後,我們將建立帳戶並獲得一定金額的資助,可用於測試雲端服務。 如果您想重複我們文章中的所有步驟,這筆補助金應該足夠您了。

註冊後,將為您建立一個單獨的雲端和一個預設目錄,您可以在其中開始建立雲端資源。 一般來說,在Yandex.Cloud中,資源的關係如下所示:

我們在 Yandex.Cloud 接受 10 個事件。 第000部分

您可以為一個帳戶建立多個雲端。 而在雲端內部,為不同的公司專案製作不同的目錄。 您可以在文件中閱讀更多相關資訊 - https://cloud.yandex.ru/docs/resource-manager/concepts/resources-hierarchy。 順便說一下,我會在下文中經常提到它。 當我從頭開始建立整個基礎設施時,文件不只一次地幫助了我,所以我建議你學習它。

要管理雲,您可以使用 Web 介面和控制台實用程式 - yc。 使用一個指令即可執行安裝(適用於 Linux 和 Mac OS):

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

如果您的內部安全專家對從 Internet 運行腳本感到憤怒,那麼,首先,您可以打開腳本並閱讀它,其次,我們會在我們的用戶下運行它 - 無需 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 檔案中。 首先,在 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和dns.tf檔案中cloudflare提供者的初始化,該檔案負責建立必要的dns記錄。

在我們的工作中,我們將結合所有三種方法 - Web 介面、控制台實用程式和 terraform。

虛擬網路

老實說,您可以跳過此步驟,因為當您建立新雲端時,您將自動建立單獨的網路和 3 個子網路 - 每個可用區域一個。 但我們仍然希望為我們的專案創建一個具有自己的尋址的單獨網路。 Yandex.Cloud 中網路運作原理的一般圖如下圖所示(老實說取自 https://cloud.yandex.ru/docs/vpc/concepts/)

我們在 Yandex.Cloud 接受 10 個事件。 第000部分

因此,您創建了一個公共網絡,資源可以在其中相互通訊。 對於每個可用區域,都會使用自己的位址建立子網,並將其連接到通用網路。 因此,其中的所有雲端資源都可以通信,即使它們位於不同的可用區。 連接到不同雲端網路的資源只能透過外部位址才能看到對方。 順便說一句,這個魔法在裡面是如何運作的, 哈布雷有很好的描述.

儲存庫中的 network.tf 檔案描述了網路建立。 在那裡,我們建立一個公共專用網路內部,並將不同可用區中的三個子網路連接到該網路- 內部-a (172.16.1.0/24)、內部-b (172.16.2.0/24)、內部- c (172.16.3.0/24) )。

初始化 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.

偉大的! 我們已經創建了我們的網絡,現在準備好創建我們的內部服務。

建立虛擬機

為了測試應用程序,我們只需要創建兩個虛擬機 - 我們需要第一個虛擬機來建立和運行應用程序,第二個虛擬機來運行 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 ...

如果一切順利結束(應該如此),那麼我們將擁有三個虛擬機器:

  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 中建立一個註冊表並在那裡上傳我們的映像(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

配置docker。

結論

我們做了很多艱苦的工作,結果是:

  1. 我們提出了未來服務的架構。
  2. 我們用 golang 寫了一個應用程式來實作我們的業務邏輯。
  3. 我們收集了它並將其倒入私有容器註冊表中。

在下一部分中,我們將繼續討論有趣的內容 - 我們將把應用程式發佈到生產環境中,並最終啟動其負載。 不要切換!

此資料位於 REBRAIN 和 Yandex.Cloud 開放研討會的錄影中:我們在 Yandex Cloud 上每秒接受 10 個請求 - https://youtu.be/cZLezUm0ekE

如果您有興趣在線參加此類活動並即時提問,請連接到 REBRAIN 頻道的 DevOps.

我們要特別感謝 Yandex.Cloud 為我們舉辦這樣的活動的機會。 連結到他們 - https://cloud.yandex.ru/prices

如果您需要遷移到雲端或對您的基礎架構有疑問, 請隨時提交請求.

PS 我們每月有 2 次免費審核,也許您的項目就是其中之一。

來源: www.habr.com

添加評論