跳至内容

Slack 接收器 - 学习 Knative Eventing 和 Apache Camel K 集成

image

作为一家书店老板,您希望在客户提交新的评论时在 Slack 频道中立即收到通知。通过利用 Knative Eventing 和 Apache Camel K,您可以设置一个事件驱动服务来自动执行这些通知,确保您始终了解情况。

我们将学习哪些 Knative 功能?

  • Knative 通过使用 Apache Camel K 进行事件驱动集成来连接第三方服务(例如 Slack)的能力。

最终的可交付成果是什么样的?

当发送类型为 moderated-commentce-bad-word-filter 设置为 bad 的 CloudEvent 时,它会触发将消息发送到指定的 Slack 频道。

安装先决条件

先决条件 1:安装 Apache Camel CLI

image

在您的本地计算机上安装 Apache Camel K CLI (kamel)。您可以在这里找到安装说明 这里

疑难解答

如果安装后您运行 kamel version 并收到错误消息,您可能需要将 kamel 二进制文件添加到系统的 PATH。您可以通过将 kamel 二进制文件移动到 PATH 中已有的目录或将 kamel 所在的目录添加到 PATH 来实现此目的。

$ export PATH=$PATH:<path-to-kamel-binary>

先决条件 2:安装 Apache Camel-Kamelets

image

接下来,使用 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

image

按照说明 这里 了解如何创建 Slack 工作区并为将接收通知的指定频道生成传入 Webhook URL。

验证

您应该有一个类似于此的 Webhook URL

https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX

保存此 URL,因为您稍后将需要它。

先决条件 4:创建存储 Slack 凭据的 Secret

image

我们将 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:了解管道

image

我们在 Apache Camel K 中使用了一个称为 "管道"(又名 KameletBinding)的功能来链接事件源和目标。具体来说,管道将来自我们的 Broker(我们的源)的事件通过 Slack 接收器 Kamelet(我们的目标)连接到 Slack 频道。

image

从下面的示例 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

image

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

image

在这里,我们将 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

image

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

创建 Trigger

image

  • 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-triggerREADY 状态应为 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 频道

image

创建一个名为 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}
  1. 将配置应用到您的 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 服务以禁用缩放到零

image

在此步骤中,我们将配置通知传递服务以防止它 缩放到零,确保及时收到通知。

注意

ksvc 代表 Knative 服务

  1. 检查现有 Knative 服务
$ kubectl get ksvc

您应该会看到一个名为 pipe 的服务列出

NAME     URL                                         LATESTCREATED   LATESTREADY    READY   REASON
pipe     http://pipe.default.svc.cluster.local       pipe-00002      pipe-00002     True
  1. 编辑 Knative 服务

要防止通知服务缩放到零,请设置要保持运行的 Pod 的最小数量。

$ kubectl edit ksvc pipe

添加以下批注

spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/min-scale: "1"

此配置确保 Knative 将始终保持至少一个服务的实例在运行。

验证
$ kubectl get pods

定期检查 pipe-deployment Pod 的状态,看看它们是否会消失!如果它们还在那里,那么我们就可以了!

验证

image

现在,您已经完成了示例应用程序的构建。当您提交评论时,您应该始终在您的测试 Slack 工作区中收到通知,从而实现与演示视频中相同的結果。

结论

在本教程中,您学习了如何设置一个事件驱动的服务,该服务使用 Knative Eventing 和 Apache Camel K 自动将通知发送到 Slack 频道。通过利用这些技术,您可以无缝地将您的应用程序连接到第三方服务,并促进它们之间实时信息的交换。

下一步

image

恭喜您成功完成书店示例应用程序教程!如果您想加深对 Knative 的理解,请打开您的书店前端,我们使用的演示书籍是一个很好的起点!查看书籍"在 Knative 上构建无服务器应用程序" 由 Evan Anderson 撰写。

image

我们为您准备了额外的挑战,这些挑战建立在现有的书店应用程序之上,供您尝试。提供了一些解决方案,而另一些则保持开放,以鼓励您探索自己的解决方案。

前往额外挑战

我们使用分析和 Cookie 来了解网站流量。关于您使用我们网站的信息将与 Google 共享,以实现该目的。 了解更多。