我想知道gVisor和Weave Ignite在用例方面是否有区别(如果有的话)。对我来说,他们似乎都在尝试类似的事情:让虚拟化环境中的代码执行更加安全。
gVisor 是通过引入runsc一个运行时来实现沙盒容器的,而 Ignite 是通过使用Firecracker 来实现的,在他们的上下文中,它似乎也被用作沙盒。
背景
该服务是一个简单的 Go 程序,它将文件从 Cloud Storage 传送到浏览器。
在我的 Macbook 上一切正常,但对于某些请求在 Cloud-Run(托管)上失败。主要是大型 mp4 文件。
问题
日志只显示一个500状态,浏览器也是如此。但是我的服务除了开始复制文件之外没有记录任何内容。没有 IO 错误或任何东西。
此消息在500状态前 4 秒显示:
Container Sandbox Limitation: Unsupported syscall membarrier(0x10,0x0,0x0,0x8,0x775dce0b030,0x775dce0b000). Please, refer to https://gvisor.dev/c/linux/amd64/membarrier for more information.
我无法在本地重现此内容。使用相同的配置和 GCP 存储桶在本地正常工作。
该服务在带有较小文件(如图像)的 Cloud-Run 上运行良好。只是不是我试过的视频。
我试过了
io.Copy. 没有错误,io.Copy调用后挂起。更新 2019-08-16
我创建了一个非常简单的服务,将“A”打印到 http responsewriter。它也可以在本地完美运行,但在云运行中以较大的尺寸返回 500。1MB OK,5MB OK,50MB 失败,100MB 失败等等。这个服务运行时没有 membarrier 消息。
代码可在此处获得:https : //github.com/andrioid/reproduce-cloud-run-bug
也报告了问题跟踪器:https : //issuetracker.google.com/issues/139511257 …
假设我会让用户上传一些 python 或 bash 脚本,在云运行中执行它并返回结果。为此,我将使用无权访问项目资源的服务帐户创建 Cloud Run 服务。我也想在嵌套容器中运行脚本,这样用户就不能干扰服务器代码并操纵来自其他用户的连续请求。
我如何让 gvisor runc 或其他一些沙箱运行时在 Cloud Run 上运行的容器内可用?
我发现一些资源提到在原始容器上使用特权标志,但这在 Cloud Run 中是不可能的。此外,我找不到有关如何使用 runc 运行无根容器的任何信息。让我知道我是否在正确的轨道上,或者这是否可以通过云运行实现,或者我应该使用其他服务吗?
谢谢你。
sandbox docker google-cloud-platform google-cloud-run gvisor