书评情感分析服务¶

作为书店老板,您希望在客户提交新的负面评论时,立即在 Slack 频道收到通知。通过利用 Knative Function,您可以设置一个无服务器函数,其中包含一个简单的情感分析服务,用于按情感对评论进行分类。
我们将学习哪些 Knative 功能?¶
易于使用 Knative Function 来部署您的服务,并由 Knative Serving 管理,这使您能够自动将服务缩减到零,并根据需求进行扩展。
最终交付成果是什么样的?¶

一个运行中的无服务器 Knative 函数,其中包含一个 Python 应用程序,该应用程序接收新的评论作为 CloudEvent,并返回输入文本的情感分类作为 CloudEvent。
该函数的输出将仅为
-
正面
-
中性
-
负面
安装先决条件¶
先决条件 1:安装 Knative func CLI¶

Knative Function 使您能够通过 func CLI 轻松创建、构建和部署无状态、事件驱动的函数作为Knative Services。
要做到这一点,您需要安装 func CLI。您可以按照官方文档来安装 func CLI。
验证
在终端中运行 func version 来验证安装,您应该会看到您安装的 func CLI 的版本。
故障排除
如果您看到 command not found,您可能需要将 func CLI 添加到您的 PATH。
实施¶

这个过程很简单
-
首先使用
func create命令生成您的代码模板。 -
接下来,将您的独特代码整合到此模板中。
-
最后,执行
func deploy将您的应用程序无缝部署到 Kubernetes 集群。
此工作流确保了 Knative Functions 生态系统中从开发到部署的顺利过渡。
步骤 1:创建 Knative Function 模板¶

使用 func CLI 创建新函数
func create -l <language> <function-name> -t cloudevents
在这种情况下,我们将创建一个处理 CloudEvents 的 Python 函数,因此命令将是
func create -l python sentiment-analysis-app -t cloudevents
此命令将在其中创建一个名为 sentiment-analysis-app 的新目录和一堆文件。func CLI 将为您生成一个基本的函数模板以供开始。
您可以在这里找到所有支持的语言模板。
验证
文件 tree -a 将如下所示
start/sentiment-analysis-app
.
├── .func
│ └── local.yaml
├── .funcignore
├── .gitignore
├── func.yaml
├── function
│ ├── __init__.py
│ └── func.py
├── pyproject.toml
├── README.md
└── tests
└── test_func.py
步骤 2:用情感分析逻辑替换生成的代码¶

sentiment-analysis-app/function/func.py 是包含函数代码的文件。
您可以将生成的代码替换为情感分析逻辑。您可以将以下代码作为起点
sentiment-analysis-app/function/func.py
import logging
from cloudevents.http import CloudEvent
from textblob import TextBlob
def new():
return Function()
class Function:
async def handle(self, scope, receive, send):
""" Handle all HTTP requests to this Function. The incoming CloudEvent is in scope["event"]. """
logging.info("Request Received")
# 1. Get the incoming CloudEvent
request_event = scope["event"]
# 2. Extract the data payload from the event, analyze and create CloudEvent
response_event = self.analyze_sentiment(request_event.data)
# 3. Send the response
logging.info(f"Sending response: {response_event.data}")
await send(response_event)
def create_cloud_event(self, inputText, badWordResult, data):
attributes = {
"type": "moderated-comment",
"source": "sentiment-analysis",
"datacontenttype": "application/json",
"sentimentResult": data,
"badwordfilter": badWordResult,
}
data = {
"reviewText": inputText,
"badWordResult": badWordResult,
"sentimentResult": data,
}
return CloudEvent(attributes, data)
def analyze_sentiment(self, text):
review_text = text.get("reviewText", "")
analysis = TextBlob(review_text)
sentiment = "neutral"
if analysis.sentiment.polarity > 0:
sentiment = "positive"
elif analysis.sentiment.polarity < 0:
sentiment = "negative"
badWordResult = ""
try:
badWordResult = text["badWordResult"]
except KeyError:
pass
return self.create_cloud_event(review_text, badWordResult, sentiment)
步骤 3:配置依赖项¶

sentiment-analysis-app/pyproject.toml 文件包含项目配置以及函数的依赖项。将 textblob 依赖项添加到依赖项数组中
sentiment-analysis-app/pyproject.toml
[project]
name = "function"
description = ""
version = "0.1.0"
requires-python = ">=3.9"
readme = "README.md"
license = "MIT"
dependencies = [
"httpx",
"cloudevents",
"pytest",
"pytest-asyncio",
"textblob", # <-- add this dependency
]
authors = [
{ name="Your Name", email="you@example.com"},
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.pytest.ini_options]
asyncio_mode = "strict"
asyncio_default_fixture_loop_scope = "function"
Knative Function 将在构建函数时自动安装此处列出的依赖项。
步骤 4:在本地构建和运行您的 Knative 函数(可选)¶
点击此处展开

