无需停机即可将实时域切换到 Google Cloud Run

ty.*_*ty. 5 google-cloud-platform google-cloud-run

我在我的自定义云运行域 foo-eu7vrotrfq-uc.a.run.app 上设置了 Google Cloud Run。我有一个域 foo.com,目前正在提供实时流量。我想开始在 Cloud Run 上为 foo.com 提供服务,而不会对大约 100 个并发用户造成干扰。

对于当前的域映射功能,这似乎是不可能的。域映射需要更新 DNS 才能颁发证书。根据文档,这最多需要 15 分钟(在我的测试中大约需要 5 分钟)。在这 15 分钟内,foo.com 将无法正常提供服务。

这里有一些想法:

  • 为 cloudrun.foo.com 设置证书,然后将 foo.com 命名为 cloudrun.foo.com。--> 谷歌返回错误可能是因为无法识别主机名。
  • 如果域映射不检查 DNS 记录而只需要公开 LetsEncrypt 质询,请编写一个服务器,将质询代理到 Cloud Run,并将所有其他流量代理到当前 Web 服务器。--> 这是很多工作,取决于域映射功能的内部实现细节。我实际上使用 Cloudflare Worker 尝试过此操作,但看起来需要更改 DNS。

有没有人想出解决这个问题的方法?似乎无法在不导致停机的情况下为现有域切换到 Cloud Run。

Ahm*_*gle 6

这是一场艰难的演出,但我认为你有几种选择。总之:

  1. 原生解决方案:注册域,等到 Cloud Run 识别它,最后一步翻转 DNS。会有停机时间,因为 Cloud Run 需要从 Let's Encrypt 获取 HTTPS 证书。

  2. Cloudflare 代理(带有Host标头重写,这是企业计划功能),可能没有停机时间。

使这种情况变得非常困难的是 HTTPS。Cloud Run 目前不允许上传您自己的 TLS 证书,因此它可以立即开始提供流量(您可以稍后切换到 Cloud Run 管理的证书)。


选项1

请记住,就其性质而言,DNS 记录需要几个小时才能传播到全球和住宅/边缘位置。您可能需要 OLD 和 NEW 端点始终运行 24 小时。

首先,确保在 Cloud Console 上为 Cloud Run 应用创建域映射

此操作很可能表明您需要通过 Google 网站管理员工具验证域所有权。仅此操作可能需要一些时间。所以现在就去做。

当您能够创建域映射时,它将为您提供一些 DNS 记录来更新您的域,如下所示,但不要更新您域的 DNS 记录:

此时,正在配置 Google Cloud 的负载平衡前端,以将来自您的foo.com域名的流量路由到您的应用:

curl -vH "Host: foo.com" http://216.239.32.21

< HTTP/1.1 302 Found
< Location: https://example.com/
Run Code Online (Sandbox Code Playgroud)

Cloud Run 现在似乎可以识别foo.com存在。它没有因 HTTP 404 失败,而是强制进行 https:// 重定向。

但是,Cloud Run无法从 Let's Encrypt 获取您的域的 TLS 证书,因为 Let's Encrypt 无法访问foo.com验证挑战——DNS 仍指向您的旧服务器。

当您尝试通过伪造 Host 标头并使用 来查询这些 IP 之一时https://,您将看到:

curl -kvH "Host: foo.com" https://216.239.32.21

curl: (35) error:14004410:SSL routines:CONNECT_CR_SRVR_HELLO:sslv3 alert handshake failure
Run Code Online (Sandbox Code Playgroud)

此错误表示 Cloud Run 尚未成功从 Let's Encrypt 检索证书并开始使用它。

此时,您必须将您的域指向 Cloud Run 提供的 IP 地址,并且Cloud Run 从 Let's Encrypt 获取证书之前会有一些停机时间(因为它会不断重试)。但这可能需要一些时间:5、10、20 分钟,很难保证。请记住,DNS 记录被大量缓存,因此这可能需要更长的时间。


选项 2

如果您使用 Cloudflare 作为负载均衡器,则可以使用Page Rules 重写 Host header。这仅在他们的企业计划中可用。有了这个,任何请求都foo.com将被重写并代理到您的 Cloud Run 应用程序,例如foo-eu7vrotrfq-uc.a.run.app.

这不使用 Cloud Run“域映射”功能,因此您的 Cloud Run 设置根本不知道您的foo.com域。

但是,如果您当前未使用 Cloudflare,请遵循这些指南以避免停机,因为与 Cloud Run 类似,Cloudflare 需要为您的域名配置证书。

如果您使用的是 Cloudflare,这将是一种更平稳的过渡,如果出现问题,您可以使用 Cloudflare 页面规则快速恢复。


我认为总的来说你提出了一个很好的问题,感谢你对它的彻底解释。你的分析是正确的。

由于 Cloud Run 强制 https:// 并且 Let's Encrypt 需要访问您的应用程序以为其批准 TLS 证书(同样,Cloudflare 需要时间为您的域配置证书),这并不容易。

我将此反馈反馈给团队进行讨论,也许我们需要一种不同的方式来为域提供 TLS 证书,以防止迁移过程中出现停机。我可能会写一个关于这个的指南。