我们在 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 连接监控和服务发现。

TK

首先,让我们制定职权范围——我们到底想要得到什么结果。

  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 次免费审核,也许您的项目就是其中之一。

来源: habr.com

添加评论