5.8. 创建 API 服务器源
API 服务器源是一个事件源,可用于将事件接收器(sink),如 Knative 服务,连接到 Kubernetes API 服务器。API 服务器源监视 Kubernetes 事件并将其转发到 Knative Eventing 代理。
5.8.1. 使用 Web 控制台创建 API 服务器源
在集群中安装 Knative Eventing 后,您可以使用 web 控制台创建 API 服务器源。使用 OpenShift Container Platform Web 控制台提供了一个简化且直观的用户界面来创建事件源。
先决条件
- 已登陆到 OpenShift Container Platform Web 控制台。
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Eventing。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
-
已安装 OpenShift CLI(
oc
)。
如果要重新使用现有服务帐户,您可以修改现有的 ServiceAccount
资源,使其包含所需的权限,而不是创建新资源。
以 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
应用 YAML 文件:
$ oc apply -f <filename>
-
在 Developer 视角中,导航到 +Add
Event Source。此时会显示 Event Sources 页面。 - 可选:如果您的事件源有多个供应商,请从 Providers 列表中选择所需的供应商,以过滤供应商的可用事件源。
- 选择 ApiServerSource,然后点 Create Event Source。此时会显示 Create Event Source 页面。
使用 Form view 或 YAML view 配置 ApiServerSource 设置:
注意您可以在 Form view 和 YAML view 间进行切换。在不同视图间切换时数据会被保留。
-
输入
v1
作为 APIVERSION 和Event
作为 KIND。 - 为您创建的服务帐户选择 Service Account Name。
- 为事件源选择 Sink。Sink 可以是一个 资源,如频道、代理或服务,也可以是一个 URI。
-
输入
- 点 Create。
验证
创建 API 服务器源后,您会在 Topology 视图中看到它连接到接收器的服务。
如果使用 URI sink,请右键点击 URI sink
删除 API 服务器源
- 导航到 Topology 视图。
右键点击 API 服务器源并选择 Delete ApiServerSource。
5.8.2. 使用 Knative CLI 创建 API 服务器源
您可以使用 kn source apiserver create
命令,使用 kn
CLI 创建 API 服务器源。使用 kn
CLI 创建 API 服务器源可提供比直接修改 YAML 文件更精简且直观的用户界面。
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Eventing。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
-
已安装 OpenShift CLI(
oc
)。 -
已安装 Knative (
kn
) CLI。
如果要重新使用现有服务帐户,您可以修改现有的 ServiceAccount
资源,使其包含所需的权限,而不是创建新资源。
以 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
应用 YAML 文件:
$ oc apply -f <filename>
创建具有事件 sink 的 API 服务器源。在以下示例中,sink 是一个代理:
$ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
要检查 API 服务器源是否已正确设置,请创建一个 Knative 服务,在日志中转储传入的信息:
$ kn service create <service_name> --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
如果您使用代理作为事件 sink,请创建一个触发器将事件从
default
代理过滤到服务:$ kn trigger create <trigger_name> --sink ksvc:<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/v1) 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", ... }
删除 API 服务器源
删除触发器:
$ kn trigger delete <trigger_name>
删除事件源:
$ kn source apiserver delete <source_name>
删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml
5.8.2.1. Knative CLI sink 标记
当使用 Knative (kn
) CLI 创建事件源时,您可以使用 --sink
标志指定事件从该资源发送到的接收器。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
。
5.8.3. 使用 YAML 文件创建 API 服务器源
使用 YAML 文件创建 Knative 资源使用声明性 API,它允许您以可重复的方式描述事件源。要使用 YAML 创建 API 服务器源,您必须创建一个 YAML 文件来定义 ApiServerSource
对象,然后使用 oc apply
命令应用它。
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Eventing。
- 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
-
您已在与 API 服务器源 YAML 文件中定义的相同的命名空间中创建
default
代理。 -
安装 OpenShift CLI (
oc
) 。
如果要重新使用现有服务帐户,您可以修改现有的 ServiceAccount
资源,使其包含所需的权限,而不是创建新资源。
以 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
应用 YAML 文件:
$ oc apply -f <filename>
将 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
应用
ApiServerSource
YAML 文件:$ oc apply -f <filename>
要检查 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/knative-eventing-sources-event-display:latest
应用
Service
YAML 文件:$ oc apply -f <filename>
创建一个
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
应用
Trigger
YAML 文件:$ oc apply -f <filename>
通过在 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/v1 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", ... }
删除 API 服务器源
删除触发器:
$ oc delete -f trigger.yaml
删除事件源:
$ oc delete -f k8s-events.yaml
删除服务帐户、集群角色和集群绑定:
$ oc delete -f authentication.yaml