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 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:了解 Pipe¶
我們使用 Apache Camel K 中稱為 "Pipe" (又名 KameletBinding) 的功能,將事件來源和目的地連結起來。具體而言,Pipe 會將來自我們 Broker (我們的來源) 的事件,透過 Slack sink Kamelet (我們的目的地) 連線到 Slack 頻道。
從下面的範例 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¶
在目前使用 Apache Camel K 的實作中,我們只能根據 CloudEvent 的類型進行篩選,例如 moderated-comment。尚未支援根據事件擴充功能進行篩選,例如 badwordfilter: good
。此功能將在未來 Apache Camel K 的更新版本中提供。但我們仍然可以使用替代方法來實現此目的!
在這裡,我們將把 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¶
我們正在建立觸發器,以處理類型為 moderated-comment 的事件,以及擴充功能 badwordfilter: bad
,並將它們路由到 badword-broker。
建立觸發器
- 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-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/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 的理解,請開啟您的書店前端,我們使用的示範書籍是一個很好的起點!請查看 Evan Anderson 的書籍 "Building Serverless Applications on Knative"。
我們準備了額外的挑戰,這些挑戰建立在現有的書店應用程式之上,供您解決。提供了一些解決方案,而其他的則保持開放,以鼓勵您探索自己的解決方案。