跳到内容

Slack sink - 学习 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-Kamelets

image

使用 官方安装文档 中列出的任何方法在您的集群上安装 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

image

请按照 此处 的说明创建 Slack 工作区并为您的指定频道生成传入 Webhook URL,通知将发送到该频道。

验证

您应该会获得一个类似以下的 Webhook URL

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

保存此 URL,因为稍后您会用到它。

先决条件 3:创建存储 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

然后从 start 目录运行以下命令

kubectl create secret generic slack-credentials --from-file=slack-sink/application.properties
验证

如果 Secret 已成功创建,您将看到此消息

secret/slack-credentials created

实施

步骤 0:了解 Pipe

image

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

image

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

image

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

image

在这里,我们将 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 的脏话评论

image

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

创建 Trigger

image

  • 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 的状态应为 READYTrue

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 频道

image

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

image

在此步骤中,我们将配置通知递送服务,以防止其缩放为零,确保及时通知。

注意

ksvc 代表 Knative Service

  1. 检查现有的 Knative Services
kubectl get ksvc

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

NAME     URL                                         LATESTCREATED   LATESTREADY    READY   REASON
pipe     http://pipe.default.svc.cluster.local       pipe-00002      pipe-00002     True
  1. 编辑 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 的状态,看看它们是否会消失!如果它们一直存在,那么我们就成功了!

验证

image

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

结论

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

下一步

image

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

image

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

转到附加挑战

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。