11.3. 使用 ApiServerSource

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

注意

以下两个流程都要求您创建 YAML 文件。

如果更改了示例中使用的 YAML 文件的名称,则需要更新对应的 CLI 命令。

11.3.1. 将 ApiServerSource 与 Knative CLI (kn) 结合使用

本节介绍了使用 kn 命令创建 ApiServerSource 所需的步骤。

先决条件

  • 您必须安装了 OpenShift Serverless、Knative Serving 和 Eventing 组件以及 kn CLI。

流程

  1. 为 ApiServerSource 创建服务帐户、角色和角色绑定。

    您可以创建名为 authentication.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
    1 2 3 4
    将这个命名空间更改为已选择安装 ApiServerSource 的命名空间。
    注意

    如果要重新使用具有适当权限的现有服务帐户,您必须修改该服务帐户的 authentication.yaml

    创建服务帐户、角色绑定和集群绑定:

    $ oc apply -f authentication.yaml
  2. 创建使用代理作为事件 sink 的 ApiServerSource:

    $ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
  3. 要检查 ApiServerSource 是否已正确设置,请创建一个 Knative 服务,在日志中转储传入的信息。

    $ kn service create <service_name> --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
  4. 创建触发器将事件从 default 代理过滤到服务:

    $ kn trigger create <trigger_name> --sink svc:<service_name>
  5. 通过在 default 命名空间中启动 Pod 来创建事件:

    $ oc create deployment hello-node --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
  6. 通过检查以下命令生成的输出来检查是否正确映射了控制器:

    $ 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/v1alpha1)
    Resources:
      Kind:        event (v1)
      Controller:  false
    Conditions:
      OK TYPE                     AGE REASON
      ++ Ready                     3m
      ++ Deployed                  3m
      ++ SinkProvided              3m
      ++ SufficientPermissions     3m
      ++ EventTypesProvided        3m

验证步骤

您可以通过查看消息转储程序功能日志来验证 Kubernetes 事件是否已发送到 Knative。

  1. 获取 Pod:

    $ oc get pods
  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{hello-node}",
          "kind": "Pod",
          "name": "hello-node",
          "namespace": "default",
           .....
        },
        "kind": "Event",
        "message": "Started container",
        "metadata": {
          "name": "hello-node.159d7608e3a3572c",
          "namespace": "default",
          ....
        },
        "reason": "Started",
        ...
      }

11.3.2. 使用 Knative CLI(kn)删除 ApiServerSource

本节介绍了使用 knoc 命令删除 ApiServerSource、触发器、服务、服务帐户、集群角色和集群绑定的步骤。

先决条件

  • 已安装了 kn CLI。

流程

  1. 删除触发器:

    $ kn trigger delete <trigger_name>
  2. 删除服务:

    $ kn service delete <service_name>
  3. 删除事件源:

    $ kn source apiserver delete <source_name>
  4. 删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml

11.3.3. 使用 YAML 方法的 ApiServerSource

本指南描述了使用 YAML 文件创建 ApiServerSource 所需的步骤。

先决条件

  • 您需要安装 Knative Serving 和 Eventing。
  • 您需要在与 ApiServerSource YAML 文件中定义的相同的命名空间中创建 default 代理。

流程

  1. 要为 ApiServerSource 创建服务帐户、角色和角色绑定,请创建一个名为 authentication.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
    1 2 3 4
    将这个命名空间更改为已选择安装 ApiServerSource 的命名空间。
    注意

    如果要重新使用具有适当权限的现有服务帐户,您必须修改该服务帐户的 authentication.yaml

    创建 authentication.yaml 文件后,应用该文件:

    $ oc apply -f authentication.yaml
  2. 要创建 ApiServerSource 事件源,请创建一个名为 k8s-events.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/v1beta1
          kind: Broker
          name: default

    创建 k8s-events.yaml 文件后,应用它:

    $ oc apply -f k8s-events.yaml
  3. 要检查 ApiServerSource 是否已正确设置,请创建一个 Knative 服务,在日志中转储传入的信息。

    将以下示例 YAML 复制到一个名为 service.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:v0.13.2

    创建 service.yaml 文件后应用它:

    $ oc apply -f service.yaml
  4. 要从 default 代理创建触发器,将事件过滤到上一步中创建的服务,请创建一个名为 trigger.yaml 的文件,并将以下示例代码复制到其中:

    apiVersion: eventing.knative.dev/v1alpha1
    kind: Trigger
    metadata:
      name: event-display-trigger
      namespace: default
    spec:
      subscriber:
        ref:
          apiVersion: serving.knative.dev/v1
          kind: Service
          name: event-display

    创建 trigger.yaml 文件后,应用该文件:

    $ oc apply -f trigger.yaml
  5. 要创建事件,请在 default 命名空间中启动 Pod:

    $ oc create deployment hello-node --image=quay.io/openshift-knative/knative-eventing-sources-event-display
  6. 要检查控制器是否已正确映射,请输入以下命令并检查输出:

    $ 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/v1beta1
          kind: Broker
          name: default

验证步骤

要验证 Kubernetes 事件是否已发送到 Knative,您可以查看消息转储程序功能日志。

  1. 获取 Pod:

    $ oc get pods
  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{hello-node}",
          "kind": "Pod",
          "name": "hello-node",
          "namespace": "default",
           .....
        },
        "kind": "Event",
        "message": "Started container",
        "metadata": {
          "name": "hello-node.159d7608e3a3572c",
          "namespace": "default",
          ....
        },
        "reason": "Started",
        ...
      }

11.3.4. 删除 ApiServerSource

本节论述了如何通过删除 YAML 文件删除 ApiServerSource、触发器、服务、服务帐户、集群角色和集群绑定。

流程

  1. 删除触发器:

    $ oc delete -f trigger.yaml
  2. 删除服务:

    $ oc delete -f service.yaml
  3. 删除事件源:

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

    $ oc delete -f authentication.yaml