灵活的应用程序架构、CI/CD 管道和容器工作负载通常运行不受信任的代码,因此应该与敏感的基础设施隔离。一种常见的解决方案是部署纵深防御产品(如使用gVisor的GKE Sandbox)以通过额外的保护层隔离工作负载。Google Cloud 的无服务器产品(App Engine、Cloud Run、Cloud Functions)也使用 gVisor 对应用程序工作负载进行沙箱处理。

【本文由Cloud Ace整理发布,谷歌云服务请访问Cloud Ace 官网】

然而,增加防御层也会带来新的性能挑战。当 gVisor 的用户空间内核需要多个操作来遍历文件系统路径时,然后谷歌发现了一个这样的挑战。为了解决这个问题并显着提高 gVisor 的性能,编写了一个全新的文件系统层,同时考虑到性能,同时保持相同级别的安全性。新文件系统 (VFS2) 减少了为文件系统系统调用提供服务所需的操作数,减少了锁争用,更有效地分配内存,并提高了与 Linux 的兼容性。

纵深防御和文件系统

第一层防御是在用户模式下运行的 gVisor 内核。gVisor 威胁模型假设恶意容器可以破坏 gVisor 的内核,同时仍将恶意容器与底层主机基础设施或其他工作负载隔离开来。由于 gVisor 内核不可信任,因此它无法直接访问文件系统。文件系统操作由代理(称为 Gofer)代理,该代理与可能的恶意工作负载隔离。打开、创建和统计等操作被转发到代理,经过审查,然后由代理执行。Gofers 作为一个单独的进程运行,pod 中的每个容器一个,并且还受到深度防御层的保护,仅授予它所需的访问权限。

在 gofer 授予对文件的访问权限后,在 gVisor 内核文件系统返工之前,需要大量操作来遍历文件路径,从而导致一些性能缺陷。这个问题在使用 gofer 挂载文件系统时尤为明显,其中每个操作的往返成本因 RPC 和调度成本而加剧。更值得注意的是,gVisor 沙箱会向 gofer 发出新的 RPC 以遍历每个路径组件,这会大大降低性能。

改进的文件系统性能

应对这一挑战需要使 gVisor 的哨兵能够将路径解析直接委托给文件系统。这允许 gofer 文件系统发出单个 RPC 来执行大型遍历,而不是为操作中的每个路径组件发出一个 RPC。例如,在 VFS1 中,stat(/foo/bar/baz) 向 gofer (foo, bar, baz) 生成至少三个 RPC,而 VFS2 只生成一个。

借此机会,谷歌重新设计了 sandbox-gofer 协议层。而早些时候使用的是 9P2000.L 协议的修改版本。然而,这个协议非常繁琐,发出许多 RPC 并消耗大量内存。谷歌构建了一个名为LISAFS(Linux 沙盒文件系统协议)的新协议来替代 9P。LISAFS 在 RPC 和内存使用方面更经济。LISAFS 为多路径组件行走提供 RPC。VFS2 中的 gofer 文件系统现在可以使用 LISAFS 执行这种一次性遍历。LISAFS 还可以通过 RPC 执行更快的文件 IO。

执行频繁文件系统操作(如打开、创建、统计、列表和加载库)的工作负载正在使用 VFS2 和 LISAFS 提高性能。这些工作负载的示例包括运行解释性语言(例如 Python 和 NodeJS)以及大量导入,或者从源代码构建二进制文件。CI/CD 工作负载(例如 bazel)构建在大型代码库上,并提供对文件系统性能的深入了解。此类工作负载必须打开和读取大量源文件,并写入大量目标文件和二进制文件。

以下是截至 2022 年 12 月构建gRPC和Abseil 的开源 bazel 基准测试的结果。这些基准测试在类似 GKE 的环境中运行。要理解结果,理解以下术语会很有帮助:

·Runsc overhead:这是 gVisor 相较于 native 增加的性能开销。例如,如果本机运行工作负载(使用 runc)需要 10 秒,而 runsc 需要 13 秒,则 runsc 开销为 30%。

·Root:项目的源代码放在根文件系统中,以独占方式挂载。这意味着沙盒可以完全控制文件系统并使用更积极的缓存来提高性能。

·绑定:项目源代码放在绑定挂载中。所有绑定挂载都以共享模式挂载。这意味着可能会发生文件的外部修改,并且 gVisor 会在每次访问时重新验证缓存以确保状态是最新的。

·tmpfs:项目源代码放在tmpfs(内存文件系统)中。

可以看到 VFS2 和 LISAFS 持续改进所有这些配置的性能,并使 runsc 更接近本机 (runc) 性能。

VFS2 和 LISAFS 现已在所有 GKE 和无服务器产品中 100% 推出,并在几个月内逐步推出了这些优化。这些还有助于缩短一些在初始化时执行大量文件系统工作的应用程序的冷启动时间。例如,从 2022 年 8 月开始的 App Engine LISAFS 推出数据显示,LISAFS 平均将冷启动提高了 25% 以上。

为大规模容器工作负载提供纵深安全防御帮助确定性能权衡,例如需要新实施的 gVisor 文件系统。这些改进大大缩小了性能差距,而无需牺牲安全性。VFS2 架构使大家能够在提供企业就绪容器安全解决方案的同时,继续改进安全性和性能权衡。

立即试用 GKE Sandbox 以增强工作负载安全性

