Serverless实践系列一、Knative入门

Stella981
• 阅读 778

微信公众号: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组件专注于解决平凡但困难的任务,例如:

  • 部署容器

  • 使用蓝/绿部署路由和管理流量

  • 根据需求自动扩展和调整工作负载大小

  • 将运行服务绑定到事件生态系统

Serverless实践系列一、Knative入门

Knative的开发人员可以使用熟悉的原语、语言和框架来部署功能、应用程序或容器工作负载。

三、 实验

实验环境信息:

Knative v0.7.1OpenShift v4.1+
1. 部署knative

我们将使用Kubernetes Operators在OpenShift上安装Knative服务和事件组件。OpenShift与OperatorHub集成,允许用户从OpenShift Web控制台中安装组件(使用Kubernetes operator)。

通过OperatorHub选择Knative Operators

Serverless实践系列一、Knative入门

选择并安装Knative Serving

Serverless实践系列一、Knative入门

Serverless实践系列一、Knative入门

订阅Knative Serving

Serverless实践系列一、Knative入门

Serverless实践系列一、Knative入门

选 择 并 安装Knat ive  Eventing

Serverless实践系列一、Knative入门

Serverless实践系列一、Knative入门

订阅Knative Eventing

Serverless实践系列一、Knative入门

Serverless实践系列一、Knative入门

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 流量拆分

Serverless实践系列一、Knative入门

编辑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源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这