微信公众号:IT技术实践分享(loren-cloud)
关注可了解更多的IT技术实践信息。问题或建议,请公众号留言;
文章所述仅限技术交流使用.
一、概述
1.1 什么是无服务器计算?
无服务器计算是指构建和运行不需要服务器管理的应用程序的概念。它描述了一种更细粒度的部署模型,其中捆绑为一个或多个功能的应用程序上载到平台,然后执行,缩放和计费,以响应当前所需的确切需求。
无服务器计算并不意味着我们不再使用服务器来托管和运行代码; 这也不意味着不再需要操作工程师。相反,它指的是无服务器计算的消费者不再需要在服务器配置,维护,更新,扩展和容量规划上花费时间和资源的想法。相反,所有这些任务和功能都由无服务器平台处理,并完全从开发人员和IT /运营团队中抽象出来。因此,开发人员专注于编写应用程序的业务逻辑。运营工程师能够将重点提升到更多关键业务任务。
有两个主要的无服务器角色:
开发人员:为无服务器平台编写业务逻辑代码的人员。
提供商:为外部或内部客户部署无服务器平台。
服务器仍然需要运行无服务器平台。该供应商将需要管理的服务器(或虚拟机或容器)。即使在空闲时,提供商也会有一些运行平台的成本。自托管系统仍然可以被视为无服务器:通常一个团队充当提供者,另一个团队充当开发人员。
无服务器计算平台可以提供以下一个或两个服务:
功能即服务(FaaS),通常提供事件驱动的计算。开发人员使用由事件或HTTP请求触发的功能来运行和管理应用程序代码。开发人员将少量代码部署到FaaS,这些代码根据需要作为离散动作执行,无需管理服务器或任何其他底层基础架构即可进行扩展。
后端即服务(BaaS),它是第三方基于API的服务,可替代应用程序中的核心功能子集。因为这些API是作为一种自动扩展和透明操作的服务提供的,所以开发人员认为这是无服务器的。
无服务器产品或平台为开发人员带来以下好处:
零服务器操作:无服务器通过消除维护服务器资源所涉及的开销,显着改变了运行软件应用程序的成本模型。
无需配置,更新和管理服务器基础结构。管理服务器,虚拟机和容器对于公司而言是一项重大的管理费用,其中包括人员、工具、培训和时间。无服务器大大减少了这种费用。灵活的可扩展性:无服务器的FaaS或BaaS产品可以即时、精确地扩展以处理每个单独的传入请求。对于开发人员来说,无服务器平台没有“预先计划的容量”的概念,也不需要配置“自动缩放”触发器或规则。在没有开发人员干预的情况下自动进行缩放。完成请求处理后,无服务器FaaS会自动缩减计算资源,以便永远不会有空闲容量。
闲置时没有计算成本:从消费者的角度来看,无服务器产品的最大好处之一是闲置容量不会产生任何成本。例如,无服务器计算服务不对空闲虚拟机或容器收费; 换句话说,当代码未运行或没有进行有意义的工作时,不收费。对于数据库,数据库引擎容量无需等待查询。当然,这不包括其他成本,例如有状态存储成本或添加的额外功能。
1.2 无服务器使用场景
虽然无服务器计算广泛可用,但它仍然相对较新。通常,当有如下类型工作负载时时,应将无服务器视为首选:
异步,并发,易于并行化为独立的工作单元
不经常或有零星的需求,在扩展要求方面存在巨大的,不可预测的差异
无状态,短暂,不需要瞬间冷启动时间
在改变业务需求方面具有高度动态性,这需要加快开发人员的速度
例如,对于常见的基于HTTP的应用程序,在自动扩展和更细粒度的成本模型方面存在明显的优势。也就是说,使用无服务器平台可能会有一些权衡。
无服务器典型用例有:
执行逻辑以响应数据库更改(插入,更新,触发,删除)
对IoT传感器输入消息(例如MQTT消息)执行分析
处理流处理(分析或修改运动中的数据)
管理单次提取,转换和加载需要在短时间内进行大量处理的作业(ETL)
通过聊天机器人界面提供认知计算(异步)
调度任务执行的时间很短,例如cron或批处理样式调用
服务机器学习和AI模型(检索一个或多个数据元素,如表格,NLP或图像,并与预先学习的数据模型匹配,以识别文本、面部表情、异常等)
持续集成管道,按需为构建作业提供资源,而不是保留构建从属主机池等待作业分派
二、 Knative
Knative是由谷歌创建的开源serverless项目,目前已经有50+公司参与贡献,它提供了一组基本组件,用于在Kubernetes上构建、部署和管理现代无服务器工作负载。其特点如下:
1. 所有人必备的基本原语
Knative为Kubernetes上的云原生应用程序提供了从零到零,自动扩展,集群内构建和事件框架等功能。无论是在本地,在云中还是在第三方数据中心,Knative都会编写成功的基于Kubernetes的成功框架所共享的最佳实践。最重要的是,Knative使开发人员能够专注于编写代码,而无需担心构建,部署和管理应用程序的“枯燥但困难”的部分。
2. 开发人员友好的软件
Knative提供了一组可重用的组件,专注于解决许多平凡但困难的任务,例如从源代码构建应用程序到容器映像,在部署期间路由和管理流量,自动扩展工作负载或将运行服务绑定到不断增长的生态系统等工作流程事件来源。Knative将容器图像识别为部署单元。因此,开发人员可以使用他们熟悉的任何语言,框架或习语。
3. 支持流行的开发模式
Knative专注于开发人员使用习惯。它支持常见的开发模式,如GitOps,DockerOps,ManualOps,以及Django,Ruby on Rails,Spring等工具和框架。
4. 两全其美:灵活性和控制力
Knative旨在轻松插入现有的构建和CI / CD工具链。通过专注于在任何地方,任何云上,在Kubernetes支持的任何基础架构上运行的开源优先技术,企业可以随时随地移动工作负载。这提供了客户根据自己的独特要求调整系统所需的灵活性和控制。
5. 按照您自己的条件运行无服务器工作负载
Knative提供了一个开放的API和运行时环境,使您可以在任何地方运行无服务器工作负载, 不需要担心供应商锁定。可以在Azure、Google Kubernetes Engine(GKE)或私有云环境的的OpenShift/Kubernetes集群上灵活切换。
Knative由Serving和Eventing组件组成:
Eventing, 管理和交付事件
Serving, 以Kubernetes和Istio为基础,支持/服务于无服务器应用程序和功能的部署
Knative组件专注于解决平凡但困难的任务,例如:
部署容器
使用蓝/绿部署路由和管理流量
根据需求自动扩展和调整工作负载大小
将运行服务绑定到事件生态系统
Knative的开发人员可以使用熟悉的原语、语言和框架来部署功能、应用程序或容器工作负载。
三、 实验
实验环境信息:
Knative v0.7.1OpenShift v4.1+
1. 部署knative
我们将使用Kubernetes Operators在OpenShift上安装Knative服务和事件组件。OpenShift与OperatorHub集成,允许用户从OpenShift Web控制台中安装组件(使用Kubernetes operator)。
通过OperatorHub选择Knative Operators
选择并安装Knative Serving
订阅Knative Serving
选 择 并 安装Knat ive Eventing
订阅Knative Eventing
2. 验证环境部署是否就绪
确认OCP版本
[root@clientvm 0 ~]# oc versionClient Version: version.Info{Major:"4", Minor:"1+", GitVersion:"v4.1.0-201905191700+7bd2e5b-dirty", GitCommit:"7bd2e5b", GitTreeState:"dirty", BuildDate:"2019-05-19T23:52:43Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"13+", GitVersion:"v1.13.4+838b4fa", GitCommit:"838b4fa", GitTreeState:"clean", BuildDate:"2019-05-19T23:51:04Z", GoVersion:"go1.11.5", Compiler:"gc", Platform:"linux/amd64"}
查看istio基础服务是否就绪
[root@clientvm 0 ~]# oc get pods -n istio-systemNAME READY STATUS RESTARTS AGEcluster-local-gateway-7447859495-m6qvb 1/1 Running 0 105mistio-ingressgateway-75bffcfb5-xnslm 1/1 Running 0 105mistio-pilot-77d5cd65b4-zjzvd 1/1 Running 0 106m
查看knative serving相关服务是否就绪
[root@clientvm 0 ~]# oc get pods -n knative-serving NAME READY STATUS RESTARTS AGEactivator-7659575764-n277c 1/1 Running 0 108mautoscaler-5c4df547b7-5vxjd 1/1 Running 0 108mcontroller-5d9db69fb6-nfw4d 1/1 Running 0 108mknative-openshift-ingress-57f5bb9ccd-kcgzq 1/1 Running 0 108mnetworking-certmanager-576967c468-rhwsq 1/1 Running 0 108mnetworking-istio-85fd5b5dcf-rh8gs 1/1 Running 0 108mwebhook-7b757b8967-c95rm 1/1 Running 0 108m
查看knative eventing服务是否就绪
[root@clientvm 0 ~]# oc get pods -n knative-eventingNAME READY STATUS RESTARTS AGEeventing-controller-5f84884d54-qp66t 1/1 Running 0 7m7seventing-webhook-5798db889d-jwn2b 1/1 Running 0 7m6simc-controller-5dbf7dd77b-clqb6 1/1 Running 0 6m56simc-dispatcher-5d6c448bcb-tmnpn 1/1 Running 0 6m56sin-memory-channel-controller-75c954fd67-krdht 1/1 Running 0 7m3sin-memory-channel-dispatcher-8b7fcf4fd-wmpfd 1/1 Running 0 7msources-controller-578b47f948-ntwtr 1/1 Running 0 7m7s
3. 部署demo应用
3.1 创建项目
[root@clientvm 0 ~]# oc new-project knativetutorial
3.2 放开权限
[root@clientvm 0 ~]# oc adm policy add-scc-to-user privileged -z defaultsecuritycontextconstraints.security.openshift.io/privileged added to: ["system:serviceaccount:knativetutorial:default"][root@clientvm 0 ~]# oc adm policy add-scc-to-user anyuid -z defaultsecuritycontextconstraints.security.openshift.io/anyuid added to: ["system:serviceaccount:knativetutorial:default"]
3.3 部署应用
[root@clientvm 0 ~]# git clone https://github.com/redhat-developer-demos/knative-tutorial[root@clientvm 0 ~]# export TUTORIAL_HOME=~/knative-tutorial[root@clientvm 0 ~]# cd $TUTORIAL_HOME/02-basics/knative[root@clientvm 0 ~/knative-tutorial/02-basics/knative master ⭑|✔]# lsservice-env.yaml service-pinned.yaml service.yaml[root@clientvm 0 ~/knative-tutorial/02-basics/knative master ⭑|✔]# oc apply -n knativetutorial -f service.yamlservice.serving.knative.dev/greeter created
[root@clientvm 0 ~]# oc get podsNAME READY STATUS RESTARTS AGEgreeter-v1-deployment-7b7498c6c5-mmskj 2/2 Running 0 55s
查看knative服务信息
[root@clientvm 1 ~]# oc get ksvcNAME URL LATESTCREATED LATESTREADY READY REASONgreeter http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com greeter-v1 greeter-v1 True
访问应用
[root@clientvm 0 ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 1
查看配置信息
[root@clientvm 0 ~]# oc --namespace knativetutorial get configurations.serving.knative.dev greeterNAME LATESTCREATED LATESTREADY READY REASONgreeter greeter-v1 greeter-v1 True
查看route信息
[root@clientvm 0 ~]# oc --namespace knativetutorial get routes.serving.knative.dev greeterNAME URL READY REASONgreeter http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com True
查看修订版本信息
[root@clientvm 0 ~]# oc --namespace knativetutorial get rev \> --selector=serving.knative.dev/service=greeter \> --sort-by="{.metadata.creationTimestamp}"NAME SERVICE NAME GENERATION READY REASONgreeter-v1 greeter-v1 1 True
3.4 部署新的修订版本
部署新版本
[root@clientvm 0 ~/knative-tutorial/02-basics/knative master ⭑|✔]# oc apply -n knativetutorial -f service-env.yamlservice.serving.knative.dev/greeter configured
查看修订版本列表
[root@clientvm 0 ~/knative-tutorial/02-basics/knative master ⭑|✔]# oc get revNAME SERVICE NAME GENERATION READY REASONgreeter-v1 greeter-v1 1 True greeter-v2 greeter-v2 2 True
更新knative服务信息
[root@clientvm 0 ~/knative-tutorial/02-basics/knative master ⭑|✔]# cat service-pinned.yaml apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: greeterspec: template: metadata: name: greeter-v2 annotations: # disable istio-proxy injection sidecar.istio.io/inject: "false" spec: containers: - image: quay.io/rhdevelopers/knative-tutorial-greeter:quarkus env: - name: MESSAGE_PREFIX value: Namaste livenessProbe: httpGet: path: /healthz readinessProbe: httpGet: path: /healthz traffic: - tag: current revisionName: greeter-v1 percent: 100 - tag: prev revisionName: greeter-v2 percent: 0 - tag: latest latestRevision: true percent: 0[root@clientvm 0 ~/knative-tutorial/02-basics/knative master ⭑|✔]# oc -n knativetutorial apply -f service-pinned.yamlservice.serving.knative.dev/greeter configured
上述服务定义为现有路由创建三个子路由(以流量标记命名)greeter。
current: 将具有所有100%的流量分配
prev: 之前有效的修订版本,现在流量为零
latest: 指向任何最新服务部署的路由,通过设置为零,我们确保不会自动获取最新版本。
在ksvc中声明了三项流量标签,通过下面的命令行查看子route信息
[root@clientvm 0 ~# oc get ksvc greeter -o yaml | grep "knativetutorial.apps.cluster-b520.sandbox671.opentlc.com" url: http://current-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com url: http://prev-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com url: http://latest-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com url: http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com
尝试通过当前和前一个route访问不同版本的应用
[root@VM_0_2_centos ~]# curl http://current-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 1[root@VM_0_2_centos ~]# curl http://prev-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comNamaste greeter => '9861675f8845' : 1
[root@clientvm 0 ~]# oc get podsNAME READY STATUS RESTARTS AGEgreeter-v1-deployment-7b7498c6c5-7ssr2 2/2 Running 0 73sgreeter-v2-deployment-6699c8b48c-g582z 2/2 Running 0 27s
3.5 流量拆分
编辑knative service,配置v1和v2版本流量各50%。配置如下:
[root@clientvm 0 ~]# oc get ksvc greeter -o yaml...traffic: - latestRevision: false percent: 50 revisionName: greeter-v1 tag: current url: http://current-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com - latestRevision: false percent: 50 revisionName: greeter-v2 tag: prev url: http://prev-greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.com
验证结果
[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 1[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comNamaste greeter => '9861675f8845' : 11[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 2[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 3[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 4[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 5[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comHi greeter => '9861675f8845' : 6[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comNamaste greeter => '9861675f8845' : 12[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comNamaste greeter => '9861675f8845' : 13[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comNamaste greeter => '9861675f8845' : 14[root@VM_0_2_centos ~]# curl http://greeter.knativetutorial.apps.cluster-b520.sandbox671.opentlc.comNamaste greeter => '9861675f8845' : 15
4. 清理
[root@clientvm 0 ~]# oc -n knativetutorial delete services.serving.knative.dev greeterservice.serving.knative.dev "greeter" deleted
总结
无服务器使开发人员能够专注于由事件驱动的函数组成的应用程序,这些函数响应各种触发器并让平台负责其余的事情,例如触发器到函数逻辑,从一个函数传递到另一个函数的信息,自动创建容器和运行时、自动扩展及身份管理等。其优势包括对任何云原生范例的基础架构管理的最低要求。无需考虑操作或文件系统,运行时甚至不需要考虑容器管理。无服务器享受自动扩展,弹性负载平衡和最细粒度的“即用即付”计算模型。
本文分享自微信公众号 - 大魏分享(david-share)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。