从Kubernetes到Serverless

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
函数计算FC,每月15万CU 3个月
简介: ——李健(一分)阿里云Serverless应用引擎技术专家

一、K8sServerless带来了什么

image.png

Kubernetes是基于容器的调度引擎。早期,基于容器的技术LXCCgroup2013 年,Docker 项目的开源标志容器技术的成熟容器镜像标准诞生。

容器镜像标准诞生之前,业界对系统没有真正地进行有关注点的拆分,我们认为系统是面向于基础设施的。容器镜像标准的诞生意味着系统将会依据两个关注点拆分一是面向应用,二是面向基础设施。面向应用容器镜像面向基础设施内核。有了容器镜像,才有基于容器的部署生态的不断完善

2014年时,Kubernetes项目诞生,同年Lambda发布,标志着Serverless商业化进程再进一步2016 年,CNCF 原生基金会的成立标志着 Kubernetes生态逐渐成熟和壮大。2018 年,Knative阿里巴巴Serverless应用引擎发布,标志着基于Kubernetesserverless实现产品化。

image.png

CNCF 框架下,诞生了很多Kuebrnetes生态项目,发展欣欣向荣。

Kubernetes特殊在于其理念,比如它遵照着serverless的理念,比如不可变基础设施面向终态声明式 API 等,造就了今天的Kubernetes生态。

image.png

早期 Linux 操作系统面向一台服务器,应用运行时可以和底下的设备进行解耦。应用只通过内核的 API 即可在不同的硬件上进行适配、运行。其设计哲学为“一切皆文件”,也造就了Linux生态的繁荣。Kubernetes的声明式API也可以看作资源文件的CRUD接口,它实现了分布式的基础设施和应用之间解耦。

Linux针对单台机器Kubernetes针对分布式系统,集群里所有节点都被打平,可以直接调度,又因为其面向不可变基础设施理念,进程挂掉以后可以重建可以调度到其他节点上。

Kubernetes一个虚拟的分布式操作系统, Linux 系统上遇到的问题,在Kubernetes也将会遇到。


二、分布式应用交付遇到的问题

Kubernetes 发展至今,生态在不断完善,而容器和Kubernetes的生态奠定了一系列应用交付的形态,但是暴露了过多复杂性,选型、维护和管理的复杂性大幅增加

image.png

当前,用户的关注点一直在左移。早期多的关注点在于基础设施网络硬件而如今已经渐渐无需关注基础设施层,只需专注于自己的业务。

自建Kubernetes主要存在以下三个方面的问题:

第一,资源消耗对于中小用户而言,维护一套集群会带来很多成本,比如一个高可用的operator需要三副本,还需围绕三副本建立监控、日志等。且集群本身也会占用资源,业务波动时容易导致node节点利用不足、资源浪费。

第二,运维复杂。不仅要了解Kubernetes集群的架构,还要对addon(日志、监控)进行技术选型,保证生产环境出问题时能够快速排查定位。且问题的排查也会给运维工程师带来更多的工作量

第三,使用心智。KubernetesAPI有两面性一方面是面向实现,是operator运行的基础;另一方面是面向使用,比如kubectlkustomizehelm等。一个裸的kubernetes中约有近百种资源类型,但用户使用到的资源基本不超过10种。

三、SAE的解决之道

image.png

Serverless架构已经成为趋势更容易被大家所认可,也真正提高了用户的使用体验。Serverless不仅指函数计算,也指计算基础设施的所有供应、扩展、监控和配置都委托给平台的操作模型。

image.png

如果要自建Kubernetes,则过程类似于选择一台组装电脑,需要经历多次选型比如显卡、CPU、内存等,试错成本高;而如果使用一站式的发布平台,则类似于选择一体机,无需关注各项细节,开箱即用。但一站式的发布平台需要基于大规模的沉淀和积累。此外,阿里也针对一些开源组件进行了改造和适配,沉淀为Serverless的体验。

image.png

SAE即上文提到的“一体机 ”——一站式应用发布平台。

SAE平台基于Kubernetes实现,但考虑了基础设施的兼容,也考虑了面向应用会涉及到的addon适配和兼容等,最终实现了一个集成的版本,为用户提供更好的体验

SAE提供了Serverless体验,用户无需关注基础设施,将基础设施托管给云平台,以此得到更大的弹性和扩缩容能力另外,SAE提供了急速弹性和灵活的策略。得益于与云的高度结合,支持突发场景下的秒级弹性伸缩按量计费Serverless特点,稳健保障用户的 SLA,支持丰富的弹性策略。

四、SAE技术原理

image.png

首先,Kubernetes集成了安全容器。容器内核是宿主机共享,安全容器相当于每容器有独立的内核,保证了不同应用之间不会因为有内核漏洞或越权等出现跨容器的侵入。

image.png

社区的安全容器解决方案包括KataFirecrackergVisor。安全容器不仅实现了安全隔离,也实现了性能隔离和故障隔离,不会因为某应用引发内核问题导致机器上所有应用都产生故障。

image.png

SAE提供了微服务无损下线的能力。

Kubernetes所有接口都为异步,pod终止之后才会从注册节点摘掉自己的服务,因此会出现断流。SAE基于Kubernetes本身的能力 pre-stop 实现了主动下线,一旦收到pod终止的信号,首先会调用 pre-stop 帮助用户主动将流量从注册中心摘除,使得应用在下线过程中不会出现断流。

image.png

