容器在公有云上的落地姿势

news2025/1/14 18:35:33

1.容器天生隔离能力不足

1.1 容器是一种进程隔离技术,并非虚拟化技术

容器(container),并不是一种虚拟化(virtualization)技术,而是一种进程隔离(isolation)技术,从内核空间、资源和安全等方面对进程做隔离。

Linux 容器采用 Linux 控制组(cgroups)和命名空间(namespace),其中,cgroups 定义了一个进程能使用什么(CPU、内存、网络等资源),namespace 定义了一个进程能看到什么(uid,gid,pid,mount,filesystem 等)。一方面,并非所有系统资源都可以通过这些机制来控制(比如时间和Keyring,https://blog.jessfraz.com/post/two-objects-not-namespaced-linux-kernel/)。 另一方面,在 Linux 容器中运行的应用程序与常规(非容器化)应用程序以相同的方式访问系统资源;直接对主机内核进行系统调用。内核以特权模式运行,允许它与必要的硬件交互并将结果返回阴应用程序。因此,即使使用了很多限制,内核仍然面向恶意程序暴露出了过多的攻击面。

除了 cgroups 和 namespace,Linux 容器还会使用到象 seccomp 这样的技术。seccomp是内核防火墙,限制一个进程对内核系统调用(systemcall)的访问限制,能够在应用程序和内核之间提供更好的隔离,但是它们要求用户创建预定义的系统调用白名单。在实际中,很难事先罗列出应用程序所需的所有系统调用。如果你需要调用的系统调用存在漏洞,那么这类过滤器也很难发挥作用。

因此,容器被认为不具备和虚拟机以及沙盒(sanbox)一样的隔离能力。关于容器、虚拟机和沙盒之间的区别,Jessie 的这篇博文(Setting the Record Straight: containers vs. Zones vs. Jails vs. VMs )给出了很好的解释。

1.2 Kubernetes 的多租户隔离

Jessie Frazelle(他的博客地址为 https://blog.jessfraz.com 强烈推荐)将多租户隔离模式分为两大类:

  • 弱隔离(Soft multi-tenancy):同一个组织中的多个用户使用同一个集群。这种隔离模式中,因为用户处于同一个组织中,因此互相之间默认是信任关系,但是也存在可能的情况,比如有恶意的员工。这种隔离模式的主要目的就是为了防止这种恶意事件。

  • 强隔离(Hard multi-tenancy):来自不同组织的多个用户使用同一个集群。这种隔离模式中,默认就假定所有用户都是潜在恶意的,因此这种模式的主要目的是阻止租户之间的互相访问。

从上面的定义可以看出,基本上,私有云的隔离模式是弱隔离模式,而公有云的隔离模式是强隔离模式。

因为容器天生隔离不足,如果只是采用传统 Linux 容器的话,公有云往往采用每个用户单独创建 Kubernetes 集群的方式来实现强隔离:

Jessie Frazelle 的这个图是假设 K8S 能够在不同的宿主机上创建和管理不同的 K8S 集群(那时候 K8S 真的成为集群操作系统了)。实际上,当前这种角色往往由公有云自己的云管平台实现,然后在若干台虚拟机或物理机上为每个用户搭建完整的 Kubernetes 集群,每个集群利用传统的 Linux 容器来运行客户的应用。因为传统 Linux 容器的隔离性不足,每个用户的容器必须允许在独占的环境中。

但是,如果把运行环境从 Linux 传统容器换成微虚机(比如 kata container)的话,因为微虚机本身具有的强隔离能力,则可以在一个宿主机上创建不同用户的这种运行环境,此时这些环境在集群中是混部的。

2.容器在亚马逊云科技上的落地方式(以 Lambda 为例)

亚马逊云科技上多个服务都利用到容器,比如 Lambda 利用了传统 Linux 容器,而 ECS 和 EKS 则利用了 Docker 容器。以 Lambda 为例,我们来看看过去和现在容器在亚马逊云科技上的落地方式。

2.1 过去容器在 Lambda 中的落地方式 - 用户函数运行在独占的 EC2 虚拟机中的 Linux 容器中

下图是 Lambda 的技术架构:

从名字上基本上就可以看出来每个组件是干什么的。其中, 一个 Worker 就是实际运行用户函数的一个安全环境。之前,一个 worker 是一个 EC2 实例,其操作系统为 Amazon Linux。

下图是 Worker 被创建以及函数被调度到 worker 中的基本流程:

其中,Worker manage 负责 worker 的创建和管理,Placement 服务负责将用户的函数调度到某个或某些 worker 上运行。

此时Lambda的强隔离模式的实现方式如下图所示:

这个图还是简单明了的,具体就不解释了。

引用 Amazon Lambda 团队工程师所说的,基于 CPU 的硬件虚拟化技术是亚马逊云科技上用户之间隔离的最低要求。因此,和亚马逊云科技上很多利用容器的服务一样,Lambda 也利用了 EC2 虚机来实现用户之间的强隔离。

但是,其局限也是显而易见的,比如:

  • 资源浪费:用户的一个简单的测试函数也会占用一个虚机)

  • 管理复杂:需要管理复杂的资源和安全模式

  • 启动速度不够快:因为 EC2 虚机的创建时间原因

2.2 现在容器在 Lambda 中的落地方式 - 用户函数运行在 Firecracker 微虚拟机中

亚马逊在2018 年 re:invent 大会上宣布了一个新的开源项目 Firecracker,并已经用在Lambda 和 Fargate 服务之中了。 Firecracker 是一种采用基于 Linux 内核的虚拟机 (KVM) 技术的开源虚拟机监控程序(VMM)。 Firecracker 负责创建和管理微虚机(microVM)。 Firecracker 微虚机提高了效率和利用率,内存开销极低,使得在一台物理服务器上可以创建数千个微虚机。后文下面再介绍。

使用 Firecracker 后的 Lambda 隔离模型:

其好处也是不言自明的,比如:

  • 利用 CPU 硬件虚拟化实现了用户之间的强隔离。

  • 提高物理硬件资源利用率。

  • 缩短函数运行的启动时间。

  • 简化了安全模型。

  • 简化了 Lambda 编程模型。

3. Firecracker 是什么

Firecracker 的中文意思是『鞭炮』。顾名猜意,不知道亚马逊云科技是不是认为在公有云上运行容器就像放鞭炮一样,看起来绚丽多彩,但是弄不好就会引起火灾。

简单地可以将 Firecracker 看做被大大简化了的 QEMU。它和 QEMU 一样,利用 KVM,负责创建和管理虚机。因为这种虚机面向 Serverless 这种场景,适合于运行暂时性( transient and short-lived)进程,因此被称为微虚机,即 microVM。

因为公有云对微虚机的要求是具有象常规虚拟机一样的隔离能力,同时还有象Linux 容器那样的轻量特性(硬件开销小,启动快)。因此,Firecracker 的设计思路是:

  • 内置安全性:提供了支持多租户工作负载并且不会被客户错误禁用的计算安全性屏障。客户工作负载被认为既神圣(不可侵犯)又邪恶(应当拒之门外)。

  • 轻量虚拟化:重视瞬时性或无状态的工作负载,而非长时间运行或持续性的工作负载。Firecracker 的硬件资源开销是明确且又保障的。

  • 功能极简主义:不会构建非亚马逊云科技任务所明确要求的功能。每个功能仅实施一项。

  • 计算超分:Firecracker 向来宾开放的所有硬件计算资源都可以安全地超分。

Firecracker 坚持精简主义的设计原则,它仅包含运行安全、轻量的虚拟机所需的组件。在设计过程的各个环节,都依据安全性、速度和效率要求来优化 Firecracker。例如,仅启动相对较新的 Linux 内核,并且仅启动使用特定配置选项集编译的内核(内核编译配置选项超过 1000 种)。此外,不支持任何类型的图形卡或加速器,不支持硬件透传,不支持(大多数)老旧设备。只支持四种设备虚拟化(virtio-net, virtio-block, serial console, 和只有一个按钮的键盘控制器)。

  • 这么做的结果也是非常明显的,比如:

  • 每个微虚机的内存开销小于 5MiB。

  • 一台物理机上能启动的微虚机数目的限制只是硬件限制,数目可以是数千台。

在亚马逊云科技一次启动4000个微虚机的演示中,最长的微虚机耗时只有219毫秒,最短的只需要125毫秒。

项目的开源地址是 https://firecracker-microvm.github.io/。 更多信息,可查阅更多文章,甚至阅读源码。

4. 展望未来

亚马逊云科技宣布开源 Firecracker 在业界引起了很大的关注。加上之前已有的 Kata container(由Intel,Hyper.sh 和 OpenStack 主导)和 gVisor(由 Google 开源),微虚机越来越引起人们的重视。基于个人理解,对未来做一点不负责任的预测:

  • 公有云利用微虚机来落地容器会成为通用做法。以阿里云的秉性,相信他们很快会跟进,推出和亚马逊云科技类似的技术实现。很可能也会开源一个项目。

  • 亚马逊云科技会将 Firecracker 作为其统一的容器落地模式。

  • 微虚机生态(Kata container、gVisor 和 Firecracker)会发生很多有趣的变化。当前,每个项目都有各自的面向场景。从非技术层面看,因为亚马逊云科技对开源的态度应该是『以我为主』,因此 Firecracker 还是会继续由亚马逊云科技主导,以被亚马逊云科技上的服务使用为主;gVisor 因为来自 Google,Google 也有公有云,加上 Kubernetes 也源自 Google,不知道它是否会演进为事实上的微虚机标准;而 Kata container 也许将来会以面向私有云场景为主(设想一下OpenStack支持 Kata 微虚机,而 K8S 支持支持 gVisor 微虚机,两者之间的 PK 是不是就成了编排能力的 PK?)。

参考链接:

  • https://docs.google.com/document/d/1PjlsBmZw6Jb3XZeVyZ0781m6PV7-nSUvQrwObkvz7jg/edit

  • https://blog.jessfraz.com/post/containers-zones-jails-vms/

  • https://www.youtube.com/watch?v=QdzV04T_kec

  • https://www.slideshare.net/AmazonWebServices/a-serverless-journey-aws-lambda-under-the-hood-srv409r1-aws-reinvent-2018

  • https://aws.amazon.com/blogs/opensource/firecracker-open-source-secure-fast-microvm-serverless/

本篇作者

刘世民

云计算技术专家,曾就职于华为、IBM、海航等公司,专注于云计算。曾在海航集团易航科技担任云服务事业群总经理一职,负责 IDC、云平台、系统运维、信息安全以及用户服务等业务。维护有“世民谈云计算”技术博客和微信公众号。《OpenShift云原生架构原理与实践》作者之一、《Ceph Cookbook中文版》《精通OpenStack》、《机器学习即服务:将Python机器学习创意快速转变为云端Web应用程序》译者之一。

阅读原文:https://dev.amazoncloud.cn/column/article/63be250a23473c0e90b8d8d0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.6、电子邮件

电子邮件(E-mail)是因特网上最早流行的一种应用\color{red}最早流行的一种应用最早流行的一种应用,并且仍然是当今因特网上最重要、最实用的应用之一 传统的电话通信属于实时通信,存在以下两个缺点: 电话通信的主叫和被叫双方必须…

Raki的读paper小记:ConTinTin: Continual Learning from Task Instructions

Abstract&Introduction&Related Work 研究任务 Continual Learning from Task Instructions已有方法和相关工作面临挑战创新思路 InstructionSpeak包含两个策略,充分利用task instruction来改善前向转移和后向转移: 一个是从negative的输出中学…

nodejs图片上传/头像上传

项目结构 utils文件夹无用,没文件 前端代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&…

大屏展示项目开发常用属性

图例legend前言&#xff1a;1.[配置项手册](https://echarts.apache.org/zh/option.html#title)2.[使用手册可以快速入门](https://echarts.apache.org/handbook/zh/get-started/)3.4.一、图例legend1.1 设置图例的位置 &#xff08;上下左右&#xff09;1.1.1 上下&#xff08…

【爪洼岛冒险记】第2站:带你学会:Java中三种输出语句,java中基本数据类型,学会变量,常量,类型转换知识点

&#x1f331;博主简介&#xff1a;是瑶瑶子啦&#xff0c;一名大一计科生&#xff0c;目前在努力学习C进阶、数据结构、算法、JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛&#xff01; &#x1f4dc;所属专栏&#xff1a;爪洼岛冒险记 ✈往期博文回顾&#xff1a;【…

【译】eBPF 和服务网格:还不能丢掉 Sidecar

服务网格以典型的 sidecar 模型为人熟知&#xff0c;将 sidecar 容器与应用容器部署在同一个 Pod 中。虽说 sidecar 并非很新的模型&#xff08;操作系统的 systemd、initd、cron 进程&#xff1b;Java 的多线程&#xff09;&#xff0c;但是以这种与业务逻辑分离的方式来提供服…

主库出问题了,从库怎么办?

在前面的文章中,我和你介绍了 MySQL 主备复制的基础结构,但这些都是一主一备的结构。 大多数的互联网应用场景都是读多写少,因此你负责的业务,在发展过程中很可能先会遇到读性能的问题。而在数据库层解决读性能问题,就要涉及到接下来两篇文章要讨论的架构:一主多从。 今…

Qt之标准对话框(QColorDialog、QInputDialog、QFontDialog)

文章目录QColorDialog使用方式QInputDialog使用方式QFontDialog使用方式提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 QColorDialog QDialog类用于指定颜色的。 使用方式 设置最开始的颜色 setCurrentColor(Qt::red);//其他的颜色Qt::white Qt::…

迪文串口屏(1)-DMG80480C070_03WTC

由于成本缘故&#xff0c;用迪文串口屏去替换项目里的大彩串口屏&#xff0c;样品型号为DMG80480C070_03WTC。不过说句实话&#xff0c;迪文串口屏没有大彩串口屏那么容易上手。产品命名及硬件特性10Pin_1.0mm座子&#xff0c;7.0英寸&#xff0c;800*480分辨率&#xff0c;16.…

机器学习--方差和偏差、Bagging、Boosting、Stacking

目录 一、方差和偏差 数学定义 对公式的解释 减小偏差、方差、噪声 总结 二、Bagging 代码实现 bagging什么时候会变好 不稳定的learner ​总结 三、Boosting Gradient boosting gradient boosting 的代码实现 gradient boosting的效果 ​总结 四、Stacking st…

秒杀项目总结

秒杀就是同一个时刻有大量的请求争抢购买同一个商品&#xff0c;并且完成交易的过程 也就是大量的并发读和并发写 先制作一个增删改查的秒杀系统&#xff0c;但是想让这个系统支持高并发访问就没那么容易了&#xff0c; 如何让这个秒杀系统面对百万级的请求流量不出故障&…

02-final、finally、finalize的区别?

1.final final是java中的修饰符&#xff0c;用于修饰属性&#xff08;变量&#xff09;、方法、类。 1.被final修饰的变量不可以被改变,如果修饰引用,那么表示引用不可变,引用指向的内容可变. 被修饰的常量,在编译阶段会存入常量池中. 2.被final修饰的方法不可以被重写, 被修…

图片播放器的实现1——利用Image2LCD提取图片数据并显示

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;https://xiefor100.blog.csdn.net/article/details/71941527 &#xff08;2&#xff09;https://xiefor100.blog.csdn.net/article/details/78529519 内容总结 …

2022. 12 青少年软件编程(图形化) 等级考试试卷(四级)

2022年12月 青少年软件编程&#xff08;图形化&#xff09; scratch等级考试试卷&#xff08;四级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 28 一、单选题(共 15题&#xff0c;共 30分) 1.运行下列程序&#xff0c; 变量“结果”的值为&#xff1f; &#xff08; &…

WXSS 如何进行编译?

过往中小企业或技术团队开发一个 App 的时间成本和人力成本居高难下&#xff0c;但是随着微信上线小程序&#xff0c;更像是为这部分群体打开了一扇天窗&#xff0c;此后小程序呈现出井喷式发展的状态&#xff0c;不仅微信&#xff0c;支付宝、百度、抖音等超级 App 都跟上步伐…

【C++核心编程】C++全栈体系(十)

C核心编程 第四章 类和对象 六、继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考…

华为DHCPv6实验配置

目录 配置AR1作为DHCPv6服务器为PC1分配IPv6地址 配置AR2作为DHCPv6服务器&#xff0c;AR1作为DHCPv6中继器为PC2分配IPv6地址 配置AR3作为DHCPv6 PD服务器为AR1分配地址前缀 什么是DHCP PD 配置AR1作为DHCPv6服务器为PC1分配IPv6地址 AR1 DHCPv6服务器端配置 ipv6 …

解决N+1问题的另一种方法 - 关联的多结果集ResultSet

如果我的博客对你有帮助&#xff0c;欢迎进行评论✏️✏️、点赞&#x1f44d;&#x1f44d;、收藏⭐️⭐️&#xff0c;满足一下我的虚荣心&#x1f496;&#x1f64f;&#x1f64f;&#x1f64f; 。 从版本 3.2.3 开始&#xff0c;MyBatis 提供了另一种解决 N1 查询问题的方…

C语言——位段

文章目录思维导图&#xff1a;一. 什么是位段二.位段的内存分配三.位段的跨平台问题四.位段的应用结语:思维导图&#xff1a; 一. 什么是位段 位段的声明和结构体类似&#xff0c;但是有2个不同&#xff1a; 位段的成员必须是int、unsigned int 或 signed int(在很多平台上cha…

python自学之《21天学通Python》(9)——基于tkinter的GUI编程

第12章 基于tkinter的GUI编程 Windows的图形用户界面非常方便用户操作&#xff0c;因此&#xff0c;Windows操作系统得到了广大个人计算机用户的欢迎。在Python中&#xff0c;也可以编写美观的GUI界面应用程序与项目。tkinter是Python自带的用于GUI编程的模块&#xff0c;tkin…