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

标签 google-cloud-platform google-cloud-run

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

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

这里有一些想法:

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

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

    最佳答案

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

  • 原生解决方案 : 注册域名,等到 Cloud Run 识别出来,最后一步翻转 DNS。会有 停机时间 因为 Cloud Run 需要从 Let's Encrypt 获取 HTTPS 证书。
  • Cloudflare 代理 (使用 Host header 重写,这是企业计划功能),可能没有停机时间。

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

    选项1

    Keep in mind that DNS records, by their nature, will take several hours to propagate across the globe and to residential/edge locations. You need both OLD and NEW endpoints running at all times for maybe 24 hours.



    首先,确保您在 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/
    

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

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

    当您尝试通过伪造 Host header 并使用 https:// 来查询这些 IP 之一时,您将看到:
    curl -kvH "Host: foo.com" https://216.239.32.21
    
    curl: (35) error:14004410:SSL routines:CONNECT_CR_SRVR_HELLO:sslv3 alert handshake failure
    

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

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

    选项 2

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

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

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

    如果您使用的是 Cloudflare,这将是一种更平稳的过渡,如果出现问题,您可以使用 Cloudflare 页面规则快速恢复。
  • How to eliminate (or minimise) downtime when adding your domain to Cloudflare
  • Migrate HTTPS Enabled non-top TLD Domain to Cloudflare without Downtime


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

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

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

    关于google-cloud-platform - 无需停机即可将实时域切换到 Google Cloud Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59255283/

    相关文章:

    java - 如何导入 LocalServerReceiver()?

    python - 如何检查 BigQuery 查询结果何时返回零记录?

    python - 通过 Python 的 gRPC API 服务器无法工作

    使用 Cloud Run 进行内部 CLI 的 Google Cloud Auth

    python - 如何使用 Apache Beam Python 将输出写入动态路径

    google-app-engine - 如何在 Google Cloud Functions 和 Google App Engine 之间做出选择?

    java - 有没有办法使用 App Engine Java 运行时动态设置任务的目标?

    google-cloud-platform - Google Cloud Run/域映射支持 ALIAS 记录吗?

    google-cloud-platform - intellij "Failed to enable GCP auth addon"中的 GCP Cloud 代码插件

    mysql - 我应该在 google cloud run 上运行 mysql 吗? (或任何数据库)