2.6. 사용자 정의 이벤트 소스
Knative에 포함되지 않은 이벤트 생산자 또는 CloudEvent
형식이 아닌 이벤트를 내보내는 생산자에서 이벤트를 수신해야 하는 경우 사용자 정의 이벤트 소스를 생성하여 이 작업을 수행할 수 있습니다. 다음 방법 중 하나를 사용하여 사용자 지정 이벤트 소스를 생성할 수 있습니다.
-
싱크 바인딩을 생성하여
PodSpecable
오브젝트를 이벤트 소스로 사용합니다. - 컨테이너 소스를 생성하여 컨테이너 소스로 컨테이너를 사용합니다.
2.6.1. 싱크 바인딩
SinkBinding
오브젝트는 전달 주소에서 이벤트 프로덕션의 분리를 지원합니다. 싱크 바인딩은 이벤트 생산자를 이벤트 소비자 또는 싱크 에 연결하는 데 사용됩니다. 이벤트 생산자는 PodSpec
템플릿을 포함하고 이벤트를 생성하는 Kubernetes 리소스입니다. 싱크는 이벤트를 수신할 수 있는 주소 지정 가능한 Kubernetes 오브젝트입니다.
SinkBinding
오브젝트는 싱크의 PodTemplateSpec
에 환경 변수를 삽입합니다. 즉, 애플리케이션 코드가 이벤트 대상을 찾기 위해 Kubernetes API와 직접 상호 작용할 필요가 없습니다. 이러한 환경 변수는 다음과 같습니다.
K_SINK
- 확인된 싱크의 URL입니다.
K_CE_OVERRIDES
- 아웃바운드 이벤트에 대한 재정의를 지정하는 JSON 오브젝트입니다.
SinkBinding
오브젝트는 현재 서비스에 대한 사용자 정의 버전 이름을 지원하지 않습니다.
2.6.1.1. YAML을 사용하여 싱크 바인딩 생성
YAML 파일을 사용하여 Knative 리소스를 생성하면 선언적 API를 사용하므로 선언적 및 재현 가능한 방식으로 이벤트 소스를 설명할 수 있습니다. 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/showcase
서비스를 생성합니다.
$ 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": "" }
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/showcase
이벤트를 서비스로 보내는 싱크 바인딩 인스턴스를 생성합니다.
$ 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": "" }
2.6.1.2.1. Knative CLI sink 플래그
Knative(kn
) CLI를 사용하여 이벤트 소스를 생성할 때 --sink
플래그를 사용하여 해당 리소스에서 이벤트가 전송되는 싱크를 지정할 수 있습니다. 싱크는 다른 리소스에서 들어오는 이벤트를 수신할 수 있는 주소 지정 가능 또는 호출 가능 리소스일 수 있습니다.
다음 예제에서는 싱크로 서비스 http://event-display.svc.cluster.local
를 사용하는 싱크 바인딩을 생성합니다.
sink 플래그를 사용하는 명령의 예
$ 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
가 포함됩니다.
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/showcase
- 생성을 클릭합니다.
-
개발자 화면에서 +추가
이벤트 소스로 사용되고 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
서비스가 대상 리소스로 사용됩니다. - URI 를 선택하여 이벤트가 라우팅되는 URI(Uniform Resource Identifier)를 지정합니다.
-
채널, 브로커 또는 서비스를 이벤트 소스의 이벤트 싱크로 사용하려면 리소스 를 선택합니다. 이 예에서는 이전 단계에서 생성한
레이블 일치 섹션에서 다음을 수행합니다.
-
이름 필드에
app
을 입력합니다. 값 필드에
heartbeat-cron
을 입력합니다.참고레이블 선택기는 리소스 이름이 아니라 싱크 바인딩과 함께 cron 작업을 사용할 때 필요합니다. cron 작업에서 생성한 작업에 예측 가능한 이름이 없고 이름에 무작위로 생성된 문자열이 있기 때문입니다. 예:
hearthbeat-cron-1cc23f
-
이름 필드에
- 생성을 클릭합니다.
-
개발자 화면에서 +추가
검증
토폴로지 페이지 및 Pod 로그를 확인하여 싱크 바인딩, 싱크 및 cron 작업이 생성되었으며 올바르게 작동하는지 확인할 수 있습니다.
- 개발자 화면에서 토폴로지로 이동합니다.
싱크 바인딩, 싱크 및 하트비트 cron 작업을 확인합니다.
- 싱크 바인딩이 추가되면 cron 작업에 의해 성공한 작업이 등록되고 있는지 확인합니다. 즉, 싱크 바인딩이 cron 작업에서 생성한 작업을 성공적으로 재구성합니다.
event-display
서비스를 검색하여 하트비트 cron 작업에서 생성한 이벤트를 확인합니다.
2.6.1.4. 싱크 바인딩 참조
싱크 바인딩을 생성하여 PodSpecable
오브젝트를 이벤트 소스로 사용할 수 있습니다. SinkBinding
오브젝트를 생성할 때 여러 매개변수를 구성할 수 있습니다.
SinkBinding
오브젝트는 다음 매개변수를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
API 버전을 지정합니다(예: | 필수 항목 |
|
이 리소스 오브젝트를 | 필수 항목 |
|
| 필수 항목 |
|
이 | 필수 항목 |
| 싱크로 사용할 URI로 확인되는 오브젝트에 대한 참조입니다. | 필수 항목 |
| 런타임 계약이 바인딩 구현에 의해 보강되는 리소스를 참조합니다.References the resources for which the runtime contract is augmented by binding implementations. | 필수 항목 |
| 출력 형식을 제어하고 싱크로 전송된 이벤트에 대한 수정을 제어하기 위한 덮어쓰기를 정의합니다. | 선택 사항 |
2.6.1.4.1. 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에 따라 기본
네임스페이스에 있는 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에서 기본
네임스페이스의 working=example
또는 working=sample
라벨이 있는 모든 Pod
오브젝트가 선택됩니다.
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 ...
2.6.1.4.2. CloudEvent 덮어쓰기
ceOverrides
정의에서는 CloudEvent의 출력 형식과 싱크로 전송된 수정 사항을 제어하는 덮어쓰기를 제공합니다. ceOverrides
정의에 대해 여러 필드를 구성할 수 있습니다.
ceOverrides
정의에서는 다음 필드를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
아웃바운드 이벤트에서 추가되거나 재정의되는 특성을 지정합니다. 각 | 선택 사항 |
유효한 CloudEvent
속성 이름만 확장으로 허용됩니다. 확장 덮어쓰기 구성에서 spec 정의 속성을 설정할 수 없습니다. 예를 들어 type
속성을 수정할 수 없습니다.
CloudEvent 덮어쓰기 예
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" } }
2.6.1.4.3. include 레이블
싱크 바인딩을 사용하려면 바인딩.knative.dev/include: "true"
라벨을 리소스가 포함된 리소스 또는 네임스페이스에 할당해야 합니다. 리소스 정의에 레이블이 포함되지 않은 경우 다음을 실행하여 클러스터 관리자가 네임스페이스에 연결할 수 있습니다.
$ oc label namespace <namespace> bindings.knative.dev/include=true
2.6.1.5. SinkBinding과 Service Mesh 통합
사전 요구 사항
- OpenShift Serverless와 통합 Service Mesh가 있습니다.
프로세스
Service
MeshMemberRollapiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display namespace: <namespace> 1 spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 2 sidecar.istio.io/rewriteAppHTTPProbers: "true" spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
Service
리소스를 적용합니다.$ oc apply -f <filename>
SinkBinding
을 생성합니다.apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: name: bind-heartbeat namespace: <namespace> 1 spec: subject: apiVersion: batch/v1 kind: Job 2 selector: matchLabels: app: heartbeat-cron sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
SinkBinding
리소스를 적용합니다.$ oc apply -f <filename>
CronJob
생성:apiVersion: batch/v1 kind: CronJob metadata: name: heartbeat-cron namespace: <namespace> 1 spec: # Run every minute schedule: "* * * * *" jobTemplate: metadata: labels: app: heartbeat-cron bindings.knative.dev/include: "true" spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 2 sidecar.istio.io/rewriteAppHTTPProbers: "true" 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
CronJob
리소스를 적용합니다.$ oc apply -f <filename>
검증
이벤트가 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/test/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": "" }
2.6.2. 컨테이너 소스
컨테이너 소스는 이벤트를 생성하고 이벤트를 싱크로 보내는 컨테이너 이미지를 생성합니다. 컨테이너 소스를 사용하여 컨테이너 이미지 및 이미지 URI를 사용하는 ContainerSource
오브젝트를 생성하여 사용자 정의 이벤트 소스를 생성할 수 있습니다.
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: showcase ...
2.6.2.2. Knative CLI를 사용하여 컨테이너 소스 생성 및 관리
kn source 컨테이너 명령을 사용하여 Knative(
) CLI를 사용하여 컨테이너 소스를 생성하고 관리할 수 있습니다. Knative CLI를 사용하여 이벤트 소스를 생성하면 YAML 파일을 직접 수정하는 것보다 더 효율적이고 직관적인 사용자 인터페이스가 제공됩니다.
kn
컨테이너 소스 생성
$ 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>
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 일 수 있습니다.
- 채널, 브로커 또는 서비스를 이벤트 소스의 이벤트 싱크로 사용하려면 리소스 를 선택합니다.
- URI 를 선택하여 이벤트가 라우팅되는 URI(Uniform Resource Identifier)를 지정합니다.
- 컨테이너 소스 구성을 완료한 후 생성을 클릭합니다.
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" ...
2.6.2.4.1. CloudEvent 덮어쓰기
ceOverrides
정의에서는 CloudEvent의 출력 형식과 싱크로 전송된 수정 사항을 제어하는 덮어쓰기를 제공합니다. ceOverrides
정의에 대해 여러 필드를 구성할 수 있습니다.
ceOverrides
정의에서는 다음 필드를 지원합니다.
필드 | 설명 | 필수 또는 선택 사항 |
---|---|---|
|
아웃바운드 이벤트에서 추가되거나 재정의되는 특성을 지정합니다. 각 | 선택 사항 |
유효한 CloudEvent
속성 이름만 확장으로 허용됩니다. 확장 덮어쓰기 구성에서 spec 정의 속성을 설정할 수 없습니다. 예를 들어 type
속성을 수정할 수 없습니다.
CloudEvent 덮어쓰기 예
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" } }
2.6.2.5. ContainerSource와 서비스 메시 통합
사전 요구 사항
- OpenShift Serverless와 통합 Service Mesh가 있습니다.
프로세스
Service
MeshMemberRollapiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display namespace: <namespace> 1 spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 2 sidecar.istio.io/rewriteAppHTTPProbers: "true" spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest
Service
리소스를 적용합니다.$ oc apply -f <filename>
ServiceMeshMemberRoll
및 sink의 멤버인 네임스페이스에event-display
로 설정된ContainerSource
를 생성합니다.apiVersion: sources.knative.dev/v1 kind: ContainerSource metadata: name: test-heartbeats namespace: <namespace> 1 spec: template: metadata: 2 annotations: sidecar.istio.io/inject: "true" sidecar.istio.io/rewriteAppHTTPProbers: "true" spec: containers: - image: quay.io/openshift-knative/heartbeats:latest name: heartbeats args: - --period=1s env: - name: POD_NAME value: "example-pod" - name: POD_NAMESPACE value: "event-test" sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
ContainerSource
리소스를 적용합니다.$ oc apply -f <filename>
검증
이벤트가 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/test/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": "" }