GKE Sandbox 为您的工作负载提供了额外的安全层,您今天就可以试用了。阅读启用 GKE 沙盒指南,通过查看GKE 沙盒概述了解有关容器安全的更多信息,或者立即开始使用 Google Cloud免费试用。

如果您想更深入地了解技术细节,您可以查看官方 gVisor 文档,查看GitHub 上的源代码,甚至可能做出贡献。期待看到更多沙盒工作负载在 Google Cloud 上运行!

谷歌是如何改进 GKE、Cloud Run 的 gVisor 文件系统性能的?的更多相关文章

  1. 【Android Developers Training】 89. 最大化的使用谷歌云消息(Google Cloud Messaging)

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 执行 npm run update-webdriver 提示文件不能获取错误

    按照angularjs官网的入门教程中输入 npm run update-webdriver  总是提示 https://chromedriver.storage.googleapis.com/2.1 ...

  3. spring cloud config git库文件搜索顺序

    spring.cloud.config.server.git.uri只配置到仓库那一层就行了,需要访问仓库的子目录的话就配置spring.cloud.config.server.git.searchP ...

  4. RestTemplate OR Spring Cloud Feign 上传文件

    SpringBoot,通过RestTemplate 或者 Spring Cloud Feign,上传文件(支持多文件上传),服务端接口是MultipartFile接收. 将文件的字节流,放入ByteA ...

  5. spring cloud feign 上传文件报not a type supported by this encoder解决方案

    上传文件调用外部服务报错: not a type supported by this encoder 查看SpringFormEncoder类的源码: public class SpringFormE ...

  6. Getting Started(Google Cloud Storage Client Library)

    在运行下面的步骤之前,请确保: 1.你的项目已经激活了Google Cloud Storage和App Engine,包括已经创建了至少一个Cloud Storage bucket. 2.你已经下载了 ...

  7. Spring Cloud中关于Feign的常见问题总结

    一.FeignClient接口,不能使用@GettingMapping 之类的组合注解 代码示例: @FeignClient("microservice-provider-user" ...

  8. 写给大忙人的spring cloud 1.x学习指南

    这几天抽空搞了下spring cloud 1.x(2.0目前应该来说还不成熟),因为之前项目中使用dubbo以及自研的rpc框架,所以总体下来还是比较顺利,加上spring boot,不算笔记整理,三 ...

  9. Cloud Native Weekly | Kubernetes 1.13发布

    云原生一周精选 1——Kubernetes 1.13发布 2——Kubernetes首次出现重大安全漏洞 3——Docker和微软公司推出云原生应用的部署规范 4——谷歌推出beta版本的Cloud ...

  10. 安卓基于谷歌串口api进行串口开发

    准备材料 AndroidStudio 谷歌android-serialport-api 前情提要 网上提供很多基于c语言对安卓串口开发,有jni.cmake等等,不过都太高深,谷歌提供的api已经可以 ...

随机推荐

  1. 六:spring Cloud

    六Spring Cloud 回顾之前的: javaSE 数据库 前端 Servlet HTTP Mybatis Spring SpringMVC SpringBoot Dubbo.Zookeeper. ...

  2. shell:判断某个变量是否包含字符串/变量的方法

    尝试了有3种方法: 1.使用"=~"符号,注意前后必须要有空格! ** 可以输出正确结果,被匹配的字符串必须要有引号括起来!** [clouder@ana53 bin]$ a1=' ...

  3. Switchquery:移动端秒级配置触达平台

    作者:京东零售 胡本奎 一 背景 随着移动互联网的快速发展,为满足各类用户及人群的体验需求,移动端的开发者们开发了丰富多彩的体验与功能.同时对于快速控制各类功能的切换.灰度,降级等能力的要求也越来越高 ...

  4. centos7 安装MariaDB数据库

    1.添加 MariaDB yum源 #添加MariaDB.repo配置文件 vim /etc/yum.repos.d/MariaDB.repo #添加内容 [mariadb] name = Maria ...

  5. mysql常用命令汇总

    1.查询表占用空间语句:SELECT CONCAT(table_schema,'.',table_name) AS 'Table Name', table_rows AS 'Number of Row ...

  6. taro框架开发微信小程序遇到的问题

    ios端,如果input放在了dispplay flex里面,会导致一系列问题 滑动屏幕,键盘不收起,input值随屏幕滚动 input之前切换,键盘不弹起来或有时弹有时不弹 键盘莫名收起 input ...

  7. Prometheus学习笔记之设置存储时间为30天不生效

    0x00 概述 Prometheus升级到2.23进行测试发现,设置存储时间为30天未生效,根据官方说明手册,实际运行后发现数据只能存储几个小时.... --storage.tsdb.retentio ...

  8. ubuntu22.04 git升级

    git --version  //查看版本 sudo add-apt-repository ppa:git-core/ppa   //通过PPA源方式安装软件的添加PPA源到Source list中的 ...

  9. flannel 关闭SNAT

    flannel 关闭SNAT 默认情况下,flannel 访问集群外网络是通过 SNAT 成宿主机 ip 方式,在一些金融客户环境中为了能实现防火墙规则,需要直接针对 POD ip 进行进行规则配置, ...

  10. centos7.8GPU服务器搭建

    首先官方文档有cuda驱动和toolkit和Linux内核本,gcc版本的对应关系,其中也有一些安装过程可参考: https://developer.nvidia.com/cuda-toolkit-a ...