5.2. 이벤트 소스
5.2.1. 이벤트 소스
Knative 이벤트 소스는 클라우드 이벤트를 생성하거나 가져오는 모든 Kubernetes 오브젝트일 수 있으며sink라는 다른 엔드포인트로 해당 이벤트를 릴레이할 수 있습니다. 이벤트에 대응하는 분산 시스템을 개발하는 데 소싱 이벤트가 중요합니다.
OpenShift Container Platform 웹 콘솔의 개발자 화면, Knative(kn
) CLI 또는 YAML 파일을 적용하여 Knative 이벤트 소스를 생성 및 관리할 수 있습니다.
현재 OpenShift Serverless에서는 다음 이벤트 소스 유형을 지원합니다.
- API 서버 소스
- Kubernetes API 서버 이벤트를 Knative로 가져옵니다. API 서버 소스는 Kubernetes 리소스가 생성, 업데이트 또는 삭제될 때마다 새 이벤트를 전송합니다.
- ping 소스
- 지정된 cron 일정에 고정된 페이로드를 사용하여 이벤트를 생성합니다.
- Kafka 이벤트 소스
- Kafka 클러스터를 이벤트 소스로 싱크에 연결합니다.
사용자 지정 이벤트 소스를 생성할 수도 있습니다.
5.2.2. 관리자 관점에서 이벤트 소스
이벤트에 대응하는 분산 시스템을 개발하는 데 소싱 이벤트가 중요합니다.
5.2.2.1. 관리자 화면을 사용하여 이벤트 소스 생성
Knative 이벤트 소스는 클라우드 이벤트를 생성하거나 가져오는 모든 Kubernetes 오브젝트일 수 있으며 해당 이벤트를 싱크 라는 다른 끝점으로 중계할 수 있습니다.
사전 요구 사항
- OpenShift Serverless Operator 및 Knative Eventing이 OpenShift Container Platform 클러스터에 설치되어 있습니다.
- 웹 콘솔에 로그인한 후 관리자 화면에 있습니다.
- OpenShift Container Platform에 대한 클러스터 관리자 권한이 있습니다.
절차
-
OpenShift Container Platform 웹 콘솔의 관리자 화면에서 Serverless
Eventing으로 이동합니다. - 생성 목록에서 이벤트 소스를 선택합니다. 그러면 이벤트 소스 페이지로 이동합니다.
- 생성할 이벤트 소스 유형을 선택합니다.
5.2.3. API 서버 소스 생성
API 서버 소스는 Knative 서비스와 같은 이벤트 싱크를 Kubernetes API 서버에 연결하는 데 사용할 수 있는 이벤트 소스입니다. API 서버 소스는 Kubernetes 이벤트를 조사하고 해당 이벤트를 Knative Eventing 브로커에 전달합니다.
5.2.3.1. 웹 콘솔을 사용하여 API 서버 소스 생성
Knative Eventing이 클러스터에 설치되면 웹 콘솔을 사용하여 API 서버 소스를 생성할 수 있습니다. OpenShift Container Platform 웹 콘솔을 사용하면 간소화되고 직관적인 사용자 인터페이스가 제공되므로 이벤트 소스를 생성할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 웹 콘솔에 로그인했습니다.
- OpenShift Serverless Operator 및 Knative Eventing이 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
-
OpenShift CLI(
oc
)가 설치되어 있습니다.
기존 서비스 계정을 다시 사용하려면 새 리소스를 생성하는 대신 필요한 권한을 포함하도록 기존 ServiceAccount
리소스를 수정할 수 있습니다.
이벤트 소스에 대한 서비스 계정, 역할, 역할 바인딩을 YAML 파일로 만듭니다.
apiVersion: v1 kind: ServiceAccount metadata: name: events-sa namespace: default 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: event-watcher namespace: default 2 rules: - apiGroups: - "" resources: - events verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: k8s-ra-event-watcher namespace: default 3 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: event-watcher subjects: - kind: ServiceAccount name: events-sa namespace: default 4
YAML 파일을 적용합니다.
$ oc apply -f <filename>
-
개발자 화면에서 +추가
이벤트 소스로 이동합니다. 이벤트 소스 페이지가 표시됩니다. - 선택 사항: 이벤트 소스에 대한 공급자가 여러 개인 경우 공급자 목록에서 필요한 공급자를 선택하여 해당 공급자의 사용 가능한 이벤트 소스를 필터링합니다.
- ApiServerSource를 선택한 다음 이벤트 소스 생성을 클릭합니다. 이벤트 소스 생성 페이지가 표시됩니다.
양식 보기 또는 YAML 보기를 사용하여 ApiServerSource 설정을 구성합니다.
참고양식 보기와 YAML 보기를 전환할 수 있습니다. 다른 보기로 전환해도 데이터는 유지됩니다.
-
APIVERSION으로
v1
을, KIND로Event
를 입력합니다. - 생성한 서비스 계정의 서비스 계정 이름을 선택합니다.
- 이벤트 소스로 싱크를 선택합니다. 싱크는 채널, 브로커 또는 서비스와 같은 리소스이거나 URI일 수 있습니다.
-
APIVERSION으로
- 생성을 클릭합니다.
검증
API 서버 소스를 생성한 후에는 토폴로지 보기에서 싱크된 서비스에 연결된 것을 확인할 수 있습니다.
URI 싱크를 사용하는 경우 URI 싱크
API 서버 소스 삭제
- 토폴로지 보기로 이동합니다.
API 서버 소스를 마우스 오른쪽 버튼으로 클릭하고 ApiServerSource 삭제를 선택합니다.
5.2.3.2. Knative CLI를 사용하여 API 서버 소스 생성
kn source apiserver create
명령을 사용하여 kn
CLI를 사용하여 API 서버 소스를 생성할 수 있습니다. kn
CLI를 사용하여 API 서버 소스를 생성하면 YAML 파일을 직접 수정하는 것보다 더 효율적이고 직관적인 사용자 인터페이스가 제공됩니다.
사전 요구 사항
- OpenShift Serverless Operator 및 Knative Eventing이 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
-
OpenShift CLI(
oc
)가 설치되어 있습니다. -
Knative(
kn
) CLI가 설치되어 있습니다.
기존 서비스 계정을 다시 사용하려면 새 리소스를 생성하는 대신 필요한 권한을 포함하도록 기존 ServiceAccount
리소스를 수정할 수 있습니다.
이벤트 소스에 대한 서비스 계정, 역할, 역할 바인딩을 YAML 파일로 만듭니다.
apiVersion: v1 kind: ServiceAccount metadata: name: events-sa namespace: default 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: event-watcher namespace: default 2 rules: - apiGroups: - "" resources: - events verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: k8s-ra-event-watcher namespace: default 3 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: event-watcher subjects: - kind: ServiceAccount name: events-sa namespace: default 4
YAML 파일을 적용합니다.
$ oc apply -f <filename>
이벤트 싱크가 있는 API 서버 소스를 생성합니다. 다음 예에서 싱크는 브로커입니다.
$ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
API 서버 소스가 올바르게 설정되었는지 확인하려면 수신되는 메시지를 로그로 덤프하는 Knative 서비스를 생성합니다.
$ kn service create <service_name> --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
브로커를 이벤트 싱크로 사용한 경우
default
브로커의 이벤트를 서비스에 필터링하는 트리거를 생성합니다.$ kn trigger create <trigger_name> --sink ksvc:<service_name>
기본 네임스페이스에서 Pod를 시작하여 이벤트를 생성합니다.
$ oc create deployment hello-node --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
생성된 출력을 다음 명령으로 검사하여 컨트롤러가 올바르게 매핑되는지 확인합니다.
$ kn source apiserver describe <source_name>
출력 예
Name: mysource Namespace: default Annotations: sources.knative.dev/creator=developer, sources.knative.dev/lastModifier=developer Age: 3m ServiceAccountName: events-sa Mode: Resource Sink: Name: default Namespace: default Kind: Broker (eventing.knative.dev/v1) Resources: Kind: event (v1) Controller: false Conditions: OK TYPE AGE REASON ++ Ready 3m ++ Deployed 3m ++ SinkProvided 3m ++ SufficientPermissions 3m ++ EventTypesProvided 3m
검증
메시지 덤퍼 기능 로그를 확인하면 Kubernetes 이벤트가 Knative로 전송되었는지 확인할 수 있습니다.
Pod를 가져옵니다.
$ oc get pods
Pod의 메시지 덤퍼 기능 로그를 확인합니다.
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.apiserver.resource.update datacontenttype: application/json ... Data, { "apiVersion": "v1", "involvedObject": { "apiVersion": "v1", "fieldPath": "spec.containers{hello-node}", "kind": "Pod", "name": "hello-node", "namespace": "default", ..... }, "kind": "Event", "message": "Started container", "metadata": { "name": "hello-node.159d7608e3a3572c", "namespace": "default", .... }, "reason": "Started", ... }
API 서버 소스 삭제
트리거를 삭제합니다.
$ kn trigger delete <trigger_name>
이벤트 소스를 삭제합니다.
$ kn source apiserver delete <source_name>
서비스 계정, 클러스터 역할, 클러스터 바인딩을 삭제합니다.
$ oc delete -f authentication.yaml
5.2.3.2.1. Knative CLI 싱크 플래그
Knative(kn
) CLI를 사용하여 이벤트 소스를 생성할 때 --sink
플래그를 사용하여 해당 리소스에서 이벤트가 전송되는 싱크를 지정할 수 있습니다. 싱크는 다른 리소스에서 들어오는 이벤트를 수신할 수 있는 주소 지정 가능 또는 호출 가능한 리소스일 수 있습니다.
다음 예제에서는 싱크로 서비스 http://event-display.svc.cluster.local
를 사용하는 싱크 바인딩을 생성합니다.
싱크 플래그를 사용하는 명령의 예
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \ 1
--ce-override "sink=bound"
- 1
http://event-display.svc.cluster.local
의svc
는 싱크가 Knative 서비스인지 확인합니다. 기타 기본 싱크 접두사에는channel
, 및broker
가 포함됩니다.
5.2.3.3. YAML 파일을 사용하여 API 서버 소스 생성
YAML 파일을 사용하여 Knative 리소스를 생성하면 선언적 방식으로 이벤트 소스를 설명할 수 있으므로 재현 가능한 방식으로 이벤트 소스를 설명할 수 있습니다. YAML을 사용하여 API 서버 소스를 생성하려면 ApiServerSource
개체를 정의하는 YAML 파일을 생성한 다음 oc apply
명령을 사용하여 적용해야 합니다.
사전 요구 사항
- OpenShift Serverless Operator 및 Knative Eventing이 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
-
API 서버 소스 YAML 파일에 정의된 것과 동일한 네임스페이스에
default
브로커를 생성했습니다. -
OpenShift CLI(
oc
)를 설치합니다.
기존 서비스 계정을 다시 사용하려면 새 리소스를 생성하는 대신 필요한 권한을 포함하도록 기존 ServiceAccount
리소스를 수정할 수 있습니다.
이벤트 소스에 대한 서비스 계정, 역할, 역할 바인딩을 YAML 파일로 만듭니다.
apiVersion: v1 kind: ServiceAccount metadata: name: events-sa namespace: default 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: event-watcher namespace: default 2 rules: - apiGroups: - "" resources: - events verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: k8s-ra-event-watcher namespace: default 3 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: event-watcher subjects: - kind: ServiceAccount name: events-sa namespace: default 4
YAML 파일을 적용합니다.
$ oc apply -f <filename>
API 서버 소스를 YAML 파일로 만듭니다.
apiVersion: sources.knative.dev/v1alpha1 kind: ApiServerSource metadata: name: testevents spec: serviceAccountName: events-sa mode: Resource resources: - apiVersion: v1 kind: Event sink: ref: apiVersion: eventing.knative.dev/v1 kind: Broker name: default
ApiServerSource
YAML 파일을 적용합니다.$ oc apply -f <filename>
API 서버 소스가 올바르게 설정되었는지 확인하려면 수신되는 메시지를 로그로 덤프하는 Knative 서비스를 YAML 파일로 생성합니다.
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display namespace: default spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
Service
YAML 파일을 적용합니다.$ oc apply -f <filename>
default
브로커에서 이전 단계에서 생성된 서비스로 이벤트를 필터링하는 YAML 파일로Trigger
오브젝트를 생성합니다.apiVersion: eventing.knative.dev/v1 kind: Trigger metadata: name: event-display-trigger namespace: default spec: broker: default subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
Trigger
YAML 파일을 적용합니다.$ oc apply -f <filename>
기본 네임스페이스에서 Pod를 시작하여 이벤트를 생성합니다.
$ oc create deployment hello-node --image=quay.io/openshift-knative/knative-eventing-sources-event-display
다음 명령을 입력하고 출력을 검사하여 컨트롤러가 올바르게 매핑되는지 확인합니다.
$ oc get apiserversource.sources.knative.dev testevents -o yaml
출력 예
apiVersion: sources.knative.dev/v1alpha1 kind: ApiServerSource metadata: annotations: creationTimestamp: "2020-04-07T17:24:54Z" generation: 1 name: testevents namespace: default resourceVersion: "62868" selfLink: /apis/sources.knative.dev/v1alpha1/namespaces/default/apiserversources/testevents2 uid: 1603d863-bb06-4d1c-b371-f580b4db99fa spec: mode: Resource resources: - apiVersion: v1 controller: false controllerSelector: apiVersion: "" kind: "" name: "" uid: "" kind: Event labelSelector: {} serviceAccountName: events-sa sink: ref: apiVersion: eventing.knative.dev/v1 kind: Broker name: default
검증
Kubernetes 이벤트가 Knative로 전송되었는지 확인하려면 메시지 덤퍼 기능 로그를 확인하면 됩니다.
다음 명령을 입력하여 pod를 가져옵니다.
$ oc get pods
다음 명령을 입력하여 pod 메시지 덤퍼 기능 로그를 표시합니다.
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.apiserver.resource.update datacontenttype: application/json ... Data, { "apiVersion": "v1", "involvedObject": { "apiVersion": "v1", "fieldPath": "spec.containers{hello-node}", "kind": "Pod", "name": "hello-node", "namespace": "default", ..... }, "kind": "Event", "message": "Started container", "metadata": { "name": "hello-node.159d7608e3a3572c", "namespace": "default", .... }, "reason": "Started", ... }
API 서버 소스 삭제
트리거를 삭제합니다.
$ oc delete -f trigger.yaml
이벤트 소스를 삭제합니다.
$ oc delete -f k8s-events.yaml
서비스 계정, 클러스터 역할, 클러스터 바인딩을 삭제합니다.
$ oc delete -f authentication.yaml
5.2.4. ping 소스 생성
ping 소스는 이벤트 소비자에게 일정한 페이로드를 사용하여 주기적으로 ping 이벤트를 보내는 데 사용할 수 있는 이벤트 소스입니다. ping 소스를 사용하면 타이머와 유사하게 전송 이벤트를 예약할 수 있습니다.
5.2.4.1. 웹 콘솔을 사용하여 ping 소스 생성
Knative Eventing이 클러스터에 설치되면 웹 콘솔을 사용하여 ping 소스를 생성할 수 있습니다. OpenShift Container Platform 웹 콘솔을 사용하면 간소화되고 직관적인 사용자 인터페이스가 제공되므로 이벤트 소스를 생성할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 웹 콘솔에 로그인했습니다.
- OpenShift Serverless Operator, Knative Serving 및 Knative Eventing이 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
절차
ping 소스가 작동하는지 확인하려면 수신 메시지를 서비스 로그에 덤프하는 간단한 Knative 서비스를 생성합니다.
-
개발자 화면에서 +추가
YAML로 이동합니다. 예제 YAML을 복사합니다.
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
- 생성을 클릭합니다.
-
개발자 화면에서 +추가
이전 단계에서 생성한 서비스와 동일한 네임스페이스 또는 이벤트를 보낼 다른 싱크에 ping 소스를 생성합니다.
-
개발자 화면에서 +추가
이벤트 소스로 이동합니다. 이벤트 소스 페이지가 표시됩니다. - 선택 사항: 이벤트 소스에 대한 공급자가 여러 개인 경우 공급자 목록에서 필요한 공급자를 선택하여 해당 공급자의 사용 가능한 이벤트 소스를 필터링합니다.
Ping 소스를 선택한 다음 이벤트 소스 생성을 클릭합니다. 이벤트 소스 생성 페이지가 표시됩니다.
참고양식 보기 또는 YAML 보기를 사용하여 PingSource 설정을 구성하고 보기 간에 전환할 수 있습니다. 다른 보기로 전환해도 데이터는 유지됩니다.
-
스케줄 값을 입력합니다. 이 예에서 값은
*/2 * * * *
이며, 2분마다 메시지를 전송하는 PingSource를 생성합니다. - 선택 사항: 메시지 페이로드에 해당하는 데이터 값을 입력할 수 있습니다.
-
싱크를 선택합니다. 리소스 또는 URI일 수 있습니다. 이 예제에서는 이전 단계에서 생성한
event-display
서비스를 리소스 싱크로 사용합니다. - 생성을 클릭합니다.
-
개발자 화면에서 +추가
검증
토폴로지 페이지를 확인하여 ping 소스가 생성되었고 싱크에 연결되어 있는지 확인할 수 있습니다.
- 개발자 화면에서 토폴로지로 이동합니다.
ping 소스 및 싱크를 확인합니다.
ping 소스 삭제
- 토폴로지 보기로 이동합니다.
- API 서버 소스를 마우스 오른쪽 버튼으로 클릭하고 Ping 소스 삭제를 선택합니다.
5.2.4.2. Knative CLI를 사용하여 ping 소스 생성
kn 소스 ping create
명령을 사용하여 Knative(kn
) CLI를 사용하여 ping 소스를 생성할 수 있습니다. Knative CLI를 사용하여 이벤트 소스를 생성하면 YAML 파일을 직접 수정하는 것보다 더 간소화되고 직관적인 사용자 인터페이스를 제공합니다.
사전 요구 사항
- OpenShift Serverless Operator, Knative Serving 및 Knative Eventing이 클러스터에 설치되어 있습니다.
-
Knative(
kn
) CLI가 설치되어 있습니다. - 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
-
선택 사항: 이 프로세스에 대한 확인 단계를 사용하려면 OpenShift CLI(
oc
)를 설치합니다.
절차
ping 소스가 작동하는지 확인하려면 수신 메시지를 서비스 로그에 덤프하는 간단한 Knative 서비스를 생성합니다.
$ kn service create event-display \ --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
요청할 각 ping 이벤트 세트에 대해 이벤트 소비자와 동일한 네임스페이스에 ping 소스를 생성합니다.
$ kn source ping create test-ping-source \ --schedule "*/2 * * * *" \ --data '{"message": "Hello world!"}' \ --sink ksvc:event-display
다음 명령을 입력하고 출력을 검사하여 컨트롤러가 올바르게 매핑되는지 확인합니다.
$ kn source ping describe test-ping-source
출력 예
Name: test-ping-source Namespace: default Annotations: sources.knative.dev/creator=developer, sources.knative.dev/lastModifier=developer Age: 15s Schedule: */2 * * * * Data: {"message": "Hello world!"} Sink: Name: event-display Namespace: default Resource: Service (serving.knative.dev/v1) Conditions: OK TYPE AGE REASON ++ Ready 8s ++ Deployed 8s ++ SinkProvided 15s ++ ValidSchedule 15s ++ EventTypeProvided 15s ++ ResourcesCorrect 15s
검증
싱크 Pod의 로그를 보면 Kubernetes 이벤트가 Knative 이벤트 싱크로 전송되었는지 확인할 수 있습니다.
Knative 서비스는 기본적으로 60초 이내에 트래픽이 수신되지 않으면 Pod를 종료합니다. 이 가이드에 표시된 예제에서는 2분마다 메시지를 전송하는 ping 소스를 생성하므로 새로 생성된 Pod에서 각 메시지를 관찰해야 합니다.
새 Pod가 생성되었는지 확인합니다.
$ watch oc get pods
Ctrl+C를 사용하여 Pod를 감시한 다음 생성한 Pod의 로그를 확인합니다.
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.sources.ping source: /apis/v1/namespaces/default/pingsources/test-ping-source id: 99e4f4f6-08ff-4bff-acf1-47f61ded68c9 time: 2020-04-07T16:16:00.000601161Z datacontenttype: application/json Data, { "message": "Hello world!" }
ping 소스 삭제
ping 소스를 삭제합니다.
$ kn delete pingsources.sources.knative.dev <ping_source_name>
5.2.4.2.1. Knative CLI 싱크 플래그
Knative(kn
) CLI를 사용하여 이벤트 소스를 생성할 때 --sink
플래그를 사용하여 해당 리소스에서 이벤트가 전송되는 싱크를 지정할 수 있습니다. 싱크는 다른 리소스에서 들어오는 이벤트를 수신할 수 있는 주소 지정 가능 또는 호출 가능한 리소스일 수 있습니다.
다음 예제에서는 싱크로 서비스 http://event-display.svc.cluster.local
를 사용하는 싱크 바인딩을 생성합니다.
싱크 플래그를 사용하는 명령의 예
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \ 1
--ce-override "sink=bound"
- 1
http://event-display.svc.cluster.local
의svc
는 싱크가 Knative 서비스인지 확인합니다. 기타 기본 싱크 접두사에는channel
, 및broker
가 포함됩니다.
5.2.4.3. YAML을 사용하여 ping 소스 생성
YAML 파일을 사용하여 Knative 리소스를 생성하면 선언적 방식으로 이벤트 소스를 설명할 수 있으므로 재현 가능한 방식으로 이벤트 소스를 설명할 수 있습니다. YAML을 사용하여 서버리스 ping 소스를 생성하려면 PingSource
개체를 정의하는 YAML 파일을 생성한 다음 oc apply
를 사용하여 적용해야 합니다.
PingSource
개체의 예
apiVersion: sources.knative.dev/v1 kind: PingSource metadata: name: test-ping-source spec: schedule: "*/2 * * * *" 1 data: '{"message": "Hello world!"}' 2 sink: 3 ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
사전 요구 사항
- OpenShift Serverless Operator, Knative Serving 및 Knative Eventing이 클러스터에 설치되어 있습니다.
-
OpenShift CLI(
oc
)를 설치합니다. - 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
절차
ping 소스가 작동하는지 확인하려면 수신 메시지를 서비스 로그에 덤프하는 간단한 Knative 서비스를 생성합니다.
서비스 YAML 파일을 생성합니다.
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
서비스를 생성합니다.
$ oc apply -f <filename>
요청할 각 ping 이벤트 세트에 대해 이벤트 소비자와 동일한 네임스페이스에 ping 소스를 생성합니다.
ping 소스에 대한 YAML 파일을 생성합니다.
apiVersion: sources.knative.dev/v1 kind: PingSource metadata: name: test-ping-source spec: schedule: "*/2 * * * *" data: '{"message": "Hello world!"}' sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
ping 소스를 생성합니다.
$ oc apply -f <filename>
다음 명령을 입력하여 컨트롤러가 올바르게 매핑되는지 확인합니다.
$ oc get pingsource.sources.knative.dev <ping_source_name> -oyaml
출력 예
apiVersion: sources.knative.dev/v1 kind: PingSource metadata: annotations: sources.knative.dev/creator: developer sources.knative.dev/lastModifier: developer creationTimestamp: "2020-04-07T16:11:14Z" generation: 1 name: test-ping-source namespace: default resourceVersion: "55257" selfLink: /apis/sources.knative.dev/v1/namespaces/default/pingsources/test-ping-source uid: 3d80d50b-f8c7-4c1b-99f7-3ec00e0a8164 spec: data: '{ value: "hello" }' schedule: '*/2 * * * *' sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display namespace: default
검증
싱크 Pod의 로그를 보면 Kubernetes 이벤트가 Knative 이벤트 싱크로 전송되었는지 확인할 수 있습니다.
Knative 서비스는 기본적으로 60초 이내에 트래픽이 수신되지 않으면 Pod를 종료합니다. 이 가이드에 표시된 예제에서는 2분마다 메시지를 전송하는 PingSource를 생성하므로 새로 생성된 Pod에서 각 메시지를 관찰해야 합니다.
새 Pod가 생성되었는지 확인합니다.
$ watch oc get pods
Ctrl+C를 사용하여 Pod를 감시한 다음 생성한 Pod의 로그를 확인합니다.
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.sources.ping source: /apis/v1/namespaces/default/pingsources/test-ping-source id: 042ff529-240e-45ee-b40c-3a908129853e time: 2020-04-07T16:22:00.000791674Z datacontenttype: application/json Data, { "message": "Hello world!" }
ping 소스 삭제
ping 소스를 삭제합니다.
$ oc delete -f <filename>
명령 예
$ oc delete -f ping-source.yaml
5.2.5. Kafka 소스
Apache Kafka 클러스터에서 이벤트를 읽고 이러한 이벤트를 싱크로 전달하는 Kafka 소스를 생성할 수 있습니다. OpenShift Container Platform 웹 콘솔,kn
( kn) CLI를 사용하거나 YAML 파일로 직접 KafkaSource
오브젝트를 생성하고 OpenShift CLI(oc
)를 사용하여 적용할 수 있습니다.
5.2.5.1. 웹 콘솔을 사용하여 Kafka 이벤트 소스 생성
Knative Kafka가 클러스터에 설치되면 웹 콘솔을 사용하여 Kafka 소스를 생성할 수 있습니다. OpenShift Container Platform 웹 콘솔을 사용하면 간단하고 직관적인 사용자 인터페이스를 사용하여 Kafka 소스를 생성할 수 있습니다.
사전 요구 사항
-
OpenShift Serverless Operator, Knative Eventing,
KnativeKafka
사용자 정의 리소스가 클러스터에 설치되어 있습니다. - 웹 콘솔에 로그인했습니다.
- 가져오려는 Kafka 메시지를 생성하는 Red Hat AMQ Streams(Kafka) 클러스터에 액세스할 수 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
절차
- 개발자 화면에서 +추가 페이지로 이동하여 이벤트 소스를 선택합니다.
- 이벤트 소스 페이지의 유형 섹션에서 Kafka 소스를 선택합니다.
Kafka 소스 설정을 구성합니다.
- 쉼표로 구분된 부트스트랩 서버 목록을 추가합니다.
- 쉼표로 구분된 주제 목록을 추가합니다.
- 소비자 그룹을 추가합니다.
- 생성한 서비스 계정의 서비스 계정 이름을 선택합니다.
- 이벤트 소스로 싱크를 선택합니다. 싱크는 채널, 브로커 또는 서비스와 같은 리소스이거나 URI일 수 있습니다.
- Kafka 이벤트 소스로 이름을 입력합니다.
- 생성을 클릭합니다.
검증
토폴로지 페이지를 확인하여 Kafka 이벤트 소스가 생성되었고 싱크에 연결되어 있는지 확인할 수 있습니다.
- 개발자 화면에서 토폴로지로 이동합니다.
Kafka 이벤트 소스 및 싱크를 확인합니다.
5.2.5.2. Knative CLI를 사용하여 Kafka 이벤트 소스 생성
kn source kafka create
명령을 사용하여 Knative(kn
) CLI를 사용하여 Kafka 소스를 생성할 수 있습니다. Knative CLI를 사용하여 이벤트 소스를 생성하면 YAML 파일을 직접 수정하는 것보다 더 간소화되고 직관적인 사용자 인터페이스를 제공합니다.
사전 요구 사항
-
OpenShift Serverless Operator, Knative Eventing, Knative Serving,
KnativeKafka
사용자 정의 리소스(CR가 클러스터에 설치되어 있습니다. - 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
- 가져오려는 Kafka 메시지를 생성하는 Red Hat AMQ Streams(Kafka) 클러스터에 액세스할 수 있습니다.
-
Knative(
kn
) CLI가 설치되어 있습니다. -
선택 사항: 이 절차의 확인 단계를 사용하려면 OpenShift CLI(
oc
)를 설치했습니다.
절차
Kafka 이벤트 소스가 작동하는지 확인하려면 수신 이벤트를 서비스 로그에 덤프하는 Knative 서비스를 생성합니다.
$ kn service create event-display \ --image quay.io/openshift-knative/knative-eventing-sources-event-display
KafkaSource
CR을 생성합니다.$ kn source kafka create <kafka_source_name> \ --servers <cluster_kafka_bootstrap>.kafka.svc:9092 \ --topics <topic_name> --consumergroup my-consumer-group \ --sink event-display
참고이 명령의 자리 표시자 값을 소스 이름, 부트스트랩 서버 및 주제의 값으로 바꿉니다.
--servers
,--topics
,--consumergroup
옵션은 Kafka 클러스터에 대한 연결 매개 변수를 지정합니다.--consumergroup
옵션은 선택 사항입니다.선택 사항: 생성한
KafkaSource
CR에 대한 세부 정보를 확인합니다.$ kn source kafka describe <kafka_source_name>
출력 예
Name: example-kafka-source Namespace: kafka Age: 1h BootstrapServers: example-cluster-kafka-bootstrap.kafka.svc:9092 Topics: example-topic ConsumerGroup: example-consumer-group Sink: Name: event-display Namespace: default Resource: Service (serving.knative.dev/v1) Conditions: OK TYPE AGE REASON ++ Ready 1h ++ Deployed 1h ++ SinkProvided 1h
검증 절차
Kafka 인스턴스를 트리거하여 메시지를 항목에 보냅니다.
$ oc -n kafka run kafka-producer \ -ti --image=quay.io/strimzi/kafka:latest-kafka-2.7.0 --rm=true \ --restart=Never -- bin/kafka-console-producer.sh \ --broker-list <cluster_kafka_bootstrap>:9092 --topic my-topic
프롬프트에 메시지를 입력합니다. 이 명령은 다음을 가정합니다.
-
Kafka 클러스터는
kafka
네임스페이스에 설치됩니다. -
my-topic
주제를 사용하도록KafkaSource
오브젝트가 구성되어 있습니다.
-
Kafka 클러스터는
로그를 보고 메시지가 도착했는지 확인합니다.
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.kafka.event source: /apis/v1/namespaces/default/kafkasources/example-kafka-source#example-topic subject: partition:46#0 id: partition:46/offset:0 time: 2021-03-10T11:21:49.4Z Extensions, traceparent: 00-161ff3815727d8755848ec01c866d1cd-7ff3916c44334678-00 Data, Hello!
5.2.5.2.1. Knative CLI 싱크 플래그
Knative(kn
) CLI를 사용하여 이벤트 소스를 생성할 때 --sink
플래그를 사용하여 해당 리소스에서 이벤트가 전송되는 싱크를 지정할 수 있습니다. 싱크는 다른 리소스에서 들어오는 이벤트를 수신할 수 있는 주소 지정 가능 또는 호출 가능한 리소스일 수 있습니다.
다음 예제에서는 싱크로 서비스 http://event-display.svc.cluster.local
를 사용하는 싱크 바인딩을 생성합니다.
싱크 플래그를 사용하는 명령의 예
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \ 1
--ce-override "sink=bound"
- 1
http://event-display.svc.cluster.local
의svc
는 싱크가 Knative 서비스인지 확인합니다. 기타 기본 싱크 접두사에는channel
, 및broker
가 포함됩니다.
5.2.5.3. YAML을 사용하여 Kafka 이벤트 소스 생성
YAML 파일을 사용하여 Knative 리소스를 생성하면 선언적 방식으로 애플리케이션을 재현할 수 있으며 재현 가능한 방식으로 애플리케이션을 설명할 수 있습니다. YAML을 사용하여 Kafka 소스를 생성하려면 KafkaSource
오브젝트를 정의하는 YAML 파일을 생성한 다음 oc apply
명령을 사용하여 적용해야 합니다.
사전 요구 사항
-
OpenShift Serverless Operator, Knative Eventing,
KnativeKafka
사용자 정의 리소스가 클러스터에 설치되어 있습니다. - 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
- 가져오려는 Kafka 메시지를 생성하는 Red Hat AMQ Streams(Kafka) 클러스터에 액세스할 수 있습니다.
-
OpenShift CLI(
oc
)를 설치합니다.
절차
KafkaSource
오브젝트를 YAML 파일로 생성합니다.apiVersion: sources.knative.dev/v1beta1 kind: KafkaSource metadata: name: <source_name> spec: consumerGroup: <group_name> 1 bootstrapServers: - <list_of_bootstrap_servers> topics: - <list_of_topics> 2 sink: - <list_of_sinks> 3
중요OpenShift Serverless의
KafkaSource
개체에 대한 API의v1beta1
버전만 지원됩니다. 이 버전은 더 이상 사용되지 않으므로 이 API의v1alpha1
버전을 사용하지 마십시오.KafkaSource
오브젝트의 예apiVersion: sources.knative.dev/v1beta1 kind: KafkaSource metadata: name: kafka-source spec: consumerGroup: knative-group bootstrapServers: - my-cluster-kafka-bootstrap.kafka:9092 topics: - knative-demo-topic sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
KafkaSource
YAML 파일을 적용합니다.$ oc apply -f <filename>
검증
다음 명령을 입력하여 Kafka 이벤트 소스가 생성되었는지 확인합니다.
$ oc get pods
출력 예
NAME READY STATUS RESTARTS AGE kafkasource-kafka-source-5ca0248f-... 1/1 Running 0 13m
5.2.5.4. Kafka 소스에 대한 SASL 인증 구성
SASL( Simple Authentication and Security Layer )은 Apache Kafka에서 인증에 사용됩니다. 클러스터에서 SASL 인증을 사용하는 경우 사용자는 Kafka 클러스터와 통신하기 위해 Knative에 인증 정보를 제공해야 합니다. 그러지 않으면 이벤트를 생성하거나 사용할 수 없습니다.
사전 요구 사항
- OpenShift Container Platform에 대한 클러스터 또는 전용 관리자 권한이 있어야 합니다.
-
OpenShift Serverless Operator, Knative Eventing,
KnativeKafka
CR이 OpenShift Container Platform 클러스터에 설치되어 있습니다. - 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
- Kafka 클러스터의 사용자 이름과 암호가 있습니다.
-
사용할 SASL 메커니즘을 선택했습니다(예:
PLAIN
,SCRAM-SHA-256
또는SCRAM-SHA-512
). -
TLS가 활성화된 경우 Kafka 클러스터의
ca.crt
인증서 파일도 필요합니다. -
OpenShift(
oc
) CLI를 설치했습니다.
절차
선택한 네임스페이스에서 인증서 파일을 시크릿으로 생성합니다.
$ oc create secret -n <namespace> generic <kafka_auth_secret> \ --from-file=ca.crt=caroot.pem \ --from-literal=password="SecretPassword" \ --from-literal=saslType="SCRAM-SHA-512" \ 1 --from-literal=user="my-sasl-user"
- 1
- SASL 유형은
PLAIN
,SCRAM-SHA-256
또는SCRAM-SHA-512
일 수 있습니다.
다음
사양
구성이 포함되도록 Kafka 소스를 생성하거나 수정합니다.apiVersion: sources.knative.dev/v1beta1 kind: KafkaSource metadata: name: example-source spec: ... net: sasl: enable: true user: secretKeyRef: name: <kafka_auth_secret> key: user password: secretKeyRef: name: <kafka_auth_secret> key: password type: secretKeyRef: name: <kafka_auth_secret> key: saslType tls: enable: true caCert: 1 secretKeyRef: name: <kafka_auth_secret> key: ca.crt ...
- 1
- Apache Kafka용 Red Hat OpenShift Streams와 같은 퍼블릭 클라우드 Kafka 서비스를 사용하는 경우에는
caCert
사양이 필요하지 않습니다.
5.2.6. 사용자 정의 이벤트 소스
Knative에 포함되지 않은 이벤트 생산자 또는 CloudEvent
형식에 없는 이벤트를 내보내는 생산자에서 이벤트를 수신해야 하는 경우 사용자 정의 이벤트 소스를 생성하여 이 작업을 수행할 수 있습니다. 다음 방법 중 하나를 사용하여 사용자 지정 이벤트 소스를 생성할 수 있습니다.
-
싱크 바인딩을 생성하여
PodSpecable
오브젝트를 이벤트 소스로 사용합니다. - 컨테이너 소스를 생성하여 컨테이너를 이벤트 소스로 사용합니다.
5.2.6.1. 싱크 바인딩
SinkBinding
오브젝트는 전달 주소 지정에서 이벤트 프로덕션 분리를 지원합니다. 싱크 바인딩은 이벤트 생산자를 이벤트 소비자 또는 싱크에 연결하는 데 사용됩니다. 이벤트 생산자는 PodSpec
템플릿을 포함하고 이벤트를 생성하는 Kubernetes 리소스입니다. 싱크는 이벤트를 수신할 수 있는 주소 지정 가능한 Kubernetes 오브젝트입니다.
SinkBinding
오브젝트는 싱크의 PodTemplateSpec
에 환경 변수를 삽입하므로 이벤트 대상을 찾기 위해 애플리케이션 코드가 Kubernetes API와 직접 상호 작용할 필요가 없습니다. 이러한 환경 변수는 다음과 같습니다.
K_SINK
- 해결된 싱크의 URL입니다.
K_CE_OVERRIDES
- 아웃바운드 이벤트에 대한 재정의를 지정하는 JSON 오브젝트입니다.
현재 SinkBinding
오브젝트는 서비스에 대한 사용자 정의 리버전 이름을 지원하지 않습니다.
5.2.6.1.1. YAML을 사용하여 싱크 바인딩 생성
YAML 파일을 사용하여 Knative 리소스를 생성하면 선언적 방식으로 이벤트 소스를 설명할 수 있으므로 재현 가능한 방식으로 이벤트 소스를 설명할 수 있습니다. YAML을 사용하여 싱크 바인딩을 생성하려면 SinkBinding
오브젝트를 정의하는 YAML 파일을 생성한 다음 oc apply
명령을 사용하여 적용해야 합니다.
사전 요구 사항
- OpenShift Serverless Operator, Knative Serving 및 Knative Eventing이 클러스터에 설치되어 있습니다.
-
OpenShift CLI(
oc
)를 설치합니다. - 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
절차
싱크 바인딩이 올바르게 설정되었는지 확인하려면 Knative 이벤트 표시 서비스를 생성하여 수신되는 메시지를 로그로 덤프합니다.
서비스 YAML 파일을 생성합니다.
서비스 YAML 파일 예
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
서비스를 생성합니다.
$ oc apply -f <filename>
이벤트를 서비스로 보내는 싱크 바인딩 인스턴스를 생성합니다.
싱크 바인딩 YAML 파일을 생성합니다.
서비스 YAML 파일 예
apiVersion: sources.knative.dev/v1alpha1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: batch/v1 kind: Job 1 selector: matchLabels: app: heartbeat-cron sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
- 1
- 이 예제에서는
app: Heartbeat-cron
라벨이 있는 모든 작업이 이벤트 싱크에 바인딩됩니다.
싱크 바인딩을 생성합니다.
$ oc apply -f <filename>
CronJob
오브젝트를 생성합니다.cron 작업 YAML 파일을 생성합니다.
cron 작업 YAML 파일의 예
apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "* * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true" spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: quay.io/openshift-knative/heartbeats:latest args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
중요싱크 바인딩을 사용하려면 Knative 리소스에
bindings.knative.dev/include=true
라벨을 수동으로 추가해야 합니다.예를 들어 이 라벨을
CronJob
리소스에 추가하려면Job
리소스 YAML 정의에 다음 행을 추가합니다.jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
cron 작업을 생성합니다.
$ oc apply -f <filename>
다음 명령을 입력하고 출력을 검사하여 컨트롤러가 올바르게 매핑되는지 확인합니다.
$ oc get sinkbindings.sources.knative.dev bind-heartbeat -oyaml
출력 예
spec: sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display namespace: default subject: apiVersion: batch/v1 kind: Job namespace: default selector: matchLabels: app: heartbeat-cron
검증
메시지 덤퍼 기능 로그를 보면 Kubernetes 이벤트가 Knative 이벤트 싱크로 전송되었는지 확인할 수 있습니다.
명령을 입력합니다.
$ oc get pods
명령을 입력합니다.
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-test/mypod id: 2b72d7bf-c38f-4a98-a433-608fbcdd2596 time: 2019-10-18T15:23:20.809775386Z contenttype: application/json Extensions, beats: true heart: yes the: 42 Data, { "id": 1, "label": "" }
5.2.6.1.2. Knative CLI를 사용하여 싱크 바인딩 생성
kn source binding create
명령을 사용하여 Knative(kn
) CLI를 사용하여 싱크 바인딩을 생성할 수 있습니다. Knative CLI를 사용하여 이벤트 소스를 생성하면 YAML 파일을 직접 수정하는 것보다 더 간소화되고 직관적인 사용자 인터페이스를 제공합니다.
사전 요구 사항
- OpenShift Serverless Operator, Knative Serving 및 Knative Eventing이 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
-
Knative(
kn
) CLI를 설치합니다. -
OpenShift CLI(
oc
)를 설치합니다.
다음 절차에 따라 YAML 파일을 생성해야 합니다.
예제에 사용된 YAML 파일의 이름을 변경하는 경우 해당 CLI 명령도 업데이트해야 합니다.
절차
싱크 바인딩이 올바르게 설정되었는지 확인하려면 Knative 이벤트 표시 서비스를 생성하여 수신되는 메시지를 로그로 덤프합니다.
$ kn service create event-display --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
이벤트를 서비스로 보내는 싱크 바인딩 인스턴스를 생성합니다.
$ kn source binding create bind-heartbeat --subject Job:batch/v1:app=heartbeat-cron --sink ksvc:event-display
CronJob
오브젝트를 생성합니다.cron 작업 YAML 파일을 생성합니다.
cron 작업 YAML 파일의 예
apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "* * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true" spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: quay.io/openshift-knative/heartbeats:latest args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
중요싱크 바인딩을 사용하려면 Knative CR에
bindings.knative.dev/include=true
라벨을 수동으로 추가해야 합니다.예를 들어 이 라벨을
CronJob
CR에 추가하려면Job
CR YAML 정의에 다음 행을 추가합니다.jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true"
cron 작업을 생성합니다.
$ oc apply -f <filename>
다음 명령을 입력하고 출력을 검사하여 컨트롤러가 올바르게 매핑되는지 확인합니다.
$ kn source binding describe bind-heartbeat
출력 예
Name: bind-heartbeat Namespace: demo-2 Annotations: sources.knative.dev/creator=minikube-user, sources.knative.dev/lastModifier=minikub ... Age: 2m Subject: Resource: job (batch/v1) Selector: app: heartbeat-cron Sink: Name: event-display Resource: Service (serving.knative.dev/v1) Conditions: OK TYPE AGE REASON ++ Ready 2m
검증
메시지 덤퍼 기능 로그를 보면 Kubernetes 이벤트가 Knative 이벤트 싱크로 전송되었는지 확인할 수 있습니다.
다음 명령을 입력하여 메시지 덤퍼 기능 로그를 확인합니다.
$ oc get pods
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
출력 예
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.dev/eventing-contrib/cmd/heartbeats/#event-test/mypod id: 2b72d7bf-c38f-4a98-a433-608fbcdd2596 time: 2019-10-18T15:23:20.809775386Z contenttype: application/json Extensions, beats: true heart: yes the: 42 Data, { "id": 1, "label": "" }
5.2.6.1.2.1. Knative CLI 싱크 플래그
Knative(kn
) CLI를 사용하여 이벤트 소스를 생성할 때 --sink
플래그를 사용하여 해당 리소스에서 이벤트가 전송되는 싱크를 지정할 수 있습니다. 싱크는 다른 리소스에서 들어오는 이벤트를 수신할 수 있는 주소 지정 가능 또는 호출 가능한 리소스일 수 있습니다.
다음 예제에서는 싱크로 서비스 http://event-display.svc.cluster.local
를 사용하는 싱크 바인딩을 생성합니다.
싱크 플래그를 사용하는 명령의 예
$ kn source binding create bind-heartbeat \
--namespace sinkbinding-example \
--subject "Job:batch/v1:app=heartbeat-cron" \
--sink http://event-display.svc.cluster.local \ 1
--ce-override "sink=bound"
- 1
http://event-display.svc.cluster.local
의svc
는 싱크가 Knative 서비스인지 확인합니다. 기타 기본 싱크 접두사에는channel
, 및broker
가 포함됩니다.
5.2.6.1.3. 웹 콘솔을 사용하여 싱크 바인딩 생성
Knative Eventing이 클러스터에 설치되면 웹 콘솔을 사용하여 싱크 바인딩을 생성할 수 있습니다. OpenShift Container Platform 웹 콘솔을 사용하면 간소화되고 직관적인 사용자 인터페이스가 제공되므로 이벤트 소스를 생성할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 웹 콘솔에 로그인했습니다.
- OpenShift Serverless Operator, Knative Serving, Knative Eventing이 OpenShift Container Platform 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
절차
싱크로 사용할 Knative 서비스를 생성합니다.
-
개발자 화면에서 +추가
YAML로 이동합니다. 예제 YAML을 복사합니다.
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
- 생성을 클릭합니다.
-
개발자 화면에서 +추가
이벤트 소스로 사용되고 1분마다 이벤트를 전송하는
CronJob
리소스를 생성합니다.-
개발자 화면에서 +추가
YAML로 이동합니다. 예제 YAML을 복사합니다.
apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron spec: # Run every minute schedule: "*/1 * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: true 1 spec: template: spec: restartPolicy: Never containers: - name: single-heartbeat image: quay.io/openshift-knative/heartbeats args: - --period=1 env: - name: ONE_SHOT value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
- 1
bindings.knative.dev/include: true
라벨을 포함해야 합니다. OpenShift Serverless의 기본 네임스페이스 선택 동작은 포함 모드를 사용합니다.
- 생성을 클릭합니다.
-
개발자 화면에서 +추가
이전 단계에서 생성한 서비스와 동일한 네임스페이스 또는 이벤트를 보낼 다른 싱크 바인딩을 생성합니다.
-
개발자 화면에서 +추가
이벤트 소스로 이동합니다. 이벤트 소스 페이지가 표시됩니다. - 선택 사항: 이벤트 소스에 대한 공급자가 여러 개인 경우 공급자 목록에서 필요한 공급자를 선택하여 해당 공급자의 사용 가능한 이벤트 소스를 필터링합니다.
싱크 바인딩을 선택한 다음 이벤트 소스 생성을 클릭합니다. 이벤트 소스 생성 페이지가 표시됩니다.
참고양식 보기 또는 YAML 보기를 사용하여 Sink 바인딩 설정을 구성하고 보기 간에 전환할 수 있습니다. 다른 보기로 전환해도 데이터는 유지됩니다.
-
apiVersion 필드에
batch/v1
을 입력합니다. 유형 필드에
Job
을 입력합니다.참고CronJob
종류는 OpenShift Serverless 싱크 바인딩에서 직접 지원하지 않으므로 kind 필드에서 cron 작업 오브젝트 자체 대신 cron 작업 오브젝트에서 생성한Job
오브젝트를 대상으로 해야 합니다.-
싱크를 선택합니다. 리소스 또는 URI일 수 있습니다. 이 예제에서는 이전 단계에서 생성한
event-display
서비스를 리소스 싱크로 사용합니다. 레이블 일치 섹션에서 다음을 수행합니다.
-
이름 필드에
app
을 입력합니다. 값 필드에
heartbeat-cron
을 입력합니다.참고레이블 선택기는 리소스 이름이 아니라 싱크 바인딩과 함께 cron 작업을 사용할 때 필요합니다. cron 작업에서 생성한 작업에 예측 가능한 이름이 없고 이름에 무작위로 생성된 문자열이 있기 때문입니다. 예:
hearthbeat-cron-1cc23f
-
이름 필드에
- 생성을 클릭합니다.
-
개발자 화면에서 +추가
검증
토폴로지 페이지 및 Pod 로그를 확인하여 싱크 바인딩, 싱크 및 cron 작업이 생성되었으며 올바르게 작동하는지 확인할 수 있습니다.
- 개발자 화면에서 토폴로지로 이동합니다.
싱크 바인딩, 싱크 및 하트비트 cron 작업을 확인합니다.
- 싱크 바인딩이 추가되면 cron 작업에 의해 성공한 작업이 등록되고 있는지 확인합니다. 즉, 싱크 바인딩이 cron 작업에서 생성한 작업을 성공적으로 재구성합니다.
-
event-display
서비스 pod의 로그를 검색하여 heartbeats cron 작업에서 생성한 이벤트를 확인합니다.
5.2.6.1.4. 싱크 바인딩 참조
싱크 바인딩을 생성하여 PodSpecable
오브젝트를 이벤트 소스로 사용할 수 있습니다. SinkBinding 개체를 만들 때 여러 매개 변수를 구성할 수 있습니다.You can configure multiple parameters when creating a SinkBinding
object.
SinkBinding
오브젝트는 다음 매개변수를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
API 버전을 지정합니다(예: | 필수 항목 |
|
이 리소스 오브젝트를 | 필수 항목 |
|
| 필수 항목 |
|
이 | 필수 항목 |
| 싱크로 사용할 URI로 확인되는 오브젝트에 대한 참조입니다. | 필수 항목 |
| 바인딩 구현을 통해 런타임 계약이 보강되는 리소스를 참조합니다. | 필수 항목 |
| 싱크로 전송된 이벤트에 대한 출력 형식 및 수정 사항을 제어하는 재정의를 정의합니다. | 선택 사항 |
5.2.6.1.4.1. Subject 매개변수
Subject
매개변수는 바인딩 구현을 통해 런타임 계약이 보강되는 리소스를 참조합니다. 주체
정의에 대해 여러 필드를 구성할 수 있습니다.
Subject
정의에서는 다음 필드를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
| 참조의 API 버전입니다. | 필수 항목 |
| 일종의 참조자. | 필수 항목 |
| 참조 항목의 네임스페이스입니다. 생략하면 기본값은 오브젝트의 네임스페이스입니다. | 선택 사항 |
| 참조 항목의 이름입니다. |
|
| 참조 항목의 선택기입니다. |
|
| 라벨 선택기 요구 사항 목록입니다. |
|
| 선택기가 적용되는 레이블 키입니다. |
|
|
값 집합에 대한 키의 관계를 나타냅니다. 유효한 연산자는 |
|
|
문자열 값의 배열입니다. |
|
|
키-값 쌍의 맵입니다. |
|
subject 매개변수 예
다음 YAML에 따라 기본
네임스페이스에서 mysubject
라는 Deployment
오브젝트가 선택됩니다.
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: apps/v1 kind: Deployment namespace: default name: mysubject ...
다음 YAML의 경우 default
네임스페이스에서 레이블이 working=example
인 모든 Job
오브젝트가 선택됩니다.
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: batch/v1 kind: Job namespace: default selector: matchLabels: working: example ...
다음 YAML의 경우 default
네임스페이스에 working=example 또는
라벨이 있는 모든 working=
samplePod
오브젝트가 선택됩니다.
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: subject: apiVersion: v1 kind: Pod namespace: default selector: - matchExpression: key: working operator: In values: - example - sample ...
5.2.6.1.4.2. CloudEvent 덮어쓰기
ceOverrides
정의는 싱크로 전송된 CloudEvent의 출력 형식 및 수정 사항을 제어하는 덮어쓰기를 제공합니다. ceOverrides
정의에 대해 여러 필드를 구성할 수 있습니다.
ceOverrides
정의는 다음 필드를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
아웃바운드 이벤트에서 추가 또는 재정의되는 속성을 지정합니다. 각 | 선택 사항 |
유효한 CloudEvent
특성 이름만 확장으로 허용됩니다. 확장 기능 재정의 구성에서 사양 정의 속성을 설정할 수 없습니다. 예를 들어 type
특성을 수정할 수 없습니다.
CloudEvent Overrides 예
apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat spec: ... ceOverrides: extensions: extra: this is an extra attribute additional: 42
그러면 제목에
K_CE_OVERRIDES
환경 변수가 설정됩니다.
출력 예
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
5.2.6.1.4.3. include 레이블
싱크 바인딩을 사용하려면 bindings.knative.dev/include: "true"
레이블을 리소스 또는 리소스가 포함된 네임스페이스에 할당해야 합니다. 리소스 정의에 라벨이 포함되지 않은 경우 클러스터 관리자는 다음을 실행하여 네임스페이스에 연결할 수 있습니다.
$ oc label namespace <namespace> bindings.knative.dev/include=true
5.2.6.2. 컨테이너 소스
컨테이너 소스는 이벤트를 생성하고 이벤트를 싱크로 보내는 컨테이너 이미지를 생성합니다. 이미지 URI를 사용하는 ContainerSource
오브젝트와 컨테이너 이미지를 생성하여 사용자 지정 이벤트 소스를 생성할 수 있습니다.
5.2.6.2.1. 컨테이너 이미지 생성을 위한 지침
컨테이너 소스 컨트롤러에서 두 개의 환경 변수인 K_SINK
및 K_CE_OVERRIDES
를 삽입합니다. 이러한 변수는 sink
및 ceOverrides
사양에서 확인됩니다. 이벤트는 K_SINK
환경 변수에 지정된 싱크 URI로 전송됩니다. 해당 메시지는 CloudEvent
HTTP 형식을 사용하여 POST
로 보내야 합니다.
컨테이너 이미지의 예
다음은 하트비트 컨테이너 이미지의 예입니다.
package main import ( "context" "encoding/json" "flag" "fmt" "log" "os" "strconv" "time" duckv1 "knative.dev/pkg/apis/duck/v1" cloudevents "github.com/cloudevents/sdk-go/v2" "github.com/kelseyhightower/envconfig" ) type Heartbeat struct { Sequence int `json:"id"` Label string `json:"label"` } var ( eventSource string eventType string sink string label string periodStr string ) func init() { flag.StringVar(&eventSource, "eventSource", "", "the event-source (CloudEvents)") flag.StringVar(&eventType, "eventType", "dev.knative.eventing.samples.heartbeat", "the event-type (CloudEvents)") flag.StringVar(&sink, "sink", "", "the host url to heartbeat to") flag.StringVar(&label, "label", "", "a special label") flag.StringVar(&periodStr, "period", "5", "the number of seconds between heartbeats") } type envConfig struct { // Sink URL where to send heartbeat cloud events Sink string `envconfig:"K_SINK"` // CEOverrides are the CloudEvents overrides to be applied to the outbound event. CEOverrides string `envconfig:"K_CE_OVERRIDES"` // Name of this pod. Name string `envconfig:"POD_NAME" required:"true"` // Namespace this pod exists in. Namespace string `envconfig:"POD_NAMESPACE" required:"true"` // Whether to run continuously or exit. OneShot bool `envconfig:"ONE_SHOT" default:"false"` } func main() { flag.Parse() var env envConfig if err := envconfig.Process("", &env); err != nil { log.Printf("[ERROR] Failed to process env var: %s", err) os.Exit(1) } if env.Sink != "" { sink = env.Sink } var ceOverrides *duckv1.CloudEventOverrides if len(env.CEOverrides) > 0 { overrides := duckv1.CloudEventOverrides{} err := json.Unmarshal([]byte(env.CEOverrides), &overrides) if err != nil { log.Printf("[ERROR] Unparseable CloudEvents overrides %s: %v", env.CEOverrides, err) os.Exit(1) } ceOverrides = &overrides } p, err := cloudevents.NewHTTP(cloudevents.WithTarget(sink)) if err != nil { log.Fatalf("failed to create http protocol: %s", err.Error()) } c, err := cloudevents.NewClient(p, cloudevents.WithUUIDs(), cloudevents.WithTimeNow()) if err != nil { log.Fatalf("failed to create client: %s", err.Error()) } var period time.Duration if p, err := strconv.Atoi(periodStr); err != nil { period = time.Duration(5) * time.Second } else { period = time.Duration(p) * time.Second } if eventSource == "" { eventSource = fmt.Sprintf("https://knative.dev/eventing-contrib/cmd/heartbeats/#%s/%s", env.Namespace, env.Name) log.Printf("Heartbeats Source: %s", eventSource) } if len(label) > 0 && label[0] == '"' { label, _ = strconv.Unquote(label) } hb := &Heartbeat{ Sequence: 0, Label: label, } ticker := time.NewTicker(period) for { hb.Sequence++ event := cloudevents.NewEvent("1.0") event.SetType(eventType) event.SetSource(eventSource) event.SetExtension("the", 42) event.SetExtension("heart", "yes") event.SetExtension("beats", true) if ceOverrides != nil && ceOverrides.Extensions != nil { for n, v := range ceOverrides.Extensions { event.SetExtension(n, v) } } if err := event.SetData(cloudevents.ApplicationJSON, hb); err != nil { log.Printf("failed to set cloudevents data: %s", err.Error()) } log.Printf("sending cloudevent to %s", sink) if res := c.Send(context.Background(), event); !cloudevents.IsACK(res) { log.Printf("failed to send cloudevent: %v", res) } if env.OneShot { return } // Wait for next tick <-ticker.C } }
다음은 이전 하트비트 컨테이너 이미지를 참조하는 컨테이너 소스의 예입니다.
apiVersion: sources.knative.dev/v1 kind: ContainerSource metadata: name: test-heartbeats spec: template: spec: containers: # This corresponds to a heartbeats image URI that you have built and published - image: gcr.io/knative-releases/knative.dev/eventing/cmd/heartbeats name: heartbeats args: - --period=1 env: - name: POD_NAME value: "example-pod" - name: POD_NAMESPACE value: "event-test" sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: example-service ...
5.2.6.2.2. Knative CLI를 사용하여 컨테이너 소스 생성 및 관리
kn 소스 컨테이너
명령을 사용하여 Knative(kn
) CLI를 사용하여 컨테이너 소스를 생성하고 관리할 수 있습니다. Knative CLI를 사용하여 이벤트 소스를 생성하면 YAML 파일을 직접 수정하는 것보다 더 간소화되고 직관적인 사용자 인터페이스를 제공합니다.
컨테이너 소스 생성
$ kn source container create <container_source_name> --image <image_uri> --sink <sink>
컨테이너 소스 삭제
$ kn source container delete <container_source_name>
컨테이너 소스 설명
$ kn source container describe <container_source_name>
기존 컨테이너 소스 나열
$ kn source container list
YAML 형식으로 기존 컨테이너 소스 나열
$ kn source container list -o yaml
컨테이너 소스 업데이트
이 명령은 기존 컨테이너 소스의 이미지 URI를 업데이트합니다.
$ kn source container update <container_source_name> --image <image_uri>
5.2.6.2.3. 웹 콘솔을 사용하여 컨테이너 소스 생성
Knative Eventing이 클러스터에 설치되면 웹 콘솔을 사용하여 컨테이너 소스를 생성할 수 있습니다. OpenShift Container Platform 웹 콘솔을 사용하면 간소화되고 직관적인 사용자 인터페이스가 제공되므로 이벤트 소스를 생성할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 웹 콘솔에 로그인했습니다.
- OpenShift Serverless Operator, Knative Serving, Knative Eventing이 OpenShift Container Platform 클러스터에 설치되어 있습니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
절차
-
개발자 화면에서 +추가
이벤트 소스로 이동합니다. 이벤트 소스 페이지가 표시됩니다. - 컨테이너 소스를 선택한 다음 이벤트 소스 생성을 클릭합니다. 이벤트 소스 생성 페이지가 표시됩니다.
양식 보기 또는 YAML 보기를 사용하여 컨테이너 소스 설정을 구성합니다.
참고양식 보기와 YAML 보기를 전환할 수 있습니다. 다른 보기로 전환해도 데이터는 유지됩니다.
- 이미지 필드에 컨테이너 소스에서 생성한 컨테이너에서 실행할 이미지의 URI를 입력합니다.
- 이름 필드에 이미지 이름을 입력합니다.
- 선택 사항: 인수 필드에 컨테이너에 전달할 인수를 입력합니다.
- 선택 사항: 환경 변수 필드에서 컨테이너에 설정할 환경 변수를 추가합니다.
싱크 섹션에서 컨테이너 소스의 이벤트가 라우팅되는 싱크를 추가합니다. 양식 보기를 사용하는 경우 다음 옵션 중에서 선택할 수 있습니다.
- 리소스에서 채널, 브로커 또는 서비스를 이벤트 소스의 싱크로 사용합니다.
- URI를 선택하여 컨테이너 소스의 이벤트가 라우팅되는 위치를 지정합니다.
- 컨테이너 소스 구성을 완료한 후 생성을 클릭합니다.
5.2.6.2.4. 컨테이너 소스 참조
ContainerSource
개체를 생성하여 컨테이너를 이벤트 소스로 사용할 수 있습니다. ContainerSource
개체를 생성할 때 여러 매개변수를 구성할 수 있습니다.
ContainerSource
오브젝트는 다음 필드를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
API 버전을 지정합니다(예: | 필수 항목 |
|
이 리소스 오브젝트를 | 필수 항목 |
|
| 필수 항목 |
|
이 | 필수 항목 |
| 싱크로 사용할 URI로 확인되는 오브젝트에 대한 참조입니다. | 필수 항목 |
|
| 필수 항목 |
| 싱크로 전송된 이벤트에 대한 출력 형식 및 수정 사항을 제어하는 재정의를 정의합니다. | 선택 사항 |
템플릿 매개변수 예
apiVersion: sources.knative.dev/v1 kind: ContainerSource metadata: name: test-heartbeats spec: template: spec: containers: - image: quay.io/openshift-knative/heartbeats:latest name: heartbeats args: - --period=1 env: - name: POD_NAME value: "mypod" - name: POD_NAMESPACE value: "event-test" ...
5.2.6.2.4.1. CloudEvent 덮어쓰기
ceOverrides
정의는 싱크로 전송된 CloudEvent의 출력 형식 및 수정 사항을 제어하는 덮어쓰기를 제공합니다. ceOverrides
정의에 대해 여러 필드를 구성할 수 있습니다.
ceOverrides
정의는 다음 필드를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
아웃바운드 이벤트에서 추가 또는 재정의되는 속성을 지정합니다. 각 | 선택 사항 |
유효한 CloudEvent
특성 이름만 확장으로 허용됩니다. 확장 기능 재정의 구성에서 사양 정의 속성을 설정할 수 없습니다. 예를 들어 type
특성을 수정할 수 없습니다.
CloudEvent Overrides 예
apiVersion: sources.knative.dev/v1 kind: ContainerSource metadata: name: test-heartbeats spec: ... ceOverrides: extensions: extra: this is an extra attribute additional: 42
그러면 제목에
K_CE_OVERRIDES
환경 변수가 설정됩니다.
출력 예
{ "extensions": { "extra": "this is an extra attribute", "additional": "42" } }
5.2.7. 개발자 화면을 사용하여 이벤트 소스를 싱크에 연결
OpenShift Container Platform 웹 콘솔을 사용하여 이벤트 소스를 생성할 때 해당 소스에서 이벤트를 전송하는 싱크를 지정할 수 있습니다. 싱크는 다른 리소스에서 들어오는 이벤트를 수신할 수 있는 주소 지정 가능 또는 호출 가능한 리소스일 수 있습니다.
5.2.7.1. 개발자 화면을 사용하여 이벤트 소스를 싱크에 연결
사전 요구 사항
- OpenShift Serverless Operator, Knative Serving, Knative Eventing이 OpenShift Container Platform 클러스터에 설치되어 있습니다.
- 웹 콘솔에 로그인한 후 개발자 화면으로 갑니다.
- 프로젝트를 생성했거나 OpenShift Container Platform에서 애플리케이션 및 기타 워크로드를 생성하는 데 적절한 역할 및 권한이 있는 프로젝트에 액세스할 수 있습니다.
- Knative 서비스, 채널 또는 브로커와 같은 싱크를 생성했습니다.
프로세스
-
+추가
이벤트 소스로 이동하여 모든 유형의 이벤트 소스를 생성하고 생성할 이벤트 소스 유형을 선택합니다. - 이벤트 소스 생성 양식 보기의 싱크 섹션에서 리소스 목록에서 싱크를 선택합니다.
- 생성을 클릭합니다.
검증
토폴로지 페이지를 확인하여 이벤트 소스가 생성되었고 싱크에 연결되어 있는지 확인할 수 있습니다.
- 개발자 화면에서 토폴로지로 이동합니다.
- 이벤트 소스를 표시하고 연결된 싱크를 클릭하여 오른쪽 패널에서 싱크 세부 정보를 확인합니다.