跳到内容

创建 ContainerSource

API version v1

ContainerSource 对象启动一个容器镜像,该镜像生成事件并将消息发送到 sink URI。您也可以使用 ContainerSource 在 Knative 中支持您自己的事件源。

要使用 ContainerSource 创建自定义事件源,您必须创建一个容器镜像,以及使用您的镜像 URI 的 ContainerSource。

开始之前

在您创建 ContainerSource 对象之前,您必须在您的集群上安装了 Knative Eventing

开发、构建和发布容器镜像

您可以使用任何语言开发容器镜像,并可以使用您喜欢的任何工具构建和发布您的镜像。以下是一些基本准则

  • ContainerSource 控制器注入两个环境变量:K_SINKK_CE_OVERRIDES,分别从 spec.sinkspec.ceOverrides 解析。
  • 事件消息将发送到 K_SINK 中指定的 sink URI。消息必须以 CloudEvents HTTP 格式 发送 POST 请求。

创建 ContainerSource 对象

  1. 构建事件源的镜像并将其发布到您的镜像仓库。您的镜像必须读取环境变量 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
    
  2. 通过运行以下命令为您的 ContainerSource 创建一个命名空间

    kubectl create namespace <namespace>
    

    其中 <namespace> 是您希望 ContainerSource 使用的命名空间。例如,heartbeat-source

  3. 创建 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
      
    1. 使用以下示例创建一个 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
      
    2. 通过运行以下命令应用 YAML 文件

      kubectl apply -f <filename>.yaml
      
      其中 <filename> 是您在上一步骤中创建的文件的名称。

  4. 创建具有特定参数和环境设置的具体 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 客户端文档
    1. 使用以下模板创建一个 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 参考

    2. 通过运行以下命令应用 YAML 文件

      kubectl apply -f <filename>.yaml
      
      其中 <filename> 是您在上一步骤中创建的文件的名称。

    注意

    设置参数和环境变量,并将其传递给容器。

验证 ContainerSource 对象

  1. 通过运行以下命令查看事件消费者的日志

    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
    
  2. 验证输出是否返回 ContainerSource 发送到 sink 的事件的属性。在以下示例中,该命令已返回 ContainerSource 发送到 event-display 服务的事件的 AttributesData 属性

    ☁️  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 参考

我们使用分析和 Cookie 来了解网站流量。有关您使用我们网站的信息将与 Google 共享,用于该目的。 了解更多。