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。
流程
为 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
注意如果要重新使用具有适当权限的现有服务帐户,您必须修改该服务帐户的
authentication.yaml
。创建服务帐户、角色绑定和集群绑定:
$ oc apply -f authentication.yaml
创建使用代理作为事件 sink 的 ApiServerSource:
$ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
要检查 ApiServerSource 是否已正确设置,请创建一个 Knative 服务,在日志中转储传入的信息。
$ kn service create <service_name> --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
创建触发器将事件从
default
代理过滤到服务:$ kn trigger create <trigger_name> --sink svc:<service_name>
通过在 default 命名空间中启动 Pod 来创建事件:
$ oc create deployment hello-node --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
通过检查以下命令生成的输出来检查是否正确映射了控制器:
$ 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。
获取 Pod:
$ oc get pods
查看 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
本节介绍了使用 kn
和 oc
命令删除 ApiServerSource、触发器、服务、服务帐户、集群角色和集群绑定的步骤。
先决条件
-
已安装了
kn
CLI。
流程
删除触发器:
$ kn trigger delete <trigger_name>
删除服务:
$ kn service delete <service_name>
删除事件源:
$ kn source apiserver delete <source_name>
- 删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml
11.3.3. 使用 YAML 方法的 ApiServerSource
本指南描述了使用 YAML 文件创建 ApiServerSource 所需的步骤。
先决条件
- 您需要安装 Knative Serving 和 Eventing。
-
您需要在与 ApiServerSource YAML 文件中定义的相同的命名空间中创建
default
代理。
流程
要为 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
注意如果要重新使用具有适当权限的现有服务帐户,您必须修改该服务帐户的
authentication.yaml
。创建
authentication.yaml
文件后,应用该文件:$ oc apply -f authentication.yaml
要创建 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
要检查 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
要从
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
要创建事件,请在 default 命名空间中启动 Pod:
$ oc create deployment hello-node --image=quay.io/openshift-knative/knative-eventing-sources-event-display
要检查控制器是否已正确映射,请输入以下命令并检查输出:
$ 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,您可以查看消息转储程序功能日志。
获取 Pod:
$ oc get pods
查看 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、触发器、服务、服务帐户、集群角色和集群绑定。
流程
删除触发器:
$ oc delete -f trigger.yaml
删除服务:
$ oc delete -f service.yaml
删除事件源:
$ oc delete -f k8s-events.yaml
删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml