11.3. 使用 ApiServerSource

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

注意

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

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

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

本指南描述了使用 kn 命令创建、管理和删除 ApiServerSource 所需的步骤。

先决条件

  • 您需要安装 Knative Serving 和 Eventing。
  • 您需要在安装 ApiServerSource 的同一命名空间中创建 default 代理。
  • 您需要安装 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 --filename authentication.yaml
  2. 输入以下命令来创建 ApiServerSource 事件源:

    $ kn source apiserver create testevents --sink broker:default --resource "event:v1" --service-account events-sa --mode Resource
  3. 要检查 ApiServerSource 是否已正确设置,请使用以下命令创建一个 Knative 服务,将传入的信息转储到日志中:

    $ kn service create event-display --image quay.io/openshift-knative/knative-eventing-sources-event-display:v0.13.2
  4. 输入以下 kn 命令,从 default 代理创建 trigger,将事件过滤到上一步中创建的服务:

    $ kn trigger create event-display-trigger --sink svc:event-display
  5. 通过在 default 命名空间中启动 pod 来创建事件。运行以下:

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

    $ kn source apiserver describe testevents

    输出应类似于:

    Name:                testevents
    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 Eventing 系统。

您可以输入以下命令来查看消息转储程序功能日志:

$ 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.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.1.1. 删除 ApiServerSource

您可以通过输入以下 knoc 命令来删除本指南中创建的 ApiServerSource、触发器、服务、服务帐户、集群角色和集群绑定:

$ kn trigger delete event-display-trigger
$ kn service delete event-display
$ kn source apiserver delete testevents
$ oc delete -f authentication.yaml

11.3.2. 使用 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 --filename 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 --filename 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 --filename service.yaml
  4. default 代理创建触发器(trigger),以便将事件过滤到上一步创建的服务。

    您可以通过创建名为 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 --filename 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 Eventing 系统。

您可以输入以下命令来查看消息转储程序功能日志:

$ 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.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.1. 删除 ApiServerSource

您可以通过输入以下 oc 命令来删除本指南中创建的 ApiServerSource、触发器、服务、服务帐户、集群角色和集群绑定:

$ oc delete --filename trigger.yaml
$ oc delete --filename service.yaml
$ oc delete --filename k8s-events.yaml
$ oc delete --filename authentication.yaml