【云驻共创】Knative应用开发指南

AnRFDev 发表于 2021/08/20 11:22:14 2021/08/20
【摘要】 Knative应用开发指南。 k8s( k8s全称kubernetes )平台建设完成,但是开发人员学习成本很高。我们使用一些生态中的工具简化了一些配置,但开发者依然还是要关注容器的一些细节。例如负载,扩容,灰度发布。这些实现起来也比较复杂。

《Knative应用开发指南》写书背景是什么 ?

最初做技术方向研究时,是基于现实需求出发 ,而不是技术研究角度出发。

现实工程中存在一些挑战 :

1.k8s( k8s全称kubernetes )平台建设完成,但是开发人员学习成本很高。我们使用一些生态中的工具简化了一些配置,但开发者依然还是要关注容器的一些细节。例如负载,扩容,灰度发布。这些实现起来也比较复杂。

2.k8s作为一个通用目的的平台,开发者有很大的自由度。导致的问题是,缺少一个统一的开发框架和规范。开发者之间的经验和习惯不同。大家使用的方式各种各样。对为微服务管理来说是个挑战。找到个解决简单有效的服务编排方式。解决开发和运维管理复杂度的问题。

3.k8s没有解决低频服务资源占用的问题。低频服务:平时调用量很小,但又不能停止。计算 资源 使用率低。 我们 要用自动化技术解决低频服务问题。


为什么 Serverless?

Serverless正在快速发展时期。Serverless 作为一种新型的互联网架构,直接或间接推动了云计算的发展 。 简化了云计算的编程,代表了程序员生产力的又一次变革 。不仅是云计算本身,对软件开发来说也是一个大变革。


什么Serverless

Serverless = FaaS + BaaS

Serverless = 函数即服务 + 后端即服务

开发者无需管理基础设施 。开发和运维工作可以分离开来。使用了Serverless ,只需调用一个函数或一系列函数即可获得结果。此外,Serverless计算的成本也低于基于服务器的成本,使用Serverless,只需为执行该函数付费。也就是按用付费,不使用的时候成本为0。


关于Knative

Knative 是 谷歌发起的基于K8S平台的Serverless开源项目。用于部署和管理现代无服务器工作负载。 是一套简单易用的Serverless管理方案 。

Knative 项目地址 https://github.com/knative


Knative在 k8s 生态中 。Knative以容器方式运行。编排依赖于 k8s 。Istio提供动态路由、熔断限流等功能

Knative是为开发者准备的Serverless平台

  • 抽象复杂的细节,让开发者关注业务本身(Service-based,Event-driven)
  • 解决构建部署,服务治理步骤
  • 开放和可移植(Open & portable)
    • 不同云平台之间很难迁移, 而 Knative解决了这个问题


Knative提供事件驱动的功能给开发者。

Knative自动化构建部署 功能 , 减轻开发者的负担。把构建和部署过程自动化。


Knative的总体设计

Knative的重点在两个关键组件上:

  1. 为其提供流量serving(服务)
  2. eventing ,确保应用程序能够轻松地生产和消费event(事件)。


serving服务管理组件解决的问题

  • 用户容器的快速部署
  • 自动伸缩,支持缩容到零
    • K8s也有弹性伸缩
    • Knative内置的弹性伸缩的性能更好;可将工作负载缩到0
  • 更高级的服务器路由和流量控制
    • 不同版本可以做到流量切分,可以做灰度发布
  • 容器的配置的版本管理
    • 配置变更会生成快照;可以用历史的版本进行流量切分
  • 有垃圾清理机制删掉不再使用的版本
    • Service是核心对象


eventing事件驱动

  • 管理和交付事件
  • 将服务绑定到事件
  • 抽象发布 / 订阅细节


Knative开发实战

服务的构建和编排

步骤如下 :

1. 一个简单的web服务程序 helloworld.go

2. 使用Dockerfile构建源码并生成容器镜像

3. 部署helloworld.go服务

4. 版本更新到v 2

5. 灰度发布


1 helloworld.go


# 在本地构建容器

docker build -t {username}/helloworld-go .

# 将容器push到docker容器镜像仓库

docker push {username}/helloworld-go


部署helloworld.go服务 的时候 , 把 kind设置为Service 。

# 部署服务的命令

kubectl apply -f service yaml