在 Knative Function 中,有两种构建方式:使用pack build 或使用source-to-image (s2i) build。
在我们开始之前,配置容器注册表以将镜像推送到容器注册表。您可以使用以下命令配置容器注册表
export FUNC_REGISTRY=<your-container-registry>
在这种情况下,我们将通过添加 -b=s2i 标志使用 s2i 构建,并使用 -v 查看详细输出。
func build -b=s2i -v
构建完成后,您将看到以下输出
🙌 Function built: <Your container registry>/sentiment-analysis-app:latest
此命令将构建函数并将镜像推送到容器注册表。构建完成后,您可以使用以下命令运行函数
func run -b=s2i -v
故障排除
❗错误:'/home/Kuack/Documents/knative/docs/code-samples' 不包含已初始化的函数
解决方案:您可能需要检查您是否在正确的目录中。您可以使用以下命令检查当前目录。
pwd
如果您在正确的目录中,并且错误仍然发生,请尝试检查您的 func.yaml,因为它必须包含 created 字段和正确的时间戳才能被视为有效的 Knative 函数。
将来,您可以跳过 func build 步骤,因为 func run 将自动为您构建函数。
如果函数运行成功,您将看到以下输出
❗function up-to-date. Force rebuild with --build
Running on host port 8080
---> Running application from script (app.sh) ...
Knative Function 提供了一种模拟 CloudEvent 的便捷方法,您可以使用以下命令来模拟 CloudEvent 并测试您的函数
func invoke -f=cloudevent --data='{"reviewText": "I love Knative so much"}' --content-type=application/json --type="new-review-comment" -v
其中 -f 标志表示数据类型,是 HTTP 或 cloudevent,--data 标志是输入文本。您可以在此处了解更多关于 func invoke 的信息。
在这种情况下,您将获得完整的 CloudEvent 响应
Context Attributes,
specversion: 1.0
type: new-review-comment
source: book-review-broker
id: ebbcd761-3a78-4c44-92e3-de575d1f2d38
time: 2024-05-27T04:44:07.549303Z
datacontenttype: application/json
Extensions,
badwordfilter: good
Data,
{
"reviewText": "I love Knative so much",
"badWordResult": "",
"sentimentResult": "positive"
}
步骤 5:将函数部署到集群¶

注意
在执行以下命令时,请输入 /sentiment-analysis-app。
在 Knative Function 中,有两种构建方式:使用pack build 或使用source-to-image (s2i) build。
完成代码后,您可以使用以下命令将函数部署到集群
注意
使用 -b=s2i 指定函数的构建方式。
func deploy -b=s2i -v
验证
部署完成后,您将看到以下输出
Function deployed in namespace "default" and exposed at URL:
http://sentiment-analysis-app.default.svc.cluster.local
提示
您可以通过运行以下命令找到 Knative 函数(Knative Service)的 URL
kubectl get kservice
您将在输出中看到 URL
NAME URL LATESTCREATED LATESTREADY READY REASON
sentiment-analysis-app http://sentiment-analysis-app.default.svc.cluster.local sentiment-analysis-app-00001 sentiment-analysis-app-00001 True
Knative Serving:缩减到零¶

如果您使用以下命令查询集群中的所有 pod,您会发现 pod 正在运行
kubectl get pods
其中 -A 是查询所有命名空间中的所有 pod 的标志。
您会发现您的情感分析应用程序正在运行
NAMESPACE NAME READY STATUS RESTARTS AGE
default sentiment-analysis-app-00002-deployment 2/2 Running 0 2m
但是,如果您等待一段时间而不向函数发送任何 CloudEvent,然后再次查询 pod,您会发现包含您的情感分析应用程序的 pod 消失了!
这是因为如果函数没有收到请求,Knative Serving 的自动扩展器会自动缩减到零!在此了解更多:Knative Autoscaling。
验证¶

部署后,func CLI 会提供一个 URL 来访问您的函数。您可以发送一个带有示例评论的请求来验证函数的运行情况。
只需使用 Knative Function 的 func invoke 命令直接将 CloudEvent 发送到集群上的函数
func invoke -f=cloudevent --data='{"reviewText":"I love Knative so much"}' -v
-f标志表示数据类型,是HTTP或cloudevent--data标志是输入文本-t标志是 Knative 函数的 URI。
验证
如果您看到响应,则表示函数正在成功运行。
Context Attributes,
specversion: 1.0
type: moderated-comment
source: sentiment-analysis
id: 0c2d0659-a30e-4efd-bcce-803f15ff5cc5
time: 2024-06-11T15:12:43.795405Z
datacontenttype: application/json
Extensions,
badwordfilter:
sentimentresult: positive
Data,
{
"reviewText": "I love Knative so much",
"badWordResult": "",
"sentimentResult": "positive"
}
下一步¶

在本教程中,您学习了如何使用 Knative 为简单的情感分析服务创建无服务器函数。
接下来,我们将按照相同的步骤部署另一个 ML 服务。
提示
在继续之前,请不要忘记 cd 到根目录 /start。