目录
体验阿里云Serverless
Serverless是什么
运行时Runtime
BaaS化
FaaS冷启动
总结
自己动手搭建Serverless
安装istio
安装knative
前面的文章《进化的架构》讲了单体、SOA、微服务、云原生等架构,并针对云原生动手搭建了k8s集群。这里接着讲一讲serverless架构。在云原生时代,我们借助k8s、自动化工具实现了devops,较少关注运维。但是serverless可以让我们做到不关注运维,当然绝对意义的不关注是不可能的,只是很少的关注。
可以先去阿里云体验一下serverless开发流程,选择产品——计算——函数计算FC——服务及函数、serverless工作流,如下图所示:
概念解释
我们使用官网提供的例子,简单搭建一个应用。打开应用中心,选择旅行订单demo——配置并部署
等待创建完毕,去服务函数管理界面查看,发现帮我们创建名为fnf-sample-22d1e0-tripOrderProcessingService-A04B5EBE2C6C的服务
点击进去,有六个函数,分别是:创建火车订单、创建酒店订单、取消飞机订单、取消火车订单、创建飞机订单、发送信息。选中一个函数进行编辑或查看,你将能够指定资源、并发度、实例回收时间、触发器,能够查看日志、实例状态、监控等等。
另外,你会发现这些函数的实例数都是0,只有真正执行时(触发器触发、手动执行、工作流调用)才会创建实例,过一段时间后又自动回收。
如何将这六个函数组织起来形成订票流程呢,我们可以写代码编排,也可以使用官方提供的serverless工作流来完成,刚刚的demo已经帮我们生成好了
进入该流程,选择‘定义’tab,能够看到一个定义好的流程图。如何自定义流程、参数如何传递等等请看官方文档。
如上所见,我们编写代码时,完全无需考虑基础设施,没有了服务器、操作系统、网关、网络调用......做到了NoOps(算力、存储、网络可以认为是无限的,但是要考虑自己钱包是否能够承担)。一句话概括,就是服务端无运维,使我们能够专注业务代码编写。具体到上面的例子,我们其实接触了很多概念,比如函数、触发器等(一定要去阿里云上操作一番,很多东西一操作就自然明白其含义了),把它们归纳成为一种实现方式:FaaS。
FaaS在实现上有很多特点,下面一一道来
内置运行时是官方提供的,是我们函数运行时的上下文环境。联想一下运行本地函数,加载代码到内存——执行——结束,serverless函数的生命周期与此类似,连同它的runtime一同被创建、运行、销毁。能够看出来这个函数是无状态的,只要函数的入参、参数相同,那么出参一定是固定的。除了内置运行时,还有自定义运行时、容器镜像运行时。
既然函数是无状态的,那么我们想要保存数据如何做呢,答案是后端设施BaaS化。后端设施对外提供基于http的api来代替以往的交互方式:客户端启动时维护一个连接池。(后端设施是指数据库、消息队列、日志、存储,等等这一类用于支撑业务逻辑运行,但本身无业务含义的技术组件)
以官网的serverless mysql为例,它提供了http接口来对mysql进行增删改查、事务等操作,并且其提供的特性与serverless的按需付费、无运维是一致的。具体特性参考文档。
我们的函数执行流程如下所示,中间会经过多个步骤,这就是冷启动的概念。这里会涉及到一个重要问题,冷启时间。如果冷启时间过长,会导致第一次调用超时失败。如何避免这个问题呢?
官方提供了以下几个建议
而且根据我们应用的特点,平台允许选择函数模式,是用完既销毁型,还是常驻型。用完既毁型适合对耗时不敏感、冷启时间短的应用。而常驻型与此相反,函数实例的创建销毁由我们手动控制,可以指定预留的实例数量,当实际执行时的压力超过预留实例,会自动启动用完既毁类型的实例,如下图。这样既避免了冷启动的延时,又实现了极高的资源利用率。
最后补充一点,后端设施BaaS化也是降低冷启时间的有效措施。
通过上面的资料,能够看出serverless的一些优点
但如果你实际体验了一番阿里云serverless,会发现有一些限制
《搭建k8s集群》已经搭建好了k8s集群,这里会继续安装istio、knative组件。
# 下载最新版本istio
curl -L https://istio.io/downloadIstio | sh -
# 进入目录
cd istio-xxx/bin
cp istioctl /usr/local/bin/
# 安装
istioctl manifest apply --set profile=demo
# 空间default下的pod在部署时都会注入sidcar
kubectl label ns default istio-injection=enable
# 部署kiali面板
cd istio-xxx/samples/addons/
kiali和Jaeger的服务暴露用的是LoadBalancer,我用的是本地的环境没有公网SLB使用,所以要修改为NodePort模式
vim kiali.yaml
vim jaeger.yaml
# 安装addons下的所有yaml
kubectl apply -f .
# 将istio-ingressgateway改为NodePort方式
kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
访问kiali:http://139.224.137.71:32700/
访问Jaeger:http://139.224.137.71:32701/
删除我们之前的应用,重新部署。但是我发现kubectl apply -f xxx它不自动注入,所以只好用命令行手动注入
kubectl apply -f <(istioctl kube-inject -f k8s-test-com.yaml)
请参考以下。官方提供的仓库国内连不上,这篇博客做了一些修改Knative 介绍-谢先斌的博客Knative是一个开源的企业级解决方案,用于在kubernetes平台中构建Serveless和管理事件驱动的应用程序。https://www.xiexianbin.cn/cloud-native/knative/index.html