互联网技术发展速度之快是所有从业者甚至非从业者都能感受到的. 尤记得在世纪之交时, 那时候互联网刚刚在中国开始向民用普及, 不说支撑大规模的网站访问量的相关技术, 就连 Linux, 负载均衡甚至都没有被普遍使用. 而在二十年之后, 云计算已经大行其道, 当今的技术人员已经言必称虚拟化, 容器和 Serverless, 就连刚刚准备入行互联网运维行业的新人们都已经从最初觉得考个 Linux 认证就够了到开始问询 Kubernetes 培训哪家强了.
从一届届 LC3,DockerCon 到 KubeCon, 蓬勃发展的云计算与容器化似乎已经称霸了互联网领域. 这次我带队参加了 6 月 24 ~ 26 日的 KubeCon 大会, 对此感受尤为深刻. 事实上, 这次在上海举办的 KubeCon 2019 距离上次在同一地点举办的同一会议才仅仅过去半年, 但是我们依旧在这次大会上看到了层出不穷的大量新技术, 新动态.
云与容器的结合, 引爆了这一切.
作为容器领域的资深专家, 让我们来看看王旭是如何看待容器和云原生领域当前的发展态势的, 以及作为这个领域的一家初创技术企业的创始人, 他是如何投身到这个领域的, 开源又在其间起到了什么作用.
创立于 2015 年的 runV 项目已于 2017 年和另外一个来自英特尔的 Clear 容器项目合并为 Kata 容器项目, 并由 OpenStack 基金会 (OSF) 进行管理, 它与来自谷歌的 gVisor 项目并称为目前两大安全容器技术.
开源与初创
要么就去加强容器, 要不就是引入别的安全技术来让它像容器一样.
临近 2015 年, Docker 逐渐被业界主流所接受, 互联网技术已经有一个比较明显的发展趋势: 第一是云, 第二是容器. 而云加上容器一定会产生隔离性的需求, 这应该说是王旭和他的联合创始人赵鹏做安全容器最早的一个思路: 要么就去加强容器, 要不就是引入别的安全技术来让它像容器一样. 这就是 runV 这个项目想法的起源.
runV 发布的同一个星期, 英特尔 Clear 容器也发布了. 2016 年 8 月份, 在西雅图的 LinuxCon 上, 王旭和 Clear 团队见面交流, 双方在一些细节上面展开合作. 在 2017 年 9 月份一个会议上, 英特尔软件副总裁, 开源技术中心总经理 Imad Sousou 提出项目合并, 然后放到基金会里管理. 当时大家都觉得这是很好的一个思路.
对于 runV 和 Clear 来说, 避免了重复开发以及花费精力在如何说明两者的不同上, 同时合并之后可以共同推动发展一个社区, 一起去寻找更多的用户. 同时, 两者合并还有更多的意义.
Kata 容器的意义
Kata 容器最大的意义在于推动了社区的发展.
王旭认为, Kata 容器最大的意义在于推动了社区的发展. 在 2018 年之前刚开始做 Kata 容器的时候, 王旭他们需要很多的附加进程来模拟 runC 容器的行为, 因为 runC 是事实标准, 你需要兼容它. 但是当 Kata 和谷歌的 gVisor 都出来之后, 上游社区就注意到这一点, 开始重视, 于是推出新的接口, 可以语义明确地直接去对话, 而不需要再去模拟 runC 的底层行为, 把原来的 2N+2 个辅助进程变成了一个进程. 另外, 既然有了不同的容器运行时, 是不是可以在不同的场景下让它们转到不同容器运行时环境上去? 于是就有了 "运行时类 runtime class" 这样的结构. Kubernetes 社区做了很多这样改进, 它们也在逐步变成事实标准. 这样, 一个小项目的引入推动了包括从用户到上下游的整个社区相关软件的变动.
安全容器也让更多的业务使用容器变得可能.
同时, 安全容器也让更多的业务使用容器变得可能. 王旭在蚂蚁金服做面向金融的一些服务往云原生方向发展, 需要非常严格的安全标准, 这正好和 Kata 这些安全容器项目结合在一起.
增强安全性不可避免的会带来一些会性能或易用性的取舍. 王旭他们的做法是, 在 Kata 里面增加了一个隔离层, 减少用户需要考虑的事情. 举个 Docker 的例子, Docker 镜像的开发者和管理员往往不是同一个人, 对于管理员来说给出的权限越少越安全, 但是对于开发者来说的话, 尤其开发和调试的过程中, 权限的变少会让开发和调试变得非常困难. 对于开发者来说, 不能完全理解管理员要做的事情, 所以你就会见到很多的 Docker 镜像都是要所有权限的, 因为它自己也不知道需要什么权限; 此外还有一些动态的情况, 很难先验地用程序去完全断定它需要的权限, 开发者并不太不确定到底使用了哪些能力. 在这个情况下我们做的事情就是把能力整体限制到沙盒里面. 在沙盒里面是完整的能力, 但是实际上沙盒本身访问不到外层的系统能力, 这样对应用是无感知的, 操作系统就变得更安全了. 确实, 对于系统来说安全性和便利性是一对矛盾, 你很难在同一个层面上把这个问题完全解决掉.
现在有了 "运行时类", 可以指定是否需要使用安全容器. Kubernetes 社区给大家提供 了一个机制, 用户可以选用或者不用安全容器, 它可以是全局的配置, 也可以是 pod 级别的配置. 对安全性不太关键的, 比如说访问一些不太敏感信息的, 可以在安全性上折中一点, 可以让性能更好一些.
容器的发展
从早期的 Cgroup 开始, 到 LXD/LXC 这样的容器技术的出现, 再到 Docker 的的诞生, 一下子点燃了整个容器技术生态, 紧接着在容器编排系统出现后, 并发展到现今 Kubernetes 成为了事实标准. 容器领域一直在快速发展. 王旭的看法又是怎样的呢?
容器领域正在逐渐往上层发展.
他认为, 容器领域正在逐渐往上层发展. 互联网技术本身一开始是在架构层面, 在底层发展, 但是从 Docker 开始兴起时, 给大家的感受就是减少了对底层环境的考虑, 用完整的环境把应用包装起来变成容器, 让它可以随地随地运行. 不需要操心运行在什么样的操作系统里, 把操作系统这一层干掉, 或者说把它变成很窄的一层.
以发行版为例. Linux 服务器发行版的核心工作有两件: 一是怎么把这个系统安装上; 另一个是怎么去尽量平滑管理和升级软件系统. 所有的事情其实都是在围绕这两件事情. 最初出现了 RPM,APT 这些包管理系统, 后来是通过 Chef,Puppet,Ansible 这类配置管理系统自动化的大规模部署, 再到现在的 Docker,Kubernetes, 一它们都是在做软件管理的事情. 原来是操作系统在做这件事情, 现在是 Kubernetes 在充当操作系统的位置; 对云服务来说的话, 这就是无服务器模式. 2014 年 AWS 在拉斯维加斯的 re:Invent 大会发布 Lambda 的时候, 得到业界非常大的关注. 从 Lambda 开始, 每个云厂商都逐渐有了自己的无服务器服务. 所以他觉得未来的发展方向, 应该是向这个方向的.
除此之外, 像现在中间件, 服务网格也都是这样一个目的, 尽量的把应用要做的事情剥离出来, 和应用无关的事情全都抽象出来放到底层.
对应用开发者和使用者来说, 可以不用关心底层是什么架构, 怎么伸缩的, 只需要知道到我需要什么服务, 只要定义应用, 定义 Kubernetes 配置, 由它统一管理, 自动伸缩和调度就好. 基础设施这一层会越来越向一些少数的云厂商集中, 而大家更多的精力是帮助开发者做事情, 集中精力在那些业务, 智能等逻辑部分.
金融与云原生
加入蚂蚁金服之后, 王旭致力于将安全容器技术落地到金融级云原生的场景下. 由于金融领域的特殊性, 云原生实践也需要有相应的变化.
要保证安全性, 不仅仅满足应用的, 也要满足监管的端到端的安全性要求.
王旭举例说, 金融行业不仅仅本身对安全有要求, 监管对安全也有要求. 所以必须要保证安全性, 不仅仅满足应用的, 也要满足监管的端到端的安全性要求. 另一方面, 他们认为安全性包括两方面, 一个是应用不能破坏沙盒, 泄露到外面, 同时应用的底层供应商不是自己时, 也可以安全的使用. 这就是一个双向的安全问题.
一般而言, 作为一个云服务商, 会假设所有的用户都是坏人, 因为所有的用户都可能去窥探基础设施, 它们都可能攻击其他用户, 攻击宿主机, 所以要做隔离.
而金融级的要求是不光是要做这一层的隔离, 而是要做更强的隔离. 首先是对应用不能盲目信任, 即便是内部应用也不能放任, 因为内部的也有可能存在局部的破坏, 也有可能会有不安全的代码或者没有被完全验证的测试代码, 还有可能会有第三方的代码. 反过来, 应用既然是金融级的应用, 它对环境也有安全要求, 所以这是整体的要求.
技术创业与开源
开源对软件公司来说, 是一件向死而生的事情.
在早期以开源技术为核心做创业公司时, 王旭认为开源是市场推广的一个很好途径. 因为软件是有人买才能赚钱, 有人用才有人买, 所以你如果不开源, 就要一家一家地找人去试用, 但是你开源了之后大家就可以免费尝试. 不过, 开源并不是没有缺点, 开源对软件公司来说, 是一件向死而生的事情. 你把最核心的技术开源了, 赌的是别人跟不上你的发展速度; 或者说别人相信你才有能力把它做到更好, 别人才会用你; 或者说你给别人看到的当前版本, 让他相信下一个版本他也做不到你这么好, 所以才愿意跟着你来走, 以至于当他维护不了的时候才会愿意来给你掏钱. 这应该说是一个在市场背景下的选择.
反过来说, 如果说你现在做了一个基础设施领域的软件特别好用, 但是你不开源, 这个时候就一定会有人做一个一样的开源替代品. 那你就看能不能比它做得好, 你能不能拿更多的支持, 拿到更多资源. 这是很困难的.
所以在这个情况下, 你不得不去做这种这种极致的推广手段, 就是这种不买先送的这种开源式的市场推广手段. 目前来看, 纯软件实现的, 跟硬件没关系这种项目基本上都是采用了开源或者半开源的方式, 就是说至少给你一个开源的演示版或基础版. 这种方式, 从商业上说是迫不得已的一种推广方式. 如果你不做, 你的用户们用不到的话, 他们会去寻找替代品, 也一定会有开源替代品出现.
技术创业还会面临一个挑战, 就是当你做出来产品以后, 很快会有更大的对手入场, 对于初创公司来说, 面临的压力是颇大的. 王旭面临的情况稍微有些不同.
幸运的是, 推出和 runV 类似项目的公司是英特尔, 在这件事情上并没有很强的盈利导向, 这也是双方最终能够合作的前提. 王旭认为尽量避免无用的竞争, 而是一起来教育和开拓市场, 是更有建设性的做法.
做初创公司, 做有价值的东西是最重要的.
经历了开源技术为核心的技术创业之后, 王旭对如何做技术创业也有一些自己的看法. 他认为, 对于初创公司来说, 很大程度上来说都在赌别人没有做过的事情, 因为你重复别人做的事情, 还要比别人做的好, 是一件很困难的事情. 对于项目来说, 取决于你想的是什么东西, 你的项目想得越多, 想出来和别人有什么不同, 别人怎么需要你的项目, 其实它就越有价值.
做初创公司, 做有价值的东西是最重要的, 而不是说做一个很好看的架构, 最重要的还是要有价值, 大家才会用. 此外, 还要考虑相关的项目, 就是你要和谁一起配合工作, 你的用户群是谁, 你的用户需要去引用的已有项目是哪些, 怎么和它们共存, 因为完全从零开始造轮子不太可能, 你会用到很多已有的成果.
新做一个项目, 要考虑很多相关的东西, 上下游的东西, 各种的兼容性, 支持性, 要在生态里面去找到你自己的位置. 除此之外, 还要明白什么是项目最重要的指标, 比如开始做 runV 的时候, 第一个考虑事情就是安全容器的启动时间, 并且不间断的去关注和优化.
最后, 做开源项目也并不是说把代码开源出来就行了, 还要注重社区的建设.
作为一个开源项目来说, 它的社区是非常重要的, 有社区才是开源项目.
王旭认为, 作为一个开源项目来说, 它的社区是非常重要的, 有社区才是开源项目, 没有社区的项目只是拿出代码给大家看看而已, 那样不会有人真的严肃的去使用你的代码.
无论是在 runV 的时期, 还是后面 Kata 容器的时期, 社区都是王旭和团队非常注重的一环, 有很多在早期关注和参与的开发者和组织, 到现在王旭也和他们保持着很好的关系.
结语
作为国内少数的基础设施方面的开源软件初创项目的领军人物之一, 王旭无疑在这个领域的技术和商业方面拥有独到的经验和感悟, 这些思考可以给更多在前沿领域的技术人员和开源初创项目一些启示.
来源: https://yq.aliyun.com/articles/707793