Slack 接收器 - 学习 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 CLI¶
在您的本地计算机上安装 Apache Camel K CLI (kamel
)。您可以在这里找到安装说明 这里。
疑难解答
如果安装后您运行 kamel version
并收到错误消息,您可能需要将 kamel
二进制文件添加到系统的 PATH。您可以通过将 kamel
二进制文件移动到 PATH 中已有的目录或将 kamel
所在的目录添加到 PATH 来实现此目的。
$ export PATH=$PATH:<path-to-kamel-binary>
先决条件 2:安装 Apache Camel-Kamelets¶
接下来,使用 Apache Camel K CLI 在您的集群上安装 Apache Camel K
$ kamel install --registry docker.io --organization <your-organization> --registry-auth-username <your-username> --registry-auth-password <your-password>
用您的实际 Docker 注册表信息替换占位符。
如果您使用的是其他容器注册表,您可能需要阅读更多 这里 了解安装。
验证
如果安装成功,您将看到此消息
📦 OLM is not available in the cluster. Fallback to regular installation.
🐪 Camel K installed in namespace default
先决条件 3:创建 Slack 应用程序并生成传入 Webhook URL¶
按照说明 这里 了解如何创建 Slack 工作区并为将接收通知的指定频道生成传入 Webhook URL。
验证
您应该有一个类似于此的 Webhook URL
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
保存此 URL,因为您稍后将需要它。
先决条件 4:创建存储 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
然后运行以下命令在 /slack-sink
目录中创建 Secret
kubectl create secret generic slack-credentials --from-file=application.properties
验证
如果 Secret 成功创建,您应该会看到此消息
secret/slack-credentials created
实现¶
步骤 0:了解管道¶
我们在 Apache Camel K 中使用了一个称为 "管道"(又名 KameletBinding)的功能来链接事件源和目标。具体来说,管道将来自我们的 Broker(我们的源)的事件通过 Slack 接收器 Kamelet(我们的目标)连接到 Slack 频道。
从下面的示例 YAML 中,您可以看到我们正在告诉管道过滤类型为 "moderated-comment" 的事件。管道将在幕后创建一个 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:创建可以将 "脏话" 评论路由到 Slack 的 Broker¶
在当前使用 Apache Camel K 的实现中,我们 只能根据 CloudEvent 的类型进行过滤,例如 moderated-comment。无法根据事件扩展进行过滤,例如 badwordfilter: good
。此功能将在 Apache Camel K 的未来更新中提供。但我们仍然可以使用其他方法来实现此目的!
在这里,我们将 book-review-broker
连接到一个名为 badword-broker
的新 Broker。我们将创建一个 Trigger 来帮助我们使用扩展名 badwordfilter: good
执行过滤。
- 1:将以下内容追加到您的
node-server/config/200-broker.yaml
node-server/config/200-broker.yaml
---
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: badword-broker
-
2:应用 YAML 文件
kubectl apply -f 200-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'.
验证
运行以下命令列出 Broker
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:创建将“脏话”评论过滤到 badword-broker 的 Trigger¶
我们正在创建 Trigger 来处理类型为 moderated-comment 的事件,以及扩展名 badwordfilter: bad
的事件,并将它们路由到 badword-broker。
创建 Trigger
- 1:创建一个名为
node-server/config/badword-noti-trigger.yaml
的新 YAML 文件,并添加以下内容
node-server/config/badword-noti-trigger.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 node-server/config/badword-noti-trigger.yaml
如果 Trigger 成功创建,您应该会看到此消息
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:构建管道¶
此设置会在每次出现包含“脏话”的新评论时自动将通知发送到 Slack,从而简化信息流。
-
1:确保您已经准备好了包含 Slack Webhook URL 的 k8s Secret。如果没有,请参阅 先决条件 3 部分。
-
2:准备 Slack 接收器的 YAML 配置,该接收器会将事件转发到您的 Slack 频道
创建一个名为 slack-sink/config/slack-sink.yaml
的新文件,并添加以下内容
slack-sink/config/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: bad-word-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/slack-sink.yaml
验证
如果配置成功创建,您将看到此消息
pipe.camel.apache.org/slack-sink-pipe created
但这将需要几秒钟才能完成。您可以通过运行以下命令来检查管道的状态
$ kubectl get pipe slack-sink-pipe
NAME PHASE REPLICAS
slack-sink-pipe Ready 1
步骤 4:修改 Knative 服务以禁用缩放到零¶
在此步骤中,我们将配置通知传递服务以防止它 缩放到零,确保及时收到通知。
注意
ksvc
代表 Knative 服务。
- 检查现有 Knative 服务
$ kubectl get ksvc
您应该会看到一个名为 pipe
的服务列出
NAME URL LATESTCREATED LATESTREADY READY REASON
pipe http://pipe.default.svc.cluster.local pipe-00002 pipe-00002 True
- 编辑 Knative 服务
要防止通知服务缩放到零,请设置要保持运行的 Pod 的最小数量。
$ 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 的理解,请打开您的书店前端,我们使用的演示书籍是一个很好的起点!查看书籍"在 Knative 上构建无服务器应用程序" 由 Evan Anderson 撰写。
我们为您准备了额外的挑战,这些挑战建立在现有的书店应用程序之上,供您尝试。提供了一些解决方案,而另一些则保持开放,以鼓励您探索自己的解决方案。