【问题标题】:How does Google Cloud Run spin up instantlyGoogle Cloud Run 如何立即启动
【发布时间】:2020-10-19 17:08:26
【问题描述】:

所以,我真的很喜欢无服务器的想法。我遇到了 Google Cloud Functions 和 Google Cloud Run。

所以谷歌云功能是单独的功能,这是一个广阔的视角,我假设谷歌必须安全地运行在一个巨大的nodejs服务器上。它包含所有谷歌消费者的所有功能,并使用唯一的 URL 来满足请求。现在,谷歌负责这台大型服务器的成本,并根据用户的功能获得的每一次点击向用户收费。所以它是付费使用的。而且很有道理。

但说到 Cloud Run。我不明白它是如何工作的。显然,容器不能一直在运行,因为那样它们只会按月收费,而不是按每次点击收费,就像部署 docker 映像的普通 VM 一样。但不,实际上,它们是按每次点击收费的,这意味着它们会在请求到达时启动容器。所以,我不明白它是怎么旋转得这么快的?用户可以灵活地运行任何类型的环境,这意味着 docker 容器实际上可以包含任何内容。也许是一个成熟的 Linux 操作系统。它如何如此快速地加载环境操作系统并满足请求?好吧,也许它会保持机器的状态并在不使用时将其关闭,但即便如此,恢复状态也需要相当长的时间。

那么谷歌是如何做到的呢?它如何能够立即启动客户的容器?

【问题讨论】:

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


    【解决方案1】:

    快速旋转沙箱容器(出于安全原因在自己的内核上运行)的想法已经存在了很长时间。例如,Intel Clear Linux ContainersFirecracker 通过各种优化提供快速启动。

    您可以想象,实现这样的事情需要在许多层进行优化(调度、流量服务、自动缩放、图像缓存...)。

    在不泄露 Google 的秘密的情况下,我们或许可以谈谈图像存储和缓存:就像虚拟机如何使用 initramfs 预先缓存虚拟机的状态,而不是从硬盘读取所有文件并遵循启动顺序,我们可以用容器做类似的技巧。

    Google 为 Cloud Run 使用了类似的解决方案,称为 gVisor。这是一种用户空间虚拟化技术(不是实际的 VMM 或管理程序)。要在类似 Linux 的环境中运行容器,gVisor 不需要从头开始引导 Linux 内核(因为 gVisor 在 go! 中重新实现了 linux 内核)。

    您会在大多数云提供商的其他无服务器平台上发现许多优化(例如,如果您在负载到达之前预测性地调度非活动容器,如何保留容器实例)。我建议阅读Peeking Behind the Curtains of Serverless Platforms 论文,以了解该领域存在哪些问题,以及云提供商试图优化速度和成本。

    【讨论】:

    • 你太棒了!!
    【解决方案2】:

    您必须将容器与虚拟机分离。 Dustin 的第二个链接非常棒,因为如果您了解 Kubernetes 的原理(如果您了解 Knative 则更多),很容易将其转换为 Cloud Run。

    您有一个资源池(Kubernetes 中的节点,实际上是具有 CPU 和内存的虚拟机),您可以在这些资源上运行容器:每个虚拟机 1、2、1000 个,也许,您不知道并且您不在乎。容器的强大之处在于能够将其所需的所有依赖项打包在一起。是的,我谈到了包,因为您的容器不是操作系统,它包含与主机操作系统交互的依赖项。

    为了防止来自不同项目/客户的容器之间出现任何问题,容器运行到沙箱中(GVisor,Dustin 的第一个链接)。

    因此,当您部署 Cloud Run 服务时,无需启动和停止 VM,无需创建 VM,...这只是您的容器在现有资源上的开始。也是因为这个原因,你需要一个无状态的容器,不附加磁盘。

    你想要 3 个“秘密”吗?

    1. 与 Cloud Functions 完全相同!您的代码被打包到一个容器中,并完全按照 Cloud Run 的方式进行部署。
    2. 管理 Cloud Functions 和 Cloud Run 的底层平台是相同的。这就是行为和功能非常相似的原因! Cloud Functions 的部署时间更长,因为 Google 需要为您构建容器。使用 Cloud Run,容器已经构建完毕。
    3. 您的 Compute Engine 实例也作为容器在 Google 基础架构上进行管理!更一般地说,在 Google,一切都是容器!

    【讨论】:

    • 这解释了很多。当你说“我谈到包是因为你的容器不是操作系统,它包含与主机操作系统交互的依赖项。”,我有点理解,就像我几乎可以感觉到它但我无法理解它,你有什么我可以读到的东西吗?再次感谢您的翔实回答。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2020-05-20
    • 2020-08-03
    • 2022-01-27
    • 1970-01-01
    • 2020-02-23
    • 2015-10-29
    • 2016-09-19
    相关资源
    最近更新 更多