监控和诊断方面,集成阿里云内部产品比如 ARMS等,应用发布后可自动集成监控能力,可在界面上一键查看服务调用情况函数的调用路径

image.png

SAE提供了端云联调的能力。

用户可以在本地通过 IDE 以及阿里云上的插件,再结合跳板机,即可实现本地和云端的联调,提升用户本地开发的效率。

image.png

SAE场景下,用户集群无感知只需创建命名空间,并设置命名空间的 VPCAswitch应用部署到某个命名空间之后,应用下的pod也会随之部署在 VPCA上,无需自建Kubernetes集群,管理维度也可到达命名空间粒度。

image.png

Serverless提供的免运维能力能够直接面向应用,一键部署无需关注底层的基础设施资源,按照实例收费,按照应用维度做各种运维操作,ECS 所需的日志监控系统等都已集成在内

image.png

Serverless的极速弹性带来了更好的用户体验以及成本的降低。面对剧烈变化的流量能够在10-15s内实现迅速伸缩

image.png

原生k8s部署重建升级策略如上图所示。而SAE实现了原地升级策略,只更新镜像时,容器无需重新调度,在原地即可将老的镜像进行销毁然后拉起新镜像,实现快速启动部署的效率提升42%

image.png

另外SAE实现了镜像预热策略。拉起pod时很大一部分时间花费在镜像的拉取上,拉取用户镜像和调度系统某一部分重叠,因此,无需在将网络容器建立后再拉取镜像而是可以提前某个节点上帮助用户将节点进行加载,加速预热过程,帮助用户更快启动容器,弹性效率提升30%

image.png

SAE针对不同语言做了启动加速。

Java 为例,我们将Dragonwell进行了优化后集成进SAE,增强了AppCDS启动加速。比如多个实例场景下,第一个实例启动时间可能正常,其他几个实例启动扩缩容时,可以通过 AppCDS 技术大幅缩短冷启动时间

image.png

同时,利用Dragonwell Wisp的能力实现了Java运行时加速。将正常的 Java 线程转换协程来实现运行式的加速,运行效率提升20%

Q&A

Q:函数计算选型时,为什么会选择轻量级的容器?

A函数计算最早时只有一种模型,即单实例单请求,意味着某一时刻一个实例只能处理一次请求,处理完后,下一次请求如果再打到该实例进行处理。当前,函数计算底层的隔离是 Micro VM 不再是传统的 Docker很多客户看到了函数计算的弹性,但是对冷启动无法接受因此希望通过单实例多请求规避冷启动。因为多请求时会基于水位实现弹性伸缩在水位未到达弹出警戒线时,几个并发都在已有的实例上工作多个请求都在一个Micro VM,对于单个请求没有做隔离。

Python Node.js虽然支持了单实例多并发,但它只是减少了启动具体的请求处理过程中依然是单个处理模型。所以多请求是没有的。另一种比如Java 生态或 go 生态,可以做协程或多线程触发,可以在同一时间处理多个请求,但在runtime 模型上,如果在请求层面再套一层隔离,则会导致 overhead很长。

另外,单实例多线程情况一个线程 panic 可能会导致整个实例panic ,目前该问题尚且没有较好的解决方案

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
弹性计算 Kubernetes 安全
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
Kubernetes 的架构问题之在Serverless Container中保障应用的安全防护如何解决
145 8
|
1月前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
Kubernetes 的架构问题之ACK/ASK支持ECI的Serverless Container如何解决
80 7
|
1月前
|
弹性计算 Kubernetes Serverless
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
Kubernetes 的架构问题之Serverless Container中不支持特权模式的问题如何解决
70 6
|
1月前
|
Kubernetes 安全 Serverless
Kubernetes 的架构问题之Serverless Container中提供对外服务如何解决
Kubernetes 的架构问题之Serverless Container中提供对外服务如何解决
64 5
|
1月前
|
运维 Kubernetes 大数据
Kubernetes 的架构问题之在Serverless Container场景下尚不支持资源超售如何解决
Kubernetes 的架构问题之在Serverless Container场景下尚不支持资源超售如何解决
55 0
|
存储 缓存 Dragonfly
如何进行容器镜像加速?| 深度揭秘阿里云 Serverless Kubernetes(3)
容器相比虚拟机最突出的特点之一便是轻量化和快速启动。相比虚拟机动辄十几个 G 的镜像,容器镜像只包含应用以及应用所需的依赖库,所以可以做到几百 M 甚至更少。但即便如此,几十秒的镜像拉取还是在所难免,如果镜像更大,则耗费时间更长。
1279 0
如何进行容器镜像加速?| 深度揭秘阿里云 Serverless Kubernetes(3)
|
弹性计算 运维 Kubernetes
深度揭秘阿里云 Serverless Kubernetes
听阿里云技术专家聊聊 Serverless Kubernetes 一路走来的发展史,看看它是如何做到兼容 Kubernetes 使用方式的同时,拥有免运维和极致弹性等特点~
深度揭秘阿里云 Serverless Kubernetes
|
运维 Kubernetes Cloud Native
阿里云 Serverless Kubernetes 的落地实践分享
Serverless Kubernetes 基于 Kubernetes 之上,提供按需使用、节点免运维的 Serverless 能力,让开发者真正实现通过 Kubernetes 标准化 API 进行 Serverless 应用编程,值得关注。
|
Serverless 网络安全 容器
全球公测,阿里云Serverless Kubernetes 更快、更强、更省心
Serverless Kubernetes全球公测进行时!
3441 1

相关产品

  • 函数计算