安装 Knative Backstage 插件¶
Knative 社区计划为 Knative 及其各自的后端提供一组 Backstage 插件。目前有一个插件可用,即事件网格插件。
事件网格插件¶
事件网格插件是一个 Backstage 插件,允许您查看和管理 Knative Eventing 资源。
Backstage 插件与在 Kubernetes 集群中运行并与 Kubernetes API 服务器通信的特殊后端进行通信。
此插件的演示设置可在https://github.com/aliok/knative-backstage-demo获取。
该插件有 2 种分发方式:静态和动态。本文档中,我们将重点介绍静态分发。有关动态分发,请参阅插件存储库中的动态插件 README 文件。
安装¶
该插件需要安装在 Backstage 实例中,并且它所通信的后端需要安装在 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 服务器通信并向插件提供必要的信息。
Backstage 插件安装¶
在您的 Backstage 目录中,运行以下命令安装插件
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 后端系统中都使用了“后端”一词。Backstage 后端系统与我们之前安装的 Kubernetes 控制器不同。控制器是一个在 Kubernetes 集群中运行并与 Kubernetes API 服务器通信的 Kubernetes 控制器。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;
}
配置¶
信息
注意:后端需要可以从 Backstage 实例访问。如果您在不暴露后端的情况下运行后端,可以使用 kubectl port-forward 将后端服务的端口转发到本地机器进行测试。
kubectl port-forward -n knative-eventing svc/eventmesh-backend 8080:8080
插件需要配置为与后端通信。它可以在 Backstage 实例的 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 文件中的占位符,或使用环境变量设置值。在启动 Backstage 实例之前,可以按如下方式设置环境变量
export KNATIVE_EVENT_MESH_TOKEN=<your-token>
export KNATIVE_EVENT_MESH_BACKEND=<backend-url>
KNATIVE_EVENT_MESH_BACKEND 的值应该是后端服务的 URL。如果后端服务与 Backstage 实例运行在同一个集群中,您可以使用服务名作为 URL,例如 http://eventmesh-backend.knative-eventing.svc.cluster.local。如果 Backstage 实例未运行在同一个集群中,您可以使用后端服务的外部 URL。或者,如果您在不暴露后端的情况下运行后端进行测试,如上所述,可以使用 kubectl port-forward。
KNATIVE_EVENT_MESH_TOKEN 的值应该是一个服务帐户令牌,该令牌具有列出集群中 Knative Eventing 资源所需的权限。后端将使用此令牌向 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
第二次快速检查令牌是否适用于 Backstage 后端
export KNATIVE_EVENT_MESH_BACKEND=https://: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 的值。
故障排除¶
当您启动 Backstage 应用程序时,您可能会看到以下一些日志行
[1] 2024-01-04T09:38:08.707Z knative-event-mesh-backend info Found 1 knative event mesh provider configs with ids: dev type=plugin
用法¶
有关使用插件的更多信息,请参阅插件文档。