「无服务器架构」动手操作Knative -第二部分

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 「无服务器架构」动手操作Knative -第二部分

在上一篇文章中,我讨论了Knative用于快速部署和自动调整无服务器容器。如果您希望您的服务由HTTP调用同步触发,那么Knative服务是很好的选择。然而,在没有服务器的微服务世界中,异步触发器更加常见和有用。这时,Knative三项赛就开始发挥作用了。

在Knative系列的第2部分中,我将介绍Knative事件并展示一些来自我的Knative教程的示例,这些示例介绍了如何将它与各种服务集成在一起。

什么是Knative Eventing?

Knative事件处理与Knative服务密切相关,它为松散耦合的事件驱动服务提供了基元。典型的Knatives事件架构是这样的:




主要有4个组成部分:

  1. Source(也称为Producer)从实际的源中读取事件,并将事件向下转发到一个通道,或者直接转发到一个服务,这种情况比较少见。
  2. Channel从源接收事件,保存到其底层存储(稍后详细介绍),并向所有订阅者展开。
  3. 订阅连接一个通道和一个服务(或另一个通道)。
  4. 服务(也称为消费者)是使用事件流的Knative服务。

让我们更详细地看看这些。

来源,渠道和订阅

Knative事件的最终目标是将事件从源路由到服务,这是通过我前面提到的原语实现的:源、通道和订阅。

Source从实际源读取事件并将它们转发到下游。到目前为止,Knative支持从Kubernetes、GitHub、谷歌云发布/订阅、AWS SQS主题、容器和CronJobs读取事件。

一旦事件被拉入Knative,它就需要保存到内存中,或者保存到更持久的地方,比如Kafka或谷歌云发布/订阅。这发生在通道上。它有多个实现来支持不同的选项。

从Channel将事件传递给所有感兴趣的Knative服务或其他通道。这可以是一对一的,也可以是扇出的。订阅决定了这种交付的性质,并充当通道和Knative服务之间的桥梁。

现在我们已经了解了Knative三项赛的基础知识,让我们来看一个具体的例子。

Hello World事件

对于Hello World事件,让我们读取来自谷歌云发布/订阅的消息并在Knative服务中注销它们。我的你好世界三项赛教程有所有的细节,但在这里重述,这是我们需要设置:

  1. 从谷歌云发布/订阅读取消息的GcpPubSubSource。
  2. 将消息保存在内存中的通道。
  3. 链接频道到Knative服务的订阅。
  4. 接收消息并注销的Knative服务。

gcp-pubsub-source。yaml定义了GcpPubSubSource。它指向一个名为测试的发布/订阅主题,它有访问发布/订阅的凭证,并指定应该像这样转发哪个频道事件:

apiVersion: sources.eventing.knative.dev/v1alpha1

kind: GcpPubSubSource

metadata:

name: testing-source

spec:

gcpCredsSecret: # A secret in the knative-sources namespace

name: google-cloud-key

key: key.json

googleCloudProject: knative-atamel # Replace this

topic: testing

sink:

apiVersion: eventing.knative.dev/v1alpha1

kind: Channel
name: pubsub-test

接下来,我们使用Channel .yaml定义通道。在这种情况下,我们只是在内存中保存消息:

apiVersion: eventing.knative.dev/v1alpha1

kind: Channel

metadata:

name: pubsub-test

spec:

provisioner:

apiVersion: eventing.knative.dev/v1alpha1

kind: ClusterChannelProvisioner

name: in-memory-channel

继续创建源和通道:

kubectl apply -f gcp-pubsub-source.yaml

kubectl apply -f channel.yaml

你可以看到源和通道被创建,有一个源pod也被创建:

kubectl get gcppubsubsource NAME AGE testing-source 1mkubectl get channel NAME AGE pubsub-test 1mkubectl get pods NAME READY STATUS gcppubsub-testing-source-qjvnk-64fd74df6b-ffzmt 2/2 Running

最后,我们可以创建Knative服务,并使用订阅服务器中的订阅将其链接到subscriber.yaml文件:

apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata: name: message-dumper-csharp spec: runLatest: configuration: revisionTemplate: spec: container: # Replace {username} with your actual DockerHub image: docker.io/{username}/message-dumper-csharp:v1--- apiVersion: eventing.knative.dev/v1alpha1 kind: Subscription metadata: name: gcppubsub-source-sample-csharp spec: channel: apiVersion: eventing.knative.dev/v1alpha1 kind: Channel name: pubsub-test subscriber: ref: apiVersion: serving.knative.dev/v1alpha1 kind: Service name: message-dumper-csharp

如您所见,message-dump -csharp只是一个普通的Knative服务,但它是通过其订阅的Knative事件异步触发的。

kubectl apply -f subscriber.yamlservice.serving.knative.dev "message-dumper-csharp" created subscription.eventing.knative.dev "gcppubsub-source-sample-csharp" configured


一旦你kubectl apply所有的yaml文件,你可以使用gcloud发送消息到发布/订阅主题:

gcloud pubsub topics publish testing --message="Hello World"

你应该可以看到pods 的服务创建:

kubectl get pods

NAME READY

gcppubsub-testing-source-qjvnk-64fd74df6b-ffzmt 2/2 Running 0 3m

message-dumper-csharp-00001-deployment-568cdd4bbb-grnzq 3/3 Running 0 30s

服务将Base64编码的消息记录在Data下面:

info: message_dumper_csharp.Startup[0]

C# Message Dumper received message: {"ID":"198012587785403","Data":"SGVsbG8gV29ybGQ=","Attributes":null,"PublishTime":"2019-01-21T15:25:58.25Z"}

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]

Request finished in 29.9881ms 200

查看我的Hello World事件教程,了解更多关于步骤和实际代码的细节。

与云存储和Vision API集成

当您试图以无缝的方式连接完全不相关的服务时,Knative事件就会真正地发挥作用。在我的集成与视觉API教程中,我展示了如何使用Knative事件连接谷歌云存储和谷歌云视觉API。

云存储是一种全球可用的数据存储服务。可以将bucket配置为在保存映像时发出发布/订阅消息。然后,我们可以使用Knative事件侦听这些发布/订阅消息,并将它们传递给Knative服务。在服务中,我们使用图像进行一个Vision API调用,并使用机器学习从中提取标签。所有的细节都在教程中进行了解释,但是我想在这里指出一些事情。

首先,在Knative中,所有的出站流量在缺省情况下都会被阻塞。这意味着在默认情况下,您甚至不能从Knative服务调用Vision API。这最初让我感到惊讶,所以请确保配置了网络出站访问。

其次,无论何时将图像保存到云存储中,它都会发出CloudEvents。Knative三项赛通常与CloudEvents一起使用。你需要将传入的请求解析为CloudEvents,并提取你需要的信息,如事件类型和图像文件的位置:

var cloudEvent = JsonConvert.DeserializeObject<CloudEvent>(content); var eventType = cloudEvent.Attributes["eventType"]; var storageUrl = ConstructStorageUrl(cloudEvent);

有了这些信息,很容易为图像构造存储URL并使用该URL进行Vision API调用。完整的源代码在这里解释,但这里是相关的部分:

var visionClient = ImageAnnotatorClient.Create();

var labels = await visionClient.DetectLabelsAsync(Image.FromUri(storageUrl), maxResults: 10);

一旦代码准备好了,我们就可以通过定义一个ubscriber.yaml将服务挂接到Knative事件上。它和以前很相似。我们正在重用现有的源和通道,所以我们不必重新创建它们。我们只是创建一个新的订阅指向我们新的Knative服务与愿景API容器:

apiVersion: serving.knative.dev/v1alpha1

kind: Service

metadata:

name: vision-csharp

spec:

runLatest:

configuration:

revisionTemplate:

spec:

container:

# Replace {username} with your actual DockerHub

image: docker.io/{username}/vision-csharp:v1

---

apiVersion: eventing.knative.dev/v1alpha1

kind: Subscription

metadata:

name: gcppubsub-source-vision-csharp

spec:

channel:

apiVersion: eventing.knative.dev/v1alpha1

kind: Channel
name: pubsub-test

subscriber:

ref:

apiVersion: serving.knative.dev/v1alpha1

kind: Service
name: vision-csharp

一旦使用kubectl apply创建了所有内容,无论何时将映像保存到云存储桶中,都应该看到该映像的Knative服务日志标签。

例如,我有一张我最喜欢的地方的照片:




当我把图片保存到桶里时,我可以在日志中看到Vision API中的以下标签:

