【云驻共创】Knative应用开发指南
《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的重点在两个关键组件上:
- 为其提供流量serving(服务)
- 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。
事件驱动应用范例
步骤如下 :
- 创建一个简单的事件处理程序helloworld.go
- 定义dockerfile构建源码并生成容器镜像
- 部署事件处理服务
- 定义Broker和Trigger
- 测试验证
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.cn/blogs/293957
- 点赞
- 收藏
- 关注作者
评论(0)