11.3. 使用 API 服务器源
API 服务器源是一个事件源,可用于将事件接收器(sink),如 Knative 服务,连接到 Kubernetes API 服务器。API 服务器源监视 Kubernetes 事件并将其转发到 Knative Eventing 代理。
以下两个流程都要求您创建 YAML 文件。
如果更改了示例中使用的 YAML 文件的名称,则需要更新对应的 CLI 命令。
11.3.1. 通过 Knative CLI 使用 API 服务器源
本节介绍了使用 kn
命令创建 ApiServerSource
对象所需的步骤。
先决条件
- 在集群中安装了 Knative Serving 和 Eventing。
-
您已在安装 API 服务器源的同一命名空间中创建了
default
代理。 -
已安装
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
创建使用代理作为事件接收器的
ApiServerSource
对象:$ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
创建 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
通过检查以下命令生成的输出来检查是否正确映射了控制器:
$ 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。
获取 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 删除 API 服务器源
本节介绍了使用 kn
和 oc
命令删除 ApiServerSource
对象、触发器、服务、服务帐户、集群角色和集群绑定的步骤。
先决条件
-
已安装了
kn
CLI。
流程
删除触发器:
$ kn trigger delete <trigger_name>
删除服务:
$ kn service delete <service_name>
删除 API 服务器源:
$ kn source apiserver delete <source_name>
- 删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml
11.3.3. 使用 YAML 文件创建 API 服务器源
本指南描述了使用 YAML 文件创建 ApiServerSource
对象所需的步骤。
先决条件
- 在集群中安装了 Knative Serving 和 Eventing。
-
您已在与
ApiServerSource
对象中定义的相同的命名空间中创建default
代理。
流程
要为 API 服务器源创建服务帐户、角色和角色绑定,请创建一个名为
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
要检查 API 服务器源是否已正确设置,请创建一个 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. 删除 API 服务器源
本节论述了如何通过删除 YAML 文件删除 ApiServerSource
对象、触发器、服务、服务帐户、集群角色和集群绑定。
流程
删除触发器:
$ oc delete -f trigger.yaml
删除服务:
$ oc delete -f service.yaml
删除 API 服务器源:
$ oc delete -f k8s-events.yaml
删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml