跳至內容

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 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:了解 Pipe

image

我們使用 Apache Camel K 中稱為 "Pipe" (又名 KameletBinding) 的功能,將事件來源和目的地連結起來。具體而言,Pipe 會將來自我們 Broker (我們的來源) 的事件,透過 Slack sink Kamelet (我們的目的地) 連線到 Slack 頻道。

image

從下面的範例 YAML 中,您可以看到我們正在告訴 pipe 篩選類型為 "moderated-comment" 的事件。Pipe 將在底層建立一個觸發器,並將您的事件路由到 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 連接起來。我們將建立一個觸發器,以協助我們使用擴充功能 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

image

我們正在建立觸發器,以處理類型為 moderated-comment 的事件,以及擴充功能 badwordfilter: bad,並將它們路由到 badword-broker。

建立觸發器

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.eventing.knative.dev/badword-noti-trigger created
    
驗證
kubectl get triggers

觸發器 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:建置 Pipe

此設定會在發生包含「不雅字詞」的新評論時自動將通知傳送到 Slack,從而簡化資訊流。

  • 1:請確保您已準備好包含 Slack Webhook URL 的 k8s secret。如果沒有,請參閱必要條件 3 章節。

  • 2:準備 Slack sink 的 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 的理解,請開啟您的書店前端,我們使用的示範書籍是一個很好的起點!請查看 Evan Anderson 的書籍 "Building Serverless Applications on Knative"

image

我們準備了額外的挑戰,這些挑戰建立在現有的書店應用程式之上,供您解決。提供了一些解決方案,而其他的則保持開放,以鼓勵您探索自己的解決方案。

前往額外挑戰

我們使用分析和 Cookie 來了解網站流量。您使用我們網站的資訊會與 Google 分享,用於該目的。了解更多。