Slack sink - 学习 Knative Eventing 和 Apache Camel K 集成¶

作为书店老板,您希望在客户提交新评论时,在 Slack 频道中收到即时通知。通过利用 Knative Eventing 和 Apache Camel K,您可以设置一个事件驱动的服务来自动化这些通知,确保您始终知晓最新情况。
我们将学习哪些 Knative 功能?¶
- Knative 通过 **Apache Camel K** 实现的事件驱动集成,能够连接到 Slack 等第三方服务。
最终交付成果是什么样的?¶
当发送类型为 moderated-comment 且 ce-bad-word-filter 设置为 bad 的 CloudEvent 时,将触发一条消息发送到指定的 Slack 频道。
安装先决条件¶
先决条件 1:安装 Apache Camel-Kamelets¶

使用 官方安装文档 中列出的任何方法在您的集群上安装 Apache Camel K operator。我们将使用 Kustomize 进行安装。
kubectl create ns camel-k && \
kubectl apply -k 'github.com/apache/camel-k/install/overlays/kubernetes/descoped?ref=v2.8.0' --server-side
现在,您需要设置一个带有容器注册表的 IntegrationPlatform。您可以在 官方安装文档 中了解更多信息。对于我们所有的需求,我们只需要创建一个带有容器注册表条目的 IntegrationPlatform CR。例如,假设我们正在使用一个名为 kind-registry、端口为 5000 的本地注册表的 Kind 集群。那么您的 IntegrationPlatform CR 将如下所示:
apiVersion: camel.apache.org/v1
kind: IntegrationPlatform
metadata:
name: camel-k
namespace: camel-k # Make sure this is the namespace where your operator is running
spec:
build:
registry:
address: kind-registry:5000
insecure: true
使用一个命令安装它
cat <<EOF | kubectl apply -f -
apiVersion: camel.apache.org/v1
kind: IntegrationPlatform
metadata:
name: camel-k
namespace: camel-k
spec:
build:
registry:
address: kind-registry:5000
insecure: true
EOF
如果您使用其他容器注册表,您可能需要在 Apache Camel K 的 容器注册表配置文档 中阅读更多内容。
验证
检查 operator 的安装状态
kubectl get deploy -n camel-k
您将看到以下输出
NAME READY UP-TO-DATE AVAILABLE AGE
camel-k-operator 1/1 1 1 47h
以及 IntegrationPlatform
kubectl get integrationplatforms -n camel-k
您将看到包含注册表地址的输出
NAME PHASE BUILD STRATEGY PUBLISH STRATEGY REGISTRY ADDRESS DEFAULT RUNTIME CAMEL VERSION
camel-k Ready routine Jib kind-registry:5000 3.15.3 4.8.5
先决条件 2:创建 Slack 应用并生成传入Webhook URL¶

请按照 此处 的说明创建 Slack 工作区并为您的指定频道生成传入 Webhook URL,通知将发送到该频道。
验证
您应该会获得一个类似以下的 Webhook URL
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
保存此 URL,因为稍后您会用到它。
先决条件 3:创建存储 Slack 凭据的 Secret¶

我们将 Webhook URL 存储为 Secret。将您的 Webhook URL 复制并粘贴到文件 slack-sink/application.properties 中。
slack-sink/application.properties
slack.channel=#bookstore-owner
slack.webhook.url=https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
然后从 start 目录运行以下命令
kubectl create secret generic slack-credentials --from-file=slack-sink/application.properties
验证
如果 Secret 已成功创建,您将看到此消息
secret/slack-credentials created
实施¶
步骤 0:了解 Pipe¶

我们在 Apache Camel K 中使用一种称为 "Pipe"(也称为 KameletBinding)的功能来连接事件源和目标。具体来说,Pipe 将来自我们的 Broker(我们的源)的事件连接到通过 Slack sink Kamelet(我们的目标)的 Slack 频道。

从下面的示例 YAML 中,您可以看到我们正在指示 pipe 过滤类型为“moderated-comment”的事件。Pipe 将在后台创建一个 Trigger,并将您的事件路由到 slack-sink。
apiVersion: camel.apache.org/v1
kind: Pipe
metadata:
name: pipe
spec:
source:
ref:
kind: Broker
apiVersion: eventing.knative.dev/v1
name: badword-broker
properties:
type: moderated-comment
sink:
...
如果您想了解更多信息,请查阅文章 Matthias Weßendorf 撰写的“使用 Apache Camel K 和 Knative Eventing 进行事件源”!
步骤 1:创建 Broker 以将“脏话”评论路由到 Slack¶

在当前使用 Apache Camel K 的实现中,我们**只能根据 CloudEvent 的类型**进行过滤,例如 moderated-comment。目前还不支持根据事件扩展进行过滤,例如 badwordfilter: good。此功能将在 Apache Camel K 的未来更新中提供。但我们仍然可以使用替代方法来实现此目的!

在这里,我们将 bookstore-broker 与一个名为 badword-broker 的新 Broker 连接起来。并且我们将创建一个 Trigger,帮助我们使用扩展 badwordfilter: good 进行过滤。
- 1:创建一个名为
slack-sink/config/100-broker.yaml的新文件并添加以下内容
slack-sink/config/100-broker.yaml
---
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: badword-broker
-
2:应用 YAML 文件
kubectl apply -f slack-sink/config/100-broker.yaml
如果 Broker 创建成功,您将看到此消息
broker.eventing.knative.dev/badword-broker created
或者,使用 Knative CLI kn 创建 broker
kn broker create badword-broker
如果 Broker 创建成功,您将看到此消息
Broker 'badword-broker' successfully created in namespace 'default'.
验证
运行以下命令列出 Brokers
kubectl get brokers
您应该会看到列出的 badword-broker。
NAME URL AGE READY REASON
badword-broker http://broker-ingress.knative-eventing.svc.cluster.local/default/badword-broker 3s True
bookstore-broker http://broker-ingress.knative-eventing.svc.cluster.local/default/bookstore-broker 5h38m True
故障排除
如果出现问题,请使用以下命令进行诊断
kubectl describe broker badword-broker
步骤 2:创建 Trigger 以过滤发送到 badword-broker 的脏话评论¶

我们正在创建 Trigger 来处理类型为 moderated-comment 且扩展为 badwordfilter: bad 的事件,并将它们路由到 badword-broker。
创建 Trigger

- 1:将以下内容附加到您的
slack-sink/config/100-broker.yaml文件中
slack-sink/config/100-broker.yaml
---
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: badword-noti-trigger
spec:
broker: bookstore-broker
filter:
attributes: # Trigger will filter events based on BOTH the type and badwordfilter attribute
type: moderated-comment # This is the filter that will be applied to the event, only events with the ce-type moderated-comment will be processed
badwordfilter: bad # This is the filter that will be applied to the event, only events with the ce-extension badwordfilter: bad will be processed
subscriber:
ref:
apiVersion: eventing.knative.dev/v1
kind: Broker
name: badword-broker
-
2:应用 YAML 文件
kubectl apply -f slack-sink/config/100-broker.yaml如果 Trigger 创建成功,您将看到此消息
broker.eventing.knative.dev/badword-broker unchanged trigger.eventing.knative.dev/badword-noti-trigger created
验证
kubectl get triggers
Trigger badword-noti-trigger 的状态应为 READY 为 True。
NAME BROKER SUBSCRIBER_URI AGE READY REASON
db-insert-trigger bookstore-broker http://node-server-svc.default.svc.cluster.local/insert 5h41m True
seq-reply-trigger bookstore-broker http://event-display.default.svc.cluster.local 5h39m True
sequence-trigger bookstore-broker http://sequence-kn-sequence-0-kn-channel.default.svc.cluster.local 5h39m True
log-trigger bookstore-broker http://event-display.default.svc.cluster.local 5h41m True
badword-noti-triggerbookstore-broker http://broker-ingress.knative-eventing.svc.cluster.local/default/badword-broker 5h41m True
步骤 3:构建 Pipe¶
此设置可在包含“脏话”的新评论发生时自动将通知发送到 Slack,从而简化了信息流。
-
1:确保您已准备好包含 Slack Webhook URL 的 k8s Secret。如果尚未准备好,请参考 先决条件 3 部分。
-
2:准备 Slack sink 的 YAML 配置,它将把事件转发到您的 Slack 频道

创建一个名为 slack-sink/config/100-slack-sink.yaml 的新文件并添加以下内容
slack-sink/config/100-slack-sink.yaml
apiVersion: camel.apache.org/v1
kind: Pipe
metadata:
name: pipe
annotations:
trait.camel.apache.org/mount.configs: "secret:slack-credentials"
spec:
source:
ref:
kind: Broker
apiVersion: eventing.knative.dev/v1
name: badword-broker
properties:
type: moderated-comment
sink:
ref:
kind: Kamelet
apiVersion: camel.apache.org/v1
name: slack-sink
properties:
channel: ${slack.channel}
webhookUrl: ${slack.webhook.url}
- 将配置应用于您的 Kubernetes 集群
kubectl apply -f slack-sink/config/100-slack-sink.yaml
验证
如果配置创建成功,您将看到此消息
pipe.camel.apache.org/pipe created
但此过程需要几秒钟才能完成。您可以通过运行以下命令检查 pipe 的状态
kubectl get pipe pipe
NAME PHASE REPLICAS
pipe Ready 1
步骤 4:修改 Knative Services 以禁用缩放为零¶

在此步骤中,我们将配置通知递送服务,以防止其缩放为零,确保及时通知。
注意
ksvc 代表 Knative Service。
- 检查现有的 Knative Services
kubectl get ksvc
您应该会看到一个名为 pipe 的服务
NAME URL LATESTCREATED LATESTREADY READY REASON
pipe http://pipe.default.svc.cluster.local pipe-00002 pipe-00002 True
- 编辑 Knative Service
为了防止通知服务缩放为零,请将要保持运行的 Pod 的最小数量设置为 1。
kubectl patch ksvc pipe --type merge -p '{"spec":{"template":{"metadata":{"annotations":{"autoscaling.knative.dev/min-scale":"1"}}}}}'
或者使用 edit 命令
kubectl edit ksvc pipe
添加以下注解
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/min-scale: "1"
此配置可确保 Knative 始终至少运行一个服务的实例。
验证
kubectl get pods
定期检查 pipe-deployment Pod 的状态,看看它们是否会消失!如果它们一直存在,那么我们就成功了!
验证¶

现在,您已经完成了示例应用程序的构建。当您提交一个“脏”评论时,您应该会在测试 Slack 工作区中收到通知,从而实现与演示视频中所示的相同结果。
结论¶
在本教程中,您学习了如何使用 Knative Eventing 和 Apache Camel K 设置一个事件驱动的服务,该服务可自动将通知发送到 Slack 频道。通过利用这些技术,您可以无缝地将应用程序连接到第三方服务,并促进它们之间的实时信息交换。
下一步¶

恭喜您成功完成了书店示例应用程序的教程!如果您想加深对 Knative 的理解,可以打开您的书店前端,我们使用的演示书籍是一个很好的起点!请查看 Evan Anderson 的书籍 《Building Serverless Applications on Knative》。

我们已经为现有书店应用程序准备了额外的挑战供您解决。其中一些解决方案已提供,而另一些则留空,以鼓励您探索自己的解决方案。