×

API 服务器源是一个事件源,可用于将事件接收器(例如 Knative 服务)连接到 Kubernetes API 服务器。API 服务器源监视 Kubernetes 事件并将它们转发到 Knative Eventing 代理。

使用 Web 控制台创建 API 服务器源

在集群上安装 Knative Eventing 后,您可以使用 Web 控制台创建 API 服务器源。使用 OpenShift Container Platform Web 控制台提供简化且直观的用户界面来创建事件源。

先决条件
  • 您已登录到 OpenShift Container Platform Web 控制台。

  • OpenShift Serverless 运算符和 Knative Eventing 已安装在集群上。

  • 您已创建项目或有权访问具有适当角色和权限的项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。

  • 您已安装 OpenShift CLI (oc)。

步骤

如果要重用现有的服务帐户,可以修改现有的 ServiceAccount 资源以包含所需的权限,而不是创建新的资源。

  1. 将事件源的服务帐户、角色和角色绑定创建为 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 (1)
    rules:
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - get
          - list
          - watch
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: k8s-ra-event-watcher
      namespace: default (1)
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: event-watcher
    subjects:
      - kind: ServiceAccount
        name: events-sa
        namespace: default (1)
    1 将此命名空间更改为您为安装事件源选择的命名空间。
  2. 应用 YAML 文件

    $ oc apply -f <filename>
  3. 在**开发者**视角中,导航到**+添加** → **事件源**。将显示**事件源**页面。

  4. 可选:如果您的事件源有多个提供程序,请从**提供程序**列表中选择所需的提供程序,以筛选来自该提供程序的可用事件源。

  5. 选择**ApiServerSource**,然后单击**创建事件源**。将显示**创建事件源**页面。

  6. 使用**表单视图**或**YAML 视图**配置**ApiServerSource** 设置。

    您可以在**表单视图**和**YAML 视图**之间切换。在视图之间切换时,数据会持久保存。

    1. 输入v1作为**APIVERSION**和Event作为**KIND**。

    2. 选择您创建的服务帐户的**服务帐户名称**。

    3. 在**目标**部分,选择您的事件接收器。这可以是**资源**或**URI**

      1. 选择**资源**以使用通道、代理或服务作为事件源的事件接收器。

      2. 选择**URI**以指定事件路由到的统一资源标识符 (URI)。

  7. 单击**创建**。

验证
  • 创建 API 服务器源后,请在**拓扑**视图中查看它是否已连接到事件接收器。

    ApiServerSource Topology view

如果使用 URI 接收器,您可以通过右键单击 **URI 接收器** → **编辑 URI** 来修改 URI。

删除 API 服务器源
  1. 导航到 **拓扑** 视图。

  2. 右键单击 API 服务器源,然后选择 **删除 ApiServerSource**。

    Delete the ApiServerSource

使用 Knative CLI 创建 API 服务器源

您可以使用 `kn source apiserver create` 命令使用 `kn` CLI 创建 API 服务器源。与直接修改 YAML 文件相比,使用 `kn` CLI 创建 API 服务器源提供了更简化和直观的用户界面。

先决条件
  • OpenShift Serverless 运算符和 Knative Eventing 已安装在集群上。

  • 您已创建项目或有权访问具有适当角色和权限的项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。

  • 您已安装 OpenShift CLI (oc)。

  • 您已安装 Knative ( `kn` ) CLI。

步骤