info: vision_csharp.Startup[0]

This picture is labelled: Sea,Coast,Water,Sunset,Horizon

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]

Request finished in 1948.3204ms 200

可以看到,我们使用Knative事件将一个服务(云存储)连接到另一个服务(Vision API)。这只是一个例子,但可能性是无限的。在本教程的翻译API集成部分中,我展示了如何将发布/订阅连接到翻译API。

这就是Knative三项赛。在本系列的下一篇也是最后一篇文章中,我将讨论Knative构建。

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
7天前
|
弹性计算 负载均衡 Java
【上云基础系列 02-01】通过SLB+1台ECS+ESS弹性伸缩,搭建一个精简版的上云标准弹性架构(含方案及教程)
通常,构建一个弹性架构(即使是一个最基础的入门版),至少需要2台ECS。但是,很多小微企业刚开始上云的时候,为了节省成本不愿意购买更多的服务器。通过 “ALB+ESS弹性伸缩+1台ECS+RDS”方案,在保障低成本的同时,也不牺牲业务架构的弹性设计,更避免了很多人因为节省成本选择了单体架构后频繁改造架构的困局。 方案中的几个设计非常值得小微企业借鉴:(1)通过ALB/RDS的按量付费,节省了初期流量不大时的费用;(2)通过ESS弹性伸缩,不需要提前购买服务器资源,但是当业务增长或减少时却保持了资源弹性自动扩缩容。
|
7天前
|
存储 人工智能 并行计算
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
|
1月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
150 10
|
1月前
|
负载均衡 Serverless 持续交付
云端问道9期实践教学-省心省钱的云上Serverless高可用架构
详细介绍了云上Serverless高可用架构的一键部署流程
58 10
|
1月前
|
存储 人工智能 运维
面向AI的服务器计算软硬件架构实践和创新
阿里云在新一代通用计算服务器设计中,针对处理器核心数迅速增长(2024年超100核)、超多核心带来的业务和硬件挑战、网络IO与CPU性能增速不匹配、服务器物理机型复杂等问题,推出了磐久F系列通用计算服务器。该系列服务器采用单路设计减少爆炸半径,优化散热支持600瓦TDP,并实现CIPU节点比例灵活配比及部件模块化可插拔设计,提升运维效率和客户响应速度。此外,还介绍了面向AI的服务器架构挑战与软硬件结合创新,包括内存墙问题、板级工程能力挑战以及AI Infra 2.0服务器的开放架构特点。最后,探讨了大模型高效推理中的显存优化和量化压缩技术,旨在降低部署成本并提高系统效率。
|
1月前
|
弹性计算 运维 网络协议
卓越效能,极简运维,Serverless高可用架构
本文介绍了Serverless高可用架构方案,当企业面对日益增长的用户访问量和复杂的业务需求时如何实现更高的灵活性、更低的成本和更强的稳定性。
|
1月前
|
监控 Serverless 测试技术
云端问道9期方案教学-省心省钱的云上Serverless高可用架构
本文介绍了省心省钱的云上Serverless高可用架构,主要分为两个部分:1. Serverless的发展历程、特点及高可用架构;2. SAE(Serverless Application Engine)产品介绍。Serverless作为一种云计算模式,让用户无需管理底层基础设施,自动弹性扩展资源,按需付费,极大提高了资源利用率和业务灵活性。SAE作为Serverless计算服务,提供了简便的应用部署、运维自动化、丰富的弹性策略和可观测性等功能,帮助企业降低运营成本、提升研发效率。通过极氪汽车、南瓜电影等客户案例展示了SAE在实际应用中的优势。
|
2月前
|
弹性计算 运维 Serverless
卓越效能,极简运维,体验Serverless高可用架构,完成任务可领取转轮日历!
卓越效能,极简运维,体验Serverless高可用架构,完成任务可领取转轮日历!
|
3月前
|
监控 Serverless 云计算
探索Serverless架构:开发实践与优化策略
本文深入探讨了Serverless架构的核心概念、开发实践及优化策略。Serverless让开发者无需管理服务器即可运行代码,具有成本效益、高可扩展性和提升开发效率等优势。文章还详细介绍了函数设计、安全性、监控及性能和成本优化的最佳实践。
|
3月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
154 7

热门文章

最新文章