问题标签 [gvisor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kubernetes - Kata Containers 与 gVisor?
据我了解, Kata Containers
Kata Container 构建轻量级虚拟机 (VM) 的标准实现,其感觉和执行类似于容器,但提供 VM 的工作负载隔离和安全优势
另一方面,gvisor
gVisor 是容器的用户空间内核。它限制了应用程序可访问的主机内核表面,同时仍允许应用程序访问它期望的所有功能。
我相信,这两种技术都试图将linux 空间添加到容器中以增强安全性。
我的问题是它们有何不同?功能有重叠吗?
sandbox - Ignite 和 gVisor 在用例方面有什么区别?
我想知道gVisor和Weave Ignite在用例方面是否有区别(如果有的话)。对我来说,他们俩似乎都在尝试类似的事情:让虚拟化环境中的代码执行更加安全。
gVisor 是通过引入runsc
一个启用沙盒容器的运行时来做到这一点的,而 Ignite 正在通过使用Firecracker来做到这一点,在他们的上下文中,它似乎也被用作沙箱。
node.js - 节点应用程序上的 Google Cloud Run gVisor 系统调用错误
我的项目在云运行中成功运行,我最近添加了https://www.npmjs.com/package/express-static-gzip包来提供我的预压缩资产,我注意到在部署到云后运行预压缩资产浏览器无法识别(它在本地主机上完美运行)
我还注意到堆栈驱动程序日志中的错误。
容器沙盒限制:不支持的系统调用 statx(0xffffff9c,0x3e2292ff7208,0x0,0xfff,0x3e2292ff6df0,0x3e2292ff6f10)。请参阅https://gvisor.dev/c/linux/amd64/statx了解更多信息。
还注意到从谷歌云运行提供的资产没有接受编码头(当查看 express-static-gzip 包的源代码时,它使用 nodejs 文件读取调用,我认为文件读取调用可能会导致 gVisor 中的错误)
更新:
即使在删除 express-static-gzip 包之后也会出现此“容器沙盒限制:不支持的系统调用”错误。
有谁知道这个错误?
go - Cloud-Run 进程失败并出现 500 状态代码和一个 membarrier gvisor 错误
背景
该服务是一个简单的 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
没有错误,调用后挂起。 - 增加容器的内存。它现在运行1G。与512M没有变化。
- 在本地的 Docker 容器中运行,具有相同的配置、相同的凭据。没问题。
- 在 Twitter 上联系 GCP
2019-08-16 更新
我创建了一个非常简单的服务,可以将“A”打印到 http responsewriter。它在本地也能完美运行,但在云运行中返回 500 并具有较大的尺寸。1MB OK、5MB OK、50 MB 失败、100MB 失败等。此服务运行时没有成员消息。
代码可在此处获得:https ://github.com/andrioid/reproduce-cloud-run-bug
也报告了问题跟踪器:https ://issuetracker.google.com/issues/139511257
更新 2:可能的原因
似乎对 32MB 的响应大小有硬性限制。
https://cloud.google.com/run/quotas
非常令人失望的是,这不能增加,错误没有提到这个限制,日志文件也没有。
undertow - 如何在 Cloud Run 中阻止 Undertow 触发来自 gVisor 的警告
最近我的 Undertow 应用程序正在触发 Cloud Run 报告以下内容:
我已经完成了 strace,似乎 Undertow 正在发送启用带外内联 (SO_OOBINLINE) 的套接字选项。我已经明确告诉它不要在配置中这样做(两种方式),但它仍在发生。将 Undertow 与 Cloud Run 一起使用似乎是一个合理的用例,但如果没有更深入地了解 Undertow 的带外内联是什么以及 gVisor 不支持这一点的原因,我就无法确定哪个程序不合理。是 Undertow 做了其他网络服务器没有做的事情,还是 gVisor 太不成熟而无法处理这个特定的套接字功能?也许gVisor将来会支持它,我只需要等待吗?
docker - gVisor 如何保护主机免受脏牛 PoC 的侵害?
我试图弄清楚 gVisor 如何防止脏牛漏洞 PoC。
所以我在 gVisor 中阅读了哨兵中的代码,并且哨兵中的 madvise() 似乎已锁定,因此哨兵可以避免竞争条件。
在 pkg/sentry/mm/syscalls.go
但我预计 gVisor 避免脏牛漏洞存在结构性原因。
所以我看了几个gVisor的视频和文档,但他们只是证明了gVisor可以防止在只读文件上写入的情况。
可悲的是,我找不到其他原因来说明他们如何保护只读文件免受这些视频中的漏洞利用代码的影响。
如果哨兵在同一点也有竞争条件,这是否意味着会像正常的码头工人一样发生同样的问题?
如果是这样,Sentry 将尝试以 root 身份写入文件,我认为也会出现同样的问题。
还是我错过了更根本的原因?
sqlite - Cloud Run:为什么我的实例需要这么多 RAM?
我有一个在 400MB SQLite 文件上运行 SQL 查询的 Golang 进程。
我正在使用带有连接字符串的https://github.com/mattn/go-sqlite3 :
在我的 Docker 开发机器上运行时,它只需要 20MB 的 RAM,但在 Google Run 上,任何小于 512MB 的实例都将返回 HTTP 代码 500,并memory exceeded
在日志中有限制。
docker diff x
显示未修改 DB 文件(我认为这会导致 gVisor 将整个二进制 SQLite db 文件复制到 RAM 以对其进行修改)。
docker 镜像是如何构建的
我正在使用源代码将 SQLite DB 文件复制到图像中:
我的 Golang 文件中有一个全局变量:var db *sqlx.DB
这在主 fn 中设置,之前ListenAndServe
:
我在 HTTP 请求中查询数据库:
为什么这一定是 Cloud Run 环境的问题
docker stats
在本地运行时永远不会超过 20MB。
限制docker run
为 20MB RAM 在我的开发机器上也可以正常运行:
Cloud Run“容器内存分配”指标也远低于 128M:
https://console.cloud.google.com/monitoring/metrics-explorer
谢谢。
docker - 您可以在 Cloud Run 容器中运行沙盒容器吗?
假设我要让用户上传一些 python 或 bash 脚本,在云运行中执行它并返回结果。为此,我将使用无权访问项目资源的服务帐户创建一个 Cloud Run 服务。我也会在嵌套容器中运行脚本,这样用户就不会干扰服务器代码并操纵来自其他用户的连续请求。
如何在 Cloud Run 上运行的容器中使 gvisor runsc 或其他一些沙盒运行时可用?
我发现一些资源提到在原始容器上使用特权标志,但使用 Cloud Run 是不可能的。此外,我找不到有关如何使用 runsc 运行无根容器的任何信息。让我知道我是否走在正确的轨道上,或者这是否可以通过云运行实现,或者我应该使用其他服务吗?
谢谢你。
c - 在 Linux 中,进程如何调用 mmap() 并为其子进程添加 VMA?
在gvisor的文档中,解释了“哨兵通过调用mmap系统调用将虚拟地址到主机文件的有效映射存储在主机VMA中”,以便容器化的应用程序进程拥有它需要翻译和访问的信息它请求的虚拟地址。
这里的哨兵指的是管理程序进程,它正在跟踪它产生的容器化子应用程序进程。
我的问题是,哨兵究竟是如何要求mmap()
申请流程的?如果它是从自己的进程调用,这不是修改自己的VMA表而不是应用程序进程的VMA表吗?
gvisor - tcp 使用 gvisor 监听任何 ip 任何端口
如何使用 tcpip 堆栈gvisor
来实现tun2socks
?
gvisor.dev/gvisor/pkg/tcpip/stack ( https://github.com/google/netstack )