跳到内容

安装 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/brokerseventing.knative.dev/eventtypeseventing.knative.dev/triggers 资源的 getlistwatch 权限
  • 所有资源的 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

用法

有关使用插件的更多信息,请参阅插件文档

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。