版本更新到v2 的时候 , 把name改 成 helloworld-go-v2 。

灰度发布时 ,设置traffic,可进行流量切分 。

最后可以 用curl命令进行测试 。

Knative Eventing

核心功能:对发布/订阅细节进行抽象处理,帮助开发人员摆脱相关负担


  • 声明式绑定event sources,triggers和services
  • 从少量事件到实时stream pipelines动态扩展
  • 采用CloudEvent标准
  • 抽象的事件来源,解耦具体事件源类型(kafka,CronJob,GitHub)
  • Channel的实现可插拔(InMemory,Kafka,Nats,PubSub)


一个典型的模型

事件从源发出,Broker接收后根据Trigger的定义(过滤),消息传给对应的Service。


事件驱动应用范例

步骤如下 :

  1. 创建一个简单的事件处理程序helloworld.go
  2. 定义dockerfile构建源码并生成容器镜像
  3. 部署事件处理服务
  4. 定义Broker和Trigger
  5. 测试验证


helloworld.go 部分代码

main创建一个客户端,接收事件来处理。可选性地返回一个新的事件。

新的事件直接返回给Broker。Broker可以把事件发给订阅了的服务。


Docker构建

# 在本地构建容器

docker build -t {username}/helloworld-go .

# 将容器push到docker容器镜像仓库

docker push {username}/helloworld-go


部署事件处理服务

# 部署的命令

kubectl apply -f service .yaml


定义Broker和Trigger

# 运行下面的命令完成服务的事件订阅

kubectl apply -f subscription.yaml


测试验证

Broker 可以 用http请求来验证

总结

Knative给了我们什么好处?

虚拟机的资源管理比较粗。k8s解决启动速度慢问题。如果不用Knative,k8s资源还是静态分配。效率不够高。资源利用率不够高。

业务代码和平台代码的隔离带来开发的敏捷性,使得开发者工作效能更高 。 传统服务要和平台有一定耦合。平台升级,业务代码也要升级。 而 Knative可以让开发者专注在业务代码。

计算资源脱离服务器的抽象的 无 服务器架构是云计算未来的发展趋势 。


一些疑问

如何高效使用这本《Knative应用开发指南》?

需要 读者有了解基础技术 , Knative serving很容易上手。复杂的服务可以用架构方式来构建。Knative发展时间不长,比较年轻,变化快。大家可以多跟踪开源项目。


Knative应用场景 有哪些

应用场景 非常广泛。微服务场景都可以用Knative。Knative是原生的serverlesse实现。Knative的事件驱动,可应用在事件相关场景,作业(大数据)中。触发作业的执行。


Knative的主要优势

Knative的主要优势,比起其他serverless开源项目来说,它有几个大的云厂商支持。大的云厂商实力强。Knative能做到高标准化。


Knative和Istio的关系

它们不是绑定的 ,可解耦。 Knative 主要用了Istio的网关。 而且 Knative的网络层提供有三四种可选的技术。如果开启了Istio的一些高级功能,也可给Knative带来一些Istio的能力。


Knative如何提高计算资源利用率

Knative并不是简单的提高弹性缩容。在突发请求很大,流量波动剧烈,Knative解决冷启动延迟问题。若很在意冷启动延迟问题,Knative可以配置保留最小实例,缩扩容的时间等等设置。缩容到0的时候,会等待一段时间。若真的没有请求,就缩容到0。把请求的路由转到组件上。宁可慢,也不能让请求失败。

上面整个过程解决了利用率问题。在未来,要解决计算资源的利用率问题。无服务器架构是未来的主流。现在业界还在努力。未来考虑BaaS后端服务也应该有同等的弹性,这样性能更好。Knative并不是解决了所有的问题,还是需要时间。目前用Knative来解决微服务治理是很合适的。


学习Knative的基础,指导

了解k8s,有助于提高对Knative的理解,加快排查问题速度。必须了解容器,使用容器。

所有的技术都是有生命周期。云原生方向上这是个主流。跟着大方向走。


对个人开发者和学生来的指导

对学生来说,从学习k8s和容器开始。工作中需要 用 哪部分,再去了解,难度不是很大。


本文整理自华为云社区内容共创活动 Knative应用开发指南 查看活动详情 https://bbs.huaweicloud.com/blogs/293957

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。