如果要重用现有的服务帐户,可以修改现有的 ServiceAccount 资源以包含所需的权限,而不是创建新的资源。

  1. 将事件源的服务帐户、角色和角色绑定创建为 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 (1)
    rules:
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - get
          - list
          - watch
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: k8s-ra-event-watcher
      namespace: default (1)
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: event-watcher
    subjects:
      - kind: ServiceAccount
        name: events-sa
        namespace: default (1)
    1 将此命名空间更改为您为安装事件源选择的命名空间。
  2. 应用 YAML 文件

    $ oc apply -f <filename>
  3. 创建一个具有事件接收器的 API 服务器源。在以下示例中,接收器是一个代理

    $ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
  4. 要检查 API 服务器源是否已正确设置,请创建一个 Knative 服务,该服务将其传入的消息转储到其日志中

    $ kn service create event-display --image quay.io/openshift-knative/showcase
  5. 如果您使用代理作为事件接收器,请创建一个触发器,以将来自 `default` 代理的事件过滤到服务

    $ kn trigger create <trigger_name> --sink ksvc:event-display
  6. 通过在默认命名空间中启动 Pod 来创建事件

    $ oc create deployment event-origin --image quay.io/openshift-knative/showcase
  7. 通过检查以下命令生成的输出来检查控制器是否已正确映射

    $ 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,请查看事件显示日志或使用 Web 浏览器查看事件。

  • 要在 Web 浏览器中查看事件,请打开以下命令返回的链接

    $ kn service describe event-display -o url
    Example visualization of ApiServerSource event
    图 1. 示例浏览器页面
  • 或者,要在终端中查看日志,请通过输入以下命令查看 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{event-origin}",
          "kind": "Pod",
          "name": "event-origin",
          "namespace": "default",
           .....
        },
        "kind": "Event",
        "message": "Started container",
        "metadata": {
          "name": "event-origin.159d7608e3a3572c",
          "namespace": "default",
          ....
        },
        "reason": "Started",
        ...
      }
删除 API 服务器源
  1. 删除触发器

    $ kn trigger delete <trigger_name>
  2. 删除事件源

    $ kn source apiserver delete <source_name>
  3. 删除服务帐户、集群角色和集群绑定

    $ oc delete -f authentication.yaml

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`。

使用 YAML 文件创建 API 服务器源

使用 YAML 文件创建 Knative 资源使用声明式 API,使您可以声明性和可重复地描述事件源。要使用 YAML 创建 API 服务器源,您必须创建一个定义 `ApiServerSource` 对象的 YAML 文件,然后使用 `oc apply` 命令应用它。

先决条件
  • OpenShift Serverless 运算符和 Knative Eventing 已安装在集群上。

  • 您已创建项目或有权访问具有适当角色和权限的项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。

  • 您已在与 API 服务器源 YAML 文件中定义的命名空间相同的命名空间中创建了 `default` 代理。

  • 安装 OpenShift CLI (`oc`)。

步骤

如果要重用现有的服务帐户,可以修改现有的 ServiceAccount 资源以包含所需的权限,而不是创建新的资源。

  1. 将事件源的服务帐户、角色和角色绑定创建为 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 (1)
    rules:
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - get
          - list
          - watch
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: k8s-ra-event-watcher
      namespace: default (1)
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: event-watcher
    subjects:
      - kind: ServiceAccount
        name: events-sa
        namespace: default (1)
    1 将此命名空间更改为您为安装事件源选择的命名空间。
  2. 应用 YAML 文件

    $ oc apply -f <filename>
  3. 创建一个 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
  4. 应用 `ApiServerSource` YAML 文件

    $ oc apply -f <filename>
  5. 要检查 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/showcase
  6. 应用 `Service` YAML 文件

    $ oc apply -f <filename>
  7. 创建一个 `Trigger` 对象作为 YAML 文件,该文件将事件从上一步中创建的 `default` 代理过滤到服务

    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
  8. 应用 `Trigger` YAML 文件

    $ oc apply -f <filename>
  9. 通过在默认命名空间中启动 Pod 来创建事件

    $ oc create deployment event-origin --image=quay.io/openshift-knative/showcase
  10. 通过输入以下命令并检查输出来检查控制器是否已正确映射

    $ 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,您可以查看事件显示日志或使用 Web 浏览器查看事件。

  • 要在 Web 浏览器中查看事件,请打开以下命令返回的链接

    $ oc get ksvc event-display -o jsonpath='{.status.url}'
    Example visualization of ApiServerSource event
    图 2. 示例浏览器页面
  • 要在终端中查看日志,请通过输入以下命令查看 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{event-origin}",
          "kind": "Pod",
          "name": "event-origin",
          "namespace": "default",
           .....
        },
        "kind": "Event",
        "message": "Started container",
        "metadata": {
          "name": "event-origin.159d7608e3a3572c",
          "namespace": "default",
          ....
        },
        "reason": "Started",
        ...
      }
删除 API 服务器源
  1. 删除触发器

    $ oc delete -f trigger.yaml
  2. 删除事件源

    $ oc delete -f k8s-events.yaml
  3. 删除服务帐户、集群角色和集群绑定

    $ oc delete -f authentication.yaml