当前 Kubernetes 已经成为名副其实的企业级容器编排规范,不少云平台都开始提供兼容 Kubernetes 接口的容器服务。而在多用户支持方面,多数平台选择直接提供专属虚机集群,用户须要花费大量精力处理集群规模、资源利用率、费用等问题。 本次分享带来的是华为云在基于 K8S 构建企业级 Serverless Container 平台过程当中的探索与实践,涉及容器安全隔离、多租管理、Serverless 理念在 Kubernetes 平台的落地等相关内容。docker
首先来了解一下华为云在 Kubernetes 的发展历程。2014 年,华为云就开始研究并使用 Kubernetes,早期的重点是将 Kubernetes 应用在私有云环境中。2016 年,华为公有云上发布了容器引擎平台 ( CCE),它的形式与市面上多数的公有云 Kubernetes 服务(如 GKE、AKS) 相似,是给用户提供完整一套托管的K8S集群。而在今年年初,华为云发布了 Kubernetes 容器实例服务(Serverless Container),不过它与业界一些传统的容器实例服务不太同样。后端
众所周知,容器技术有三大好处。安全
人们使用 Kubernetes 的一种常见形式就是在本身的数据中心搭建集群。网络
这种作法的优势在于:less
可是缺点也很明显:首先,不少人在自建时只看中了 Kubernetes,对周边配套并没作过很深度的研究,在实施过程当中就会面临网络、存储等配套系统的选型问题。其次,用户须要负担 100% 的运维成本,并且资源的投入每每是一次性(或阶段性的),投入成本门槛很是高。此外,在自建的环境中 Kubernetes 的集群数量、中的单个集群规模每每不会很大,因此业务部署规模比较大时,弹性伸缩还会受限于底层资源规模,恰恰硬件资源的扩容速度每每慢得不可想象。最后,开发者习惯于作比较多的资源预留,所以资源利用率也很是有限。也就是说,自建者还要为全套资源利用率买单。 运维
第二种 Kubernetes 的常见形态是公有云的(半)托管集群。性能
能够这样理解,用户购买一组虚机,云平台则自动在这些机器上部署一套 Kubernetes,而半托管含义在于有些平台,它的控制面多是附送的。测试
这种形态的优势是:优化
固然仍有一些明显的缺点spa
首先仍是价格,当用户购买一组虚机,须要付出的价格是 虚机 Flavor 单价 乘以 节点数量 N。其次,由于用户独占一套 Kubernetes 集群,规格不会太大,总体资源利用率仍然比较低。即便尝试调优也效果不大,何况多数状况下用户名不能彻底自定义控制面组件的配置。另外,当集群空闲资源很少而业务须要扩容时,还必须先扩集群,端到端的扩容会受限于虚机的建立时间。
第三种,严格说是用户使用容器的形态,使用公有云的容器实例服务。
它的优势显而易见:
其缺点在于:
不少平台的容器实例服务主要提供私有API,并不能很好兼容kubernetes的API,并且容易被厂商绑定。
然而,因为整个容器实例服务被虚拟成了一个超级节点。Kubernetes 中本来针对多节点精心设计的一系列应用高可用相关特性都没法生效。另外一个问题是这个基于 virtual-kubelet 项目的兼容方案在数据面并不完整,这里包括项目成员在Kube-proxy部署层级位置上的摇摆,以及仍无音讯的容器存储如何兼容。
实际上基于 Kubernetes 多租来构建容器实例服务,优势有不少,最大的在因而支持 K8S 原生 API 和命令行。用户围绕 Kubernetes 开发的应用都以直接在基于 K8S 的 Serverless Container 上部署和运行。由于容器能够作到秒级计费,用户能够享受容器实例服务价格门槛较低的特色。另外,这种形态下一般是云平台来运维一个大资源池,用户只需为业务容器的资源付费,不须要关心底层集群的资源利用率,也没有集群运维的开销。
这种形体现存的主要挑战是 K8S 原生只支持软多租,隔离性等方面还有有欠缺。
下图是华为云容器实例服务的全貌,它基于 Kubernetes 打造,对最终用户直接提供 K8S 的 API。正如前面所说,它最大的优势是用户能够围绕 K8S 直接定义运行应用。
因此在华为云,咱们的作法是经过一层封装和引入 Federation 来得到总体服务的超大规模。同时由于 K8S 原生多租能力很是有限,因此咱们选择将额外基于租户的验证、多租限流等工做放在这一层封装中实现。但对于应用定义等接口,则是直接透传 K8S 原生的 API 数据,只是在调用过程当中增长如请求合法性等的校验。图中右侧的容器网络、容器存储,现有的开源方案是没法知足的,因此华为云采用自研的策略。
前面已经讲过,K8S 原生并无租户概念,只有一层以 Namespace 为边界的隔离。在 Namespace 这一层,除了API对象的可见性隔离,K8S 还提供了 Resource Quota(资源总和限制)以及 Limit Range(定义每一个Pod、Container能使用的资源范围)等精细的配额管理能力。而在华为云上,咱们设计的租户模型是:租户(用户)、项目、Namespace 三层模型,方便用户管理多个项目的开发、测试、生产等不一样阶段。
网络隔离方面,采用多网络模型,一个项目中能够定义多个VPC,VPC 和 Namespace 是一对多的关系。用户能够结合实际须要将开发、测试阶段的应用部署在同个 VPC 的不一样 Namespace 中便于调试和问题定位,生产环境部署在拥有单独 VPC 的 Namespace 保证不受其余活动干扰。
再看 Runtime,因为是全物理机的模式,节点被不一样的租户共享,普通docker容器没法知足Pod间的隔离性要求,Runtime采用的是安全容器(即早期的runV,如今的Kata Container)。使用安全容器的主要思路,就是在Pod外围包一层轻量级虚拟机,这样既保证了Pod间的隔离性,又兼容了K8S原生Pod内容器共享网络和存储的设计。而包装这层轻量级的虚机,由于里面只须要运行容器,能够经过裁剪等手段优化到与普通容器相同数量级的启动时间。
最后,让咱们来回顾一下本次分享的关键内容。
以上是华为云对Kubernetes在Serverless Container产品落地中的实践经验。随着产品的成熟,咱们也计划将一些共性的加强点回馈社区,推进Kubernetes在面向Serverless容器和多租隔离等场景的能力补齐和生态发展。