安装 Knative 后台插件¶
Knative 社区计划为 Knative 及其相应的后端提供一组后台插件。目前有一个插件可用,即 Event Mesh 插件。
Event Mesh 插件¶
Event Mesh 插件是一个后台插件,允许您查看和管理 Knative 事件资源。
后台插件与 Kubernetes 集群中运行的特殊后端进行通信,并与 Kubernetes API 服务器进行通信。
该插件的演示设置可从 https://github.com/aliok/knative-backstage-demo 获取。
该插件有两种分发方式:静态和动态。在本文件中,我们将重点介绍静态分发。对于动态分发,请参阅插件存储库中的 动态插件自述文件。
安装¶
该插件需要安装在后台实例中,它与之通信的后端需要安装在 Kubernetes 集群中。
插件后端控制器安装¶
VERSION="latest" # or a specific version like knative-v1.15.0
kubectl apply -f https://github.com/knative-extensions/backstage-plugins/releases/${VERSION}/download/eventmesh.yaml
这将在 Kubernetes 集群中安装后端控制器。后端的职责是与 Kubernetes API 服务器通信,并向插件提供必要的信息。
后台插件安装¶
在您的后台目录中,运行以下命令来安装插件
VERSION="latest" # or a specific version like 1.15.0 from https://npmjs.net.cn/package/@knative-extensions/plugin-knative-event-mesh-backend
yarn workspace backend add @knative-extensions/plugin-knative-event-mesh-backend@${VERSION}
Backstage 有一个旧的后端系统,正在被一个新系统取代。如果您使用的是旧的后端系统,您可以按照以下说明安装插件。
要了解有关新旧后端系统的更多信息,请参阅 Backstage 文档。
信息
我们知道,在 Kubernetes 控制器和 Backstage 后端系统中都使用了 Backend
这个词。Backstage 后端系统与我们之前安装的 Kubernetes 控制器不同。控制器是一个在 Kubernetes 集群中运行的 Kubernetes 控制器,它与 Kubernetes API 服务器进行通信。Backstage 后端系统是一个运行后端插件的框架,这些插件与数据提供者进行通信,例如上面提到的 Kubernetes 控制器。
在新的 Backstage 后端系统上启用插件¶
要在新的后端系统上安装,请将以下内容添加到 packages/backend/index.ts
文件中
import { createBackend } from '@backstage/backend-defaults';
const backend = createBackend();
// Other plugins/modules
backend.add(import('@knative-extensions/plugin-knative-event-mesh-backend/alpha'));
警告
如果您对 app-config.yaml
文件中的计划进行了任何更改,那么请重新启动以应用更改。
在旧的 Backstage 后端系统上启用插件¶
为实体提供者配置计划并启用处理器。将以下代码添加到 packages/backend/src/plugins/catalog.ts
文件中
import {CatalogClient} from "@backstage/catalog-client";
import {
KnativeEventMeshProcessor,
KnativeEventMeshProvider
} from '@knative-extensions/plugin-knative-event-mesh-backend';
export default async function createPlugin(
env:PluginEnvironment,
):Promise<Router> {
const builder = await CatalogBuilder.create(env);
/* ... other processors and/or providers ... */
// ADD THESE
builder.addEntityProvider(
KnativeEventMeshProvider.fromConfig(env.config, {
logger: env.logger,
scheduler: env.scheduler,
}),
);
const catalogApi = new CatalogClient({
discoveryApi: env.discovery,
});
const knativeEventMeshProcessor = new KnativeEventMeshProcessor(catalogApi, env.logger);
builder.addProcessor(knativeEventMeshProcessor);
/* ... other processors and/or providers ... */
const {processingEngine, router} = await builder.build();
await processingEngine.start();
return router;
}
配置¶
信息
注意:后端需要从后台实例访问。如果您在不公开后端的情况下运行后端,则可以使用 kubectl port-forward
将后端服务的端口转发到您的本地机器以进行测试。
kubectl port-forward -n knative-eventing svc/eventmesh-backend 8080:8080
该插件需要配置为与后端进行通信。它可以在后台实例的 app-config.yaml
文件中配置,并允许配置一个或多个提供者。
使用 knativeEventMesh
标记开始配置 Backstage 的 app-config.yaml
文件
catalog:
providers:
knativeEventMesh:
dev:
token: '${KNATIVE_EVENT_MESH_TOKEN}' # SA token to authenticate to the backend
baseUrl: '${KNATIVE_EVENT_MESH_BACKEND}' # URL of the backend installed in the cluster
schedule: # optional; same options as in TaskScheduleDefinition
# supports cron, ISO duration, "human duration" as used in code
frequency: { minutes: 1 }
# supports ISO duration, "human duration" as used in code
timeout: { minutes: 1 }
您可以在 app-config.yaml
文件中手动更改占位符,也可以使用环境变量来设置值。环境变量可以在启动后台实例之前设置,如下所示
export KNATIVE_EVENT_MESH_TOKEN=<your-token>
export KNATIVE_EVENT_MESH_BACKEND=<backend-url>
KNATIVE_EVENT_MESH_BACKEND
的值应该是后端服务的 URL。如果您在与后台实例相同的集群中运行后端服务,则可以使用服务名称作为 URL,例如 http://eventmesh-backend.knative-eventing.svc.cluster.local
。如果后台实例未在同一个集群中运行,则可以使用后端服务的外部 URL。或者,如果您在不公开后端的情况下运行后端以进行测试,则可以使用上面提到的 kubectl port-forward
。
KNATIVE_EVENT_MESH_TOKEN
的值应该是具有列出集群中 Knative 事件资源的必要权限的服务帐户令牌。后端将使用此令牌对 Kubernetes API 服务器进行身份验证。这是出于安全原因所需的,否则(如果后端直接使用 SA 令牌运行),后端将对集群拥有完全访问权限,并将向任何可以访问后端的人员返回所有资源。
令牌将需要以下权限才能正常工作
- 对
eventing.knative.dev/brokers
、eventing.knative.dev/eventtypes
和eventing.knative.dev/triggers
资源的get
、list
和watch
权限 - 对所有资源的
get
权限以获取触发器的订阅者
您可以创建一个具有必要权限的 ClusterRole,并将其绑定到服务帐户令牌。
一个示例配置如下所示
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-eventmesh-backend-service-account
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: my-eventmesh-backend-cluster-role
rules:
# permissions for eventtypes, brokers and triggers
- apiGroups:
- "eventing.knative.dev"
resources:
- brokers
- eventtypes
- triggers
verbs:
- get
- list
- watch
# permissions to get subscribers for triggers
# as subscribers can be any resource, we need to give access to all resources
# we fetch subscribers one by one, we only need `get` verb
- apiGroups:
- "*"
resources:
- "*"
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: my-eventmesh-backend-cluster-role-binding
subjects:
- kind: ServiceAccount
name: my-eventmesh-backend-service-account
namespace: default
roleRef:
kind: ClusterRole
name: my-eventmesh-backend-cluster-role
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: Secret
metadata:
name: my-eventmesh-backend-secret
namespace: default
annotations:
kubernetes.io/service-account.name: my-eventmesh-backend-service-account
type: kubernetes.io/service-account-token
要获取令牌,您可以运行以下命令
kubectl get secret my-eventmesh-backend-secret -o jsonpath='{.data.token}' | base64 --decode
运行快速检查以查看令牌是否与 Kubernetes API 服务器一起使用
export KUBE_API_SERVER_URL=$(kubectl config view --minify --output jsonpath="{.clusters[*].cluster.server}") # e.g. "https://192.168.2.151:16443"
export KUBE_SA_TOKEN=$(kubectl get secret my-eventmesh-backend-secret -o jsonpath='{.data.token}' | base64 --decode)
curl -k -H "Authorization: Bearer $KUBE_SA_TOKEN" -X GET "${KUBE_API_SERVER_URL}/apis/eventing.knative.dev/v1/namespaces/default/brokers"
# Should see the brokers, or nothing if there are no brokers
# But, should not see an error
运行第二个快速检查以查看令牌是否与后台后端一起使用
export KNATIVE_EVENT_MESH_BACKEND=https://127.0.0.1:8080 # or the URL of the backend
export KUBE_SA_TOKEN=$(kubectl get secret my-eventmesh-backend-secret -o jsonpath='{.data.token}' | base64 --decode)
curl -k -H "Authorization: Bearer $KUBE_SA_TOKEN" -X GET "${KNATIVE_EVENT_MESH_BACKEND}"
# Should see the response from the backend such as
# {
# "brokers" : [...],
# "eventTypes" : [...]
#}
如果这些快速检查有效,则可以在 app-config.yaml
文件中使用令牌作为 KNATIVE_EVENT_MESH_TOKEN
的值。
疑难解答¶
当您启动后台应用程序时,您会看到一些日志行,如下所示
[1] 2024-01-04T09:38:08.707Z knative-event-mesh-backend info Found 1 knative event mesh provider configs with ids: dev type=plugin
用法¶
有关使用该插件的更多信息,请参阅 插件文档。