创建 ContainerSource¶
ContainerSource 对象启动一个容器镜像,该镜像生成事件并将消息发送到 sink URI。您也可以使用 ContainerSource 在 Knative 中支持您自己的事件源。
要使用 ContainerSource 创建自定义事件源,您必须创建一个容器镜像,以及使用您的镜像 URI 的 ContainerSource。
开始之前¶
在您创建 ContainerSource 对象之前,您必须在您的集群上安装了 Knative Eventing。
开发、构建和发布容器镜像¶
您可以使用任何语言开发容器镜像,并可以使用您喜欢的任何工具构建和发布您的镜像。以下是一些基本准则
- ContainerSource 控制器注入两个环境变量:
K_SINK
和K_CE_OVERRIDES
,分别从spec.sink
和spec.ceOverrides
解析。 - 事件消息将发送到
K_SINK
中指定的 sink URI。消息必须以 CloudEvents HTTP 格式 发送 POST 请求。
创建 ContainerSource 对象¶
-
构建事件源的镜像并将其发布到您的镜像仓库。您的镜像必须读取环境变量
K_SINK
并将消息发布到K_SINK
中指定的 URL。您可以使用以下 YAML 部署演示
heartbeats
事件源apiVersion: sources.knative.dev/v1 kind: ContainerSource metadata: name: heartbeat-source spec: template: spec: containers: - image: gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeats:latest name: heartbeats sink: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
-
通过运行以下命令为您的 ContainerSource 创建一个命名空间
kubectl create namespace <namespace>
其中
<namespace>
是您希望 ContainerSource 使用的命名空间。例如,heartbeat-source
。 -
创建 sink。如果您还没有 sink,您可以使用以下 Knative Service,它将传入的消息转储到其日志中
注意
要创建 Knative 服务,您必须在您的集群上安装了 Knative Serving。
-
要创建 sink,请运行以下命令
kn service create event-display --port 8080 --image gcr.io/knative-releases/knative.dev/eventing/cmd/event_display
-
使用以下示例创建一个 YAML 文件
apiVersion: apps/v1 kind: Deployment metadata: name: event-display spec: replicas: 1 selector: matchLabels: &labels app: event-display template: metadata: labels: *labels spec: containers: - name: event-display image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display --- kind: Service apiVersion: v1 metadata: name: event-display spec: selector: app: event-display ports: - protocol: TCP port: 80 targetPort: 8080
-
通过运行以下命令应用 YAML 文件
其中kubectl apply -f <filename>.yaml
<filename>
是您在上一步骤中创建的文件的名称。
-
-
创建具有特定参数和环境设置的具体 ContainerSource
-
要创建 ContainerSource,请运行以下命令
其中kn source container create <name> --image <image-uri> --sink <sink> -e POD_NAME=<pod-name> -e POD_NAMESPACE=<pod-namespace>
<name>
是您希望为 ContainerSource 对象指定的名称,例如test-heartbeats
。<image-uri>
对应于您在步骤 1 中构建和发布的镜像 URI,例如gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeats
。<pod-name>
是容器运行所在的 Pod 的名称,例如mypod
。<pod-namespace>
是 Pod 运行所在的命名空间,例如event-test
。<sink>
是您 sink 的名称,例如event-display
。有关可用选项的列表,请参阅 Knative 客户端文档。
-
使用以下模板创建一个 YAML 文件
其中apiVersion: sources.knative.dev/v1 kind: ContainerSource metadata: name: <containersource-name> spec: template: spec: containers: - image: <event-source-image-uri> name: <container-name> env: - name: POD_NAME value: "<pod-name>" - name: POD_NAMESPACE value: "<pod-namespace>" sink: ref: apiVersion: v1 kind: Service name: <sink>
<namespace>
是您为 ContainerSource 创建的命名空间,例如containersource-example
。<containersource-name>
是您希望为 ContainerSource 指定的名称,例如test-heartbeats
。<event-source-image-uri>
对应于您在步骤 1 中构建和发布的镜像 URI,例如gcr.io/knative-nightly/knative.dev/eventing/cmd/heartbeats
。<container-name>
是您事件源的名称,例如heartbeats
。<pod-name>
是容器运行所在的 Pod 的名称,例如mypod
。<pod-namespace>
是 Pod 运行所在的命名空间,例如event-test
。<sink>
是您 sink 的名称,例如event-display
。
有关您可以为 ContainerSource 对象配置的字段的更多信息,请参阅 ContainerSource 参考。
-
通过运行以下命令应用 YAML 文件
其中kubectl apply -f <filename>.yaml
<filename>
是您在上一步骤中创建的文件的名称。
注意
设置参数和环境变量,并将其传递给容器。
-
验证 ContainerSource 对象¶
-
通过运行以下命令查看事件消费者的日志
其中kubectl -n <namespace> logs -l <pod-name> --tail=200
<namespace>
是包含 ContainerSource 对象的命名空间。<pod-name>
是容器运行所在的 Pod 的名称。
例如
$ kubectl -n containersource-example logs -l app=event-display --tail=200
-
验证输出是否返回 ContainerSource 发送到 sink 的事件的属性。在以下示例中,该命令已返回 ContainerSource 发送到
event-display
服务的事件的Attributes
和Data
属性☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.eventing.samples.heartbeat source: https://knative.k8s.ac.cn/eventing/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": 2, "label": "" }
删除 ContainerSource 对象¶
要删除 ContainerSource 对象和命名空间中的所有相关资源
-
通过运行以下命令删除命名空间
kubectl delete namespace <namespace>
其中
<namespace>
是包含 ContainerSource 对象的命名空间。
参考文档¶
请参阅 ContainerSource 参考。