पिछले लेख में, मैंने कवर किया था कैसे चाकू के साथ एक छोटा सा ऐप बनाने के लिए, जो एक खुला स्रोत परियोजना है जो घटकों को जोड़ता है कुबेरनेट्स तैनात करने, चलाने और प्रबंधन के लिए सर्वरहित, बादल-मूल अनुप्रयोग। इस लेख में, मैं अपने क्लाउड-नेटिव वातावरण में घटनाओं को बनाने, भेजने और सत्यापित करने का एक तरीका, चाकू की घटना को समझाऊंगा।
ईवेंट आपके वातावरण में कई स्रोतों से उत्पन्न हो सकते हैं, और वे प्रबंधन या परिभाषित करने के लिए भ्रमित हो सकते हैं। चूंकि चाकू निम्नानुसार है CloudEvents विनिर्देशन, यह आपको अपने वातावरण के लिए एक सामान्य अमूर्त बिंदु बनाने की अनुमति देता है, जहां घटनाओं को एक विनिर्देश में परिभाषित किया जाता है।
यह आलेख बताता है कि कैसे चाकू चलाने की घटना संस्करण 0.20.0 स्थापित करने और घटनाओं को बनाने, ट्रिगर करने और सत्यापित करने के लिए। क्योंकि इसमें कई चरण शामिल हैं, मेरा सुझाव है कि आप मेरी ओर देखें गिटहब रेपो फ़ाइलों के साथ इस लेख के माध्यम से चलने के लिए।
अपना कॉन्फ़िगरेशन सेट करें
यह वॉकथ्रू उपयोग करता है मिनिक्यूब कुबेरनेट्स के साथ 1.19.0। यह मिनिक्यूब वातावरण में कुछ कॉन्फ़िगरेशन परिवर्तन भी करता है।
मिनिक्यूब पूर्व-विन्यास कमांड:
$ minikube config set kubernetes-version v1.19.0
$ minikube config set memory 4000
$ minikube config set cpus 4
मिनिक्यूब शुरू करने से पहले, सुनिश्चित करें कि आपका कॉन्फ़िगरेशन रहता है और मिनिक्यूब शुरू करने के लिए निम्नलिखित कमांड चलाएं:
$ minikube delete
$ minikube start
चाकू घटना को स्थापित करें
कुबेटेल का उपयोग करके चाकू के आयोजन की कस्टम कस्टम परिभाषा (CRDs) स्थापित करें। निम्नलिखित कमांड और आउटपुट का एक स्निपेट दिखाता है:
$ kubectl apply --filename https://github.com/knative/eventing/releases/download/v0.20.0/eventing-crds.yamlcustomresourcedefinition.apiextensions.k8s.io/apiserversources.sources.knative.dev created
customresourcedefinition.apiextensions.k8s.io/brokers.eventing.knative.dev created
customresourcedefinition.apiextensions.k8s.io/channels.messaging.knative.dev created
customresourcedefinition.apiextensions.k8s.io/triggers.eventing.knative.dev created
अगला, kubectl का उपयोग करके मुख्य घटक स्थापित करें:
$ kubectl apply --filename https://github.com/knative/eventing/releases/download/v0.20.0/eventing-core.yaml
namespace/knative-eventing created
serviceaccount/eventing-controller created
clusterrolebinding.rbac.authorization.k8s.io/eventing-controller created
चूँकि आप Knative Eventing सेवा का एक स्टैंडअलोन संस्करण चला रहे हैं, इसलिए आपको इवेंट्स पास करने के लिए इन-मेमोरी चैनल इंस्टॉल करना होगा। कुब्लेट का उपयोग करना, चलाना:
$ kubectl apply --filename https://github.com/knative/eventing/releases/download/v0.20.0/in-memory-channel.yaml
ब्रोकर स्थापित करें, जो चैनलों का उपयोग करता है और ईवेंट रूटिंग चलाता है:
$ kubectl apply --filename https://github.com/knative/eventing/releases/download/v0.20.0/mt-channel-broker.yaml
clusterrole.rbac.authorization.k8s.io/knative-eventing-mt-channel-broker-controller created
clusterrole.rbac.authorization.k8s.io/knative-eventing-mt-broker-filter created
अगला, एक नाम स्थान बनाएं और उसमें एक छोटा दलाल जोड़ें; यह ब्रोकर ट्रिगर्स के लिए ईवेंट्स रूट करता है। Kubectl का उपयोग करके अपने नाम स्थान बनाएँ:
$ kubectl create namespace eventing-test
namespace/eventing-test created
अब नाम का एक छोटा ब्रोकर बनाएं default
आपके नामस्थान में। निम्नलिखित मेरी से YAML है दलाल फ़ाइल (जो मेरे GitHub रिपॉजिटरी में पाई जा सकती है):
apiVersion: eventing.knative.dev/v1
kind: broker
metadata:
name: default
namespace: eventing-test
फिर kubectl का उपयोग करके अपनी ब्रोकर फ़ाइल लागू करें:
$ kubectl create -f broker.yaml
broker.eventing.knative.dev/default created
सत्यापित करें कि सब कुछ ऊपर और चल रहा है (आपको कमांड चलाने के बाद पुष्टिकरण आउटपुट देखना चाहिए):
$ kubectl -n eventing-test get broker default
NAME URL AGE READY REASON
default http://broker-ingress.knative-eventing.svc.cluster.local/eventing-test/default 3m6s True
ईवेंट भेजने के लिए आपको बाद में ब्रोकर आउटपुट से इस URL की आवश्यकता होगी, इसलिए इसे सहेजें।
ईवेंट उपभोक्ता बनाएं
अब जब सब कुछ स्थापित हो गया है, तो आप ईवेंट के साथ काम करने के लिए घटकों को कॉन्फ़िगर करना शुरू कर सकते हैं।
सबसे पहले, आपको ईवेंट उपभोक्ता बनाने की आवश्यकता है। आप इस walkthrough में दो उपभोक्ता बनाएंगे: नमस्ते-प्रदर्शन तथा अलविदा-प्रदर्शन। दो उपभोक्ता होने से आप यह देख सकते हैं कि प्रति घटना संदेश उपभोक्ता को कैसे लक्षित करें।
हैलो-डिस्प्ले YAML कोड:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-display
spec:
replicas: 1
selector:
matchLabels: &labels
app: hello-display
template:
metadata:
labels: *labels
spec:
containers:
- name: event-display
image: gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display---
kind: Service
apiVersion: v1
metadata:
name: hello-display
spec:
selector:
app: hello-display
ports:
- protocol: TCP
port: 80
targetPort: 8080
अलविदा प्रदर्शन YAML कोड:
apiVersion: apps/v1
kind: Deployment
metadata:
name: goodbye-display
spec:
replicas: 1
selector:
matchLabels: &labels
app: goodbye-display
template:
metadata:
labels: *labels
spec:
containers:
- name: event-display
# Source code: https://github.com/knative/eventing-contrib/tree/master/cmd/event_display
image: gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display---
kind: Service
apiVersion: v1
metadata:
name: goodbye-display
spec:
selector:
app: goodbye-display
ports:
- protocol: TCP
port: 80
targetPort: 8080
दोनों उपभोक्ताओं के बीच YAML में अंतर है app
तथा metadata name
अनुभाग। जबकि दोनों उपभोक्ता एक ही पोर्ट पर हैं, आप किसी ईवेंट को बनाते समय लक्ष्य बना सकते हैं। उपभोक्ताओं को कुबेटेल का उपयोग करके बनाएँ:
$ kubectl -n eventing-test apply -f hello-display.yaml
deployment.apps/hello-display created
service/hello-display created$ kubectl -n eventing-test apply -f goodbye-display.yaml
deployment.apps/goodbye-display created
service/goodbye-display created
यह सुनिश्चित करने के लिए जांचें कि आपके द्वारा YAML फ़ाइलों को लागू करने के बाद तैनाती चल रही है:
$ kubectl -n eventing-test get deployments hello-display goodbye-display
NAME READY UP-TO-DATE AVAILABLE AGE
hello-display 1/1 1 1 2m4s
goodbye-display 1/1 1 1 34s
ट्रिगर बनाएं
अब, आपको ट्रिगर्स बनाने की आवश्यकता है, जो उन घटनाओं को परिभाषित करता है जो उपभोक्ता प्राप्त करता है। आप अपने क्लाउड ईवेंट से किसी भी फ़िल्टर का उपयोग करने के लिए ट्रिगर्स को परिभाषित कर सकते हैं। ब्रोकर ट्रिगर से घटनाओं को प्राप्त करता है और घटनाओं को सही उपभोक्ता को भेजता है। उदाहरणों का यह सेट विभिन्न परिभाषाओं के साथ दो ट्रिगर बनाता है। उदाहरण के लिए, आप घटनाओं को विशेषता प्रकार के साथ भेज सकते हैं greeting
तक hello-display
उपभोक्ता।
अभिवादन-ट्रिगर। श्याम कोड:
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: hello-display
spec:
broker: default
filter:
attributes:
type: greeting
subscriber:
ref:
apiVersion: v1
kind: Service
name: hello-display
पहला ट्रिगर बनाने के लिए, अपनी YAML फाइल लागू करें:
$ kubectl -n eventing-test apply -f greeting-trigger.yaml
trigger.eventing.knative.dev/hello-display created
अगला, उपयोग करके दूसरा ट्रिगर बनाएं sendoff-trig.yaml। यह विशेषता के साथ कुछ भी भेजता है source sendoff
तुम्हारा को goodbye-display
उपभोक्ता।
Sendoff- ट्रिगर.ऑम कोड:
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: goodbye-display
spec:
broker: default
filter:
attributes:
source: sendoff
subscriber:
ref:
apiVersion: v1
kind: Service
name: goodbye-display
अगला, क्लस्टर में अपनी दूसरी ट्रिगर परिभाषा लागू करें:
$ kubectl -n eventing-test apply -f sendoff-trigger.yaml
trigger.eventing.knative.dev/goodbye-display created
Kubectl का उपयोग करके क्लस्टर से अपने ट्रिगर्स प्राप्त करके सब कुछ सही ढंग से पुष्टि करें:
$ kubectl -n eventing-test get triggers
NAME BROKER SUBSCRIBER_URI AGE READY
goodbye-display default http://goodbye-display.eventing-test.svc.cluster.local/ 24s True
hello-display default http://hello-display.eventing-test.svc.cluster.local/ 46s True
एक घटना निर्माता बनाएँ
एक पॉड बनाएं जिसका उपयोग आप ईवेंट भेजने के लिए कर सकते हैं। यह आपके लिए कर्ल और एसएसएच एक्सेस के साथ एक साधारण पॉड परिनियोजन है कर्ल का उपयोग करके घटनाओं को भेजें। चूँकि ब्रोकर को क्लस्टर के अंदर से ही एक्सेस किया जा सकता है, जहाँ Knative ईवेंटिंग स्थापित है, पॉड को क्लस्टर में होना चाहिए; यह क्लस्टर में ईवेंट भेजने का एकमात्र तरीका है। उपयोग घटना-निर्माता इस कोड के साथ फाइल करें:
apiVersion: v1
kind: Pod
metadata:
labels:
run: curl
name: curl
spec:
containers:
- image: radial/busyboxplus:curl
imagePullPolicy: IfNotPresent
name: curl
resources: {}
stdin: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
tty: true
अगला, kubectl का उपयोग करके फली को तैनात करें:
$ kubectl -n eventing-test apply -f event-producer.yaml
pod/curl created
सत्यापित करने के लिए, परिनियोजन प्राप्त करें और सुनिश्चित करें कि फली ऊपर और चल रही है:
$ kubectl get pods -n eventing-test
NAME READY STATUS RESTARTS AGE
curl 1/1 Running 0 8m13s
कुछ कार्यक्रम भेजें
चूंकि यह लेख इतना विन्यास-भारी रहा है, मुझे लगता है कि आप अंत में कुछ घटनाओं को भेजने और अपनी सेवाओं का परीक्षण करने में सक्षम होने के लिए खुश होंगे। घटनाओं को क्लस्टर में आंतरिक रूप से पारित किया जाना है। आमतौर पर, घटनाओं को क्लस्टर के आंतरिक अनुप्रयोगों के आसपास परिभाषित किया जाता है और उन अनुप्रयोगों से आते हैं। लेकिन यह उदाहरण मैन्युअल रूप से आपके पॉड नाम की घटनाओं को भेजेगा कर्ल।
फली में प्रवेश करके शुरू करें:
$ kubectl -n eventing-test attach curl -it
एक बार लॉग इन करने के बाद, आपको आउटपुट समान दिखाई देगा:
Defaulting container name to curl.
Use 'kubectl describe pod/curl -n eventing-test' to see all of the containers in this pod.
If you don't see a command prompt, try pressing enter.
[ root@curl:/ ]$
अब, कर्ल का उपयोग करके एक घटना उत्पन्न करें। इसे कुछ अतिरिक्त परिभाषाओं की आवश्यकता है और स्थापना के दौरान उत्पन्न ब्रोकर URL की आवश्यकता होती है। यह उदाहरण दलाल को अभिवादन भेजता है:
curl -v "http://broker-ingress.knative-eventing.svc.cluster.local/eventing-test/default"
-X POST
-H "Ce-Id: say-hello"
-H "Ce-Specversion: 1.0"
-H "Ce-Type: greeting"
-H "Ce-Source: not-sendoff"
-H "Content-Type: application/json"
-d '{"msg":"Hello Knative!"}'
Ce
CloudEvent के लिए छोटा है, जो है मानकीकृत CloudEvents विनिर्देशन कि चाकू निम्नानुसार है। आपको ईवेंट आईडी भी जानना होगा (यह सत्यापित करने के लिए उपयोगी है कि यह डिलीवर किया गया है), प्रकार, स्रोत (जिसे यह निर्दिष्ट करना होगा कि यह एक नहीं है sendoff
ताकि यह प्रेषक ट्रिगर में परिभाषित स्रोत पर न जाए), और एक संदेश।
जब आप कमांड चलाते हैं, तो यह आउटपुट होना चाहिए (और आपको प्राप्त करना चाहिए 202 स्वीकार किए जाते हैं प्रतिक्रिया):
> POST /eventing-test/default HTTP/1.1
> User-Agent: curl/7.35.0
> Host: broker-ingress.knative-eventing.svc.cluster.local
> Accept: */*
> Ce-Id: say-hello
> Ce-Specversion: 1.0
> Ce-Type: greeting
> Ce-Source: not-sendoff
> Content-Type: application/json
> Content-Length: 24
>
< HTTP/1.1 202 Accepted
< Date: Sun, 24 Jan 2021 22:25:25 GMT
< Content-Length: 0
202 का मतलब है कि ट्रिगर ने इसे भेजा है नमस्ते-प्रदर्शन उपभोक्ता (परिभाषा के कारण)
इसके बाद, दूसरी परिभाषा भेजें अलविदा-प्रदर्शन इस नए कर्ल कमांड के साथ उपभोक्ता:
curl -v "http://broker-ingress.knative-eventing.svc.cluster.local/eventing-test/default"
-X POST
-H "Ce-Id: say-goodbye"
-H "Ce-Specversion: 1.0"
-H "Ce-Type: not-greeting"
-H "Ce-Source: sendoff"
-H "Content-Type: application/json"
-d '{"msg":"Goodbye Knative!"}'
इस समय, यह एक है sendoff
और पिछले सेटअप अनुभाग की ट्रिगर परिभाषा के आधार पर अभिवादन नहीं। इसे निर्देशित किया जाता है अलविदा-प्रदर्शन उपभोक्ता।
आपका आउटपुट इस तरह दिखना चाहिए, एक और 202 के साथ:
> POST /eventing-test/default HTTP/1.1
> User-Agent: curl/7.35.0
> Host: broker-ingress.knative-eventing.svc.cluster.local
> Accept: */*
> Ce-Id: say-goodbye
> Ce-Specversion: 1.0
> Ce-Type: not-greeting
> Ce-Source: sendoff
> Content-Type: application/json
> Content-Length: 26
>
< HTTP/1.1 202 Accepted
< Date: Sun, 24 Jan 2021 22:33:00 GMT
< Content-Length: 0
बधाई हो, आपने दो कार्यक्रम भेजे!
अगले अनुभाग पर जाने से पहले, फली को टाइप करके बाहर निकलें बाहर जाएं।
घटनाओं का सत्यापन करें
अब जब घटनाओं को भेज दिया गया है, तो आप कैसे जानते हैं कि सही उपभोक्ताओं ने उन्हें प्राप्त किया? प्रत्येक उपभोक्ता के पास जाकर लॉग्स में इसकी पुष्टि करता है।
से शुरू करें नमस्ते-प्रदर्शन उपभोक्ता::
$ kubectl -n eventing-test logs -l app=hello-display --tail=100
इस उदाहरण क्लस्टर में बहुत कुछ नहीं चल रहा है, इसलिए आपको केवल एक घटना देखनी चाहिए:
☁️ cloudevents.Event
Validation: valid
Context Attributes,
specversion: 1.0
type: greeting
source: not-sendoff
id: say-hello
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-01-24T22:25:25.760867793Z
Data,
{
"msg": "Hello Knative!"
}
आपने पुष्टि की है नमस्ते-प्रदर्शन उपभोक्ता को घटना की सूचना मिली! अब जाँच करें अलविदा-प्रदर्शन उपभोक्ता और सुनिश्चित करें कि दूसरे संदेश ने इसे बनाया है।
उसी कमांड को चलाकर शुरू करें लेकिन साथ में अलविदा-प्रदर्शन:
$ kubectl -n eventing-test logs -l app=goodbye-display --tail=100
☁️ cloudevents.Event
Validation: valid
Context Attributes,
specversion: 1.0
type: not-greeting
source: sendoff
id: say-goodbye
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-01-24T22:33:00.515716701Z
Data,
{
"msg": "Goodbye Knative!"
}
ऐसा लगता है कि दोनों घटनाओं ने इसे उनके उचित स्थानों पर बनाया है। बधाई हो – आपने आधिकारिक तौर पर चाकू से चलने वाले आयोजन के साथ काम किया है!
बोनस दौर: कई उपभोक्ताओं को एक घटना भेजें
इसलिए आपने कर्ल का उपयोग करके प्रत्येक उपभोक्ता को ईवेंट भेजे, लेकिन क्या होगा यदि आप दोनों उपभोक्ताओं को इवेंट भेजना चाहते हैं? यह एक समान कर्ल कमांड का उपयोग करता है लेकिन कुछ दिलचस्प बदलावों के साथ। पिछले ट्रिगर्स में, प्रत्येक को एक अलग विशेषता के साथ परिभाषित किया गया था। ग्रीटिंग ट्रिगर में विशेषता थी type
और sendoff ट्रिगर में विशेषता थी source
। इसका मतलब है कि आप कर्ल कॉल कर सकते हैं और इसे दोनों उपभोक्ताओं को भेज सकते हैं।
यहां दोनों उपभोक्ताओं को एक घटना भेजने के लिए परिभाषा का एक कर्ल उदाहरण दिया गया है:
curl -v "http://broker-ingress.knative-eventing.svc.cluster.local/eventing-test/default"
-X POST
-H "Ce-Id: say-hello-goodbye"
-H "Ce-Specversion: 1.0"
-H "Ce-Type: greeting"
-H "Ce-Source: sendoff"
-H "Content-Type: application/json"
-d '{"msg":"Hello Knative! Goodbye Knative!"}'
जैसा कि आप देख सकते हैं, इस कर्ल कमांड की परिभाषा सेट करने के लिए बदल गई है source
के लिये अलविदा-प्रदर्शन और यह type
के लिये नमस्ते-प्रदर्शन।
यहां नमूना नमूना है कि घटनाओं को देखने के बाद वे क्या भेजते हैं।
भेजे जा रहे इवेंट का आउटपुट:
> POST /eventing-test/default HTTP/1.1
> User-Agent: curl/7.35.0
> Host: broker-ingress.knative-eventing.svc.cluster.local
> Accept: */*
> Ce-Id: say-hello-goodbye
> Ce-Specversion: 1.0
> Ce-Type: greeting
> Ce-Source: sendoff
> Content-Type: application/json
> Content-Length: 41
>
< HTTP/1.1 202 Accepted
< Date: Sun, 24 Jan 2021 23:04:15 GMT
< Content-Length: 0
हैलो-डिस्प्ले का आउटपुट (दो इवेंट दिखा रहा है):
$ kubectl -n eventing-test logs -l app=hello-display --tail=100
☁️ cloudevents.Event
Validation: valid
Context Attributes,
specversion: 1.0
type: greeting
source: not-sendoff
id: say-hello
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-01-24T22:25:25.760867793Z
Data,
{
"msg": "Hello Knative!"
}
☁️ cloudevents.Event
Validation: valid
Context Attributes,
specversion: 1.0
type: greeting
source: sendoff
id: say-hello-goodbye
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-01-24T23:04:15.036352685Z
Data,
{
"msg": "Hello Knative! Goodbye Knative!"
}
अलविदा प्रदर्शन का उत्पादन (दो घटनाओं के साथ):
$ kubectl -n eventing-test logs -l app=goodbye-display --tail=100
☁️ cloudevents.Event
Validation: valid
Context Attributes,
specversion: 1.0
type: not-greeting
source: sendoff
id: say-goodbye
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-01-24T22:33:00.515716701Z
Data,
{
"msg": "Goodbye Knative!"
}
☁️ cloudevents.Event
Validation: valid
Context Attributes,
specversion: 1.0
type: greeting
source: sendoff
id: say-hello-goodbye
datacontenttype: application/json
Extensions,
knativearrivaltime: 2021-01-24T23:04:15.036352685Z
Data,
{
"msg": "Hello Knative! Goodbye Knative!"
}
जैसा कि आप देख सकते हैं, इवेंट आपकी कर्ल परिभाषा के आधार पर दोनों उपभोक्ताओं के पास गया। यदि किसी घटना को एक से अधिक स्थानों पर भेजा जाना है, तो आप इसे एक से अधिक उपभोक्ताओं को भेजने के लिए परिभाषा लिख सकते हैं।
इसे आज़माइए!
यदि आपकी पसंद का कोई पूर्वनिर्धारित स्थान पर जा रहा है, तो क्लाउड ईवेंट में आंतरिक ईवेंट ट्रैक करना बहुत आसान है। यह देखने का आनंद लें कि आप अपने क्लस्टर में कितनी दूर तक जा सकते हैं!