谷歌云运行容器网络

Posted

技术标签:

【中文标题】谷歌云运行容器网络【英文标题】:Google Cloud Run Container Networking 【发布时间】:2020-01-01 12:46:15 【问题描述】:

我在 docker 容器中有一个应用程序/服务系统,当我使用 docker-compose 启动它们时,使用桥接网络相互通信。

工人启动并向经理注册。经理分配工人工作。为了做到这一点,工人需要知道经理在哪里,经理需要知道工人在哪里。

我想将它们全部部署到 Google Cloud Run。

目前,通过 docker-compose 在 docker 中,它们使用容器名称相互通信。例如,worker 可能会调用:http://manager:5000/register?name=worker1&port=5000 在启动时注册,然后 manager 可以调用 http://worker1:5000 发送工作。这一切都归功于它们连接到同一个桥接网络。

这如何与 Google Cloud Run 配合使用?据我所知,当您创建与容器链接的服务时,您将获得一个永久 URL,以便在应用启动后与它进行通信。容器中的应用不知道 URL 是什么。

我可以使用服务名称以与 docker 桥接网络相同的方式相互通信吗?

【问题讨论】:

【参考方案1】:

Cloud Run 目前不支持您项目中其他服务的基于主机名的服务发现。

目前,您最好的办法是使用环境变量或类似的东西来配置您的应用所依赖的服务 URL。

【讨论】:

这就是我现在正在做的事情。一旦我意识到服务 URL 保持不变,除非您将其完全删除,这样做是最有意义的。 您知道应用程序是否可以检索服务 URL? 您的意思是“它自己的”服务 URL?我认为我们目前不会公开这一点。但是,默认情况下,Cloud Run 应用使用具有Editor 权限的服务帐号进行部署。因此,您可以使用 Cloud Run REST API/clients 列出您在项目中拥有的所有服务并找到它们的所有 URL。【参考方案2】:

事实上,你不能以与工人相同的方式进行编排。实际上,Cloud Run 服务会回复 HTTP 请求。生成实例时,不会向管理器注册。

如果您想并行执行多个任务,请执行多个 HTTP 请求。

如果您想在同一服务的不同实例之间进行强隔离,请将并发参数设置为 1(该服务的实例同时只处理 1 个 HTTP 请求)。

有关信息,您最多可以为同一服务拥有 100 个实例。

因此,部署一个管理器服务和一个工作器服务。管理器服务使用正确的参数向工作人员执行 HTTP 请求,以完成正确的工作。

注意工作时间。目前,超时时间最长可以设置为 900 秒(15 分钟)

关于命名,模式如下:https://<service-name>-<project-hash>.run.app/

【讨论】:

了解命名约定很有用。谢谢! 您知道是否可以从应用内获取应用的服务 URL? 您的意思是从 Cloud Run 服务中发现另一个 Cloud Run 服务 URL 吗? 我的意思是从容器上运行的应用程序中获取容器的主机名。

以上是关于谷歌云运行容器网络的主要内容,如果未能解决你的问题,请参考以下文章

谷歌云防火墙暴露端口 Docker

有没有办法通过docker容器内的代理访问谷歌云SQL

谷歌云日志的日志格式

谷歌云上的getEffectiveOrgPolicy错误运行秘密安装卷

如何以编程方式在谷歌云运行 api 中获取当前项目 ID

谷歌云存储 - 从网络下载文件