跳到内容

配置 Broker 默认值

如果您拥有 Knative 安装的集群管理员权限,您可以修改 ConfigMaps 来更改集群上 Broker 的全局默认配置选项。

Knative Eventing 提供了一个名为 config-br-defaults 的 ConfigMap,其中包含控制默认 Broker 创建的配置设置。

默认的 config-br-defaults ConfigMap 如下所示

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  # Configures the default for any Broker that does not specify a spec.config or Broker class.
  default-br-config: |
    clusterDefault:
      brokerClass: MTChannelBasedBroker
      apiVersion: v1
      kind: ConfigMap
      name: config-br-default-channel
      namespace: knative-eventing

在这种情况下,集群中创建的每个新 Broker 默认将使用 MTChannelBasedBroker Broker 类,并使用 knative-eventing 命名空间中的 config-br-default-channel ConfigMap 进行配置,除非在 Broker 的 eventing.knative.dev/broker.class 注解和/或 .spec.config 中另有指定(请参阅 开发者配置选项)。

但是,如果您希望例如使用 Kafka Channel 作为创建的任何 Broker 的默认 Channel 实现,您可以将 config-br-defaults ConfigMap 修改为如下所示

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  # Configures the default for any Broker that does not specify a spec.config or Broker class.
  default-br-config: |
    clusterDefault:
      brokerClass: MTChannelBasedBroker
      apiVersion: v1
      kind: ConfigMap
      name: kafka-channel
      namespace: knative-eventing

现在,集群中创建的未指定 spec.config 的每个 Broker 都将配置为使用 kafka-channel ConfigMap。有关创建 kafka-channel ConfigMap 以与 Broker 配合使用的更多信息,请参阅 Kafka Channel ConfigMap 文档。

您还可以通过在 namespaceDefaults 部分定义来修改一个或多个专用命名空间的默认 Broker 配置。例如,如果您希望默认情况下为所有 Broker 使用 config-br-default-channel ConfigMap,但希望为 namespace-1namespace-2 使用 kafka-channel ConfigMap,您将使用以下 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  default-br-config: |
    clusterDefault:
      brokerClass: MTChannelBasedBroker
      apiVersion: v1
      kind: ConfigMap
      name: config-br-default-channel
      namespace: knative-eventing
    namespaceDefaults:
      namespace-1:
        apiVersion: v1
        kind: ConfigMap
        name: kafka-channel
        namespace: knative-eventing
      namespace-2:
        apiVersion: v1
        kind: ConfigMap
        name: kafka-channel
        namespace: knative-eventing

配置 Broker 类

除了 单独 为每个 Broker 配置 Broker 类之外,还可以群集范围或按命名空间定义默认 Broker 类

为集群配置默认 Broker 类

您可以配置 clusterDefault Broker 类,以便集群中创建的任何未指定 eventing.knative.dev/broker.class 注解的 Broker 都将使用此默认 Broker 类

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  # Configures the default for any Broker that does not specify a spec.config or Broker class.
  default-br-config: |
    clusterDefault:
      brokerClass: MTChannelBasedBroker

为命名空间配置默认 Broker 类

您可以修改一个或多个命名空间的默认 Broker 类。

例如,如果您希望为集群中创建的所有其他 Broker 使用 KafkaBroker Broker 类,但希望为在 namespace-1namespace-2 中创建的 Broker 使用 MTChannelBasedBroker Broker 类,您将使用以下 ConfigMap 设置

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  # Configures the default for any Broker that does not specify a spec.config or Broker class.
  default-br-config: |
    clusterDefault:
      brokerClass: KafkaBroker
    namespaceDefaults:
      namespace1:
        brokerClass: MTChannelBasedBroker
      namespace2:
        brokerClass: MTChannelBasedBroker

注意

请注意,不同的 Broker 类通常需要不同的配置 ConfigMaps。请参阅不同 Broker 实现 的配置选项,了解它们引用的 ConfigMaps 应如何(例如,对于 MTChannelBasedBrokerKnative Broker for Apache Kafka)。

配置投递规范默认值

您可以配置 Broker 的默认事件投递参数,这些参数将在事件未能成功投递时应用

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  # Configures the default for any Broker that does not specify a spec.config or Broker class.
  default-br-config: |
    clusterDefault:
      brokerClass: MTChannelBasedBroker
      apiVersion: v1
      kind: ConfigMap
      name: kafka-channel
      namespace: knative-eventing
      delivery:
        retry: 10
        backoffDelay: PT0.2S
        backoffPolicy: exponential
    namespaceDefaults:
      namespace-1:
        apiVersion: v1
        kind: ConfigMap
        name: config-br-default-channel
        namespace: knative-eventing
        delivery:
          deadLetterSink:
            ref:
              kind: Service
              namespace: example-namespace
              name: example-service
              apiVersion: v1
            uri: example-uri
          retry: 10
          backoffPolicy: exponential
          backoffDelay: "PT0.2S"

死信接收器

您可以配置 deadLetterSink 投递参数,以便在事件未能投递时,将其发送到指定的事件接收器。

重试次数

您可以通过将 retry 投递参数配置为整数值,来设置在事件发送到死信接收器之前必须重试的最小次数。

退避延迟

您可以设置 backoffDelay 投递参数来指定事件投递失败后尝试重试之前的延迟时间。backoffDelay 参数的持续时间使用 ISO 8601 格式指定。

退避策略

backoffPolicy 投递参数可用于指定重试退避策略。策略可以指定为线性或指数。当使用线性退避策略时,退避延迟是重试之间的时间间隔。当使用指数退避策略时,退避延迟等于 backoffDelay*2^<numberOfRetries>

将 Istio 与 Knative Broker 集成

使用 JSON Web Token (JWT) 和 Istio 保护 Knative Broker

先决条件

  • 您已经安装了 Knative Eventing。
  • 您已安装 Istio。

步骤

  1. 通过运行以下命令,为 knative-eventing 命名空间添加标签,以便 Istio 可以处理基于 JWT 的用户身份验证

    kubectl label namespace knative-eventing istio-injection=enabled
    
  2. 重新启动 Broker Ingress pod,以便将 istio-proxy 容器作为 sidecar 注入,通过运行以下命令

    kubectl delete pod <broker-ingress-pod-name> -n knative-eventing
    

    其中 <broker-ingress-pod-name> 是您的 Broker Ingress pod 的名称。

    该 pod 现在有两个容器

    knative-eventing     <broker-ingress-pod-name>           2/2     Running   1              175m
    
  3. 创建一个 Broker,然后通过运行以下命令获取您的 Broker 的 URL

    kubectl get broker <broker-name>
    

    其中 是您的 Broker 的名称。

    示例输出

    NAMESPACE   NAME        URL                                                                          AGE   READY   REASON
    default     my-broker   http://broker-ingress.knative-eventing.svc.cluster.local/default/my-broker   6s    True
    
  4. 通过运行以下命令启动一个 curl pod

    kubectl -n default run curl --image=radial/busyboxplus:curl -i --tty
    
  5. 通过运行以下命令,向 Broker URL 发送一个 HTTP POST 请求的 CloudEvent

    curl -X POST -v \
    -H "content-type: application/json"  \
    -H "ce-specversion: 1.0"  \
    -H "ce-source: my/curl/command"  \
    -H "ce-type: my.demo.event"  \
    -H "ce-id: 0815"  \
    -d '{"value":"Hello Knative"}' \
    <broker-URL>
    

    其中 <broker-URL> 是您的 Broker 的 URL。例如

    curl -X POST -v \
    -H "content-type: application/json"  \
    -H "ce-specversion: 1.0"  \
    -H "ce-source: my/curl/command"  \
    -H "ce-type: my.demo.event"  \
    -H "ce-id: 0815"  \
    -d '{"value":"Hello Knative"}' \
    http://broker-ingress.knative-eventing.svc.cluster.local/default/my-broker
    
  6. 您将收到一个 202 HTTP 响应码,表示 Broker 已接受请求

    ...
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 202 Accepted
    < allow: POST, OPTIONS
    < date: Tue, 15 Mar 2022 13:37:57 GMT
    < content-length: 0
    < x-envoy-upstream-service-time: 79
    < server: istio-envoy
    < x-envoy-decorator-operation: broker-ingress.knative-eventing.svc.cluster.local:80/*
    
  7. knative-eventing 命名空间中应用一个 AuthorizationPolicy 对象,以描述 Broker 的路径仅限于特定用户

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: require-jwt
      namespace: knative-eventing
    spec:
      action: ALLOW
      rules:
      - from:
        - source:
           requestPrincipals: ["testing@secure.istio.io/testing@secure.istio.io"]
        to:
        - operation:
            methods: ["POST"]
            paths: ["/default/my-broker"]
    
  8. istio-system 命名空间中为用户 requestPrincipal 创建一个 RequestAuthentication 对象

    apiVersion: security.istio.io/v1beta1
    kind: RequestAuthentication
    metadata:
      name: "jwt-example"
      namespace: istio-system
    spec:
      jwtRules:
      - issuer: "testing@secure.istio.io"
        jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.13/security/tools/jwt/samples/jwks.json"
    
  9. 现在重试 curl 命令将导致服务器返回 403 - Forbidden 响应码

    ...
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 403 Forbidden
    < content-length: 19
    < content-type: text/plain
    < date: Tue, 15 Mar 2022 13:47:53 GMT
    < server: istio-envoy
    < connection: close
    < x-envoy-decorator-operation: broker-ingress.knative-eventing.svc.cluster.local:80/*
    
  10. 要访问 Broker,请将 Bearer JSON Web Token 作为请求的一部分添加

    TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.13/security/tools/jwt/samples/demo.jwt -s)
    
    curl -X POST -v \
    -H "content-type: application/json"  \
    -H "Authorization: Bearer ${TOKEN}"  \
    -H "ce-specversion: 1.0"  \
    -H "ce-source: my/curl/command"  \
    -H "ce-type: my.demo.event"  \
    -H "ce-id: 0815"  \
    -d '{"value":"Hello Knative"}' \
    <broker-URL>
    

    服务器现在响应 202 响应码,表明它已接受 HTTP 请求

    * Mark bundle as not supporting multiuse
    < HTTP/1.1 202 Accepted
    < allow: POST, OPTIONS
    < date: Tue, 15 Mar 2022 14:05:09 GMT
    < content-length: 0
    < x-envoy-upstream-service-time: 40
    < server: istio-envoy
    < x-envoy-decorator-operation: broker-ingress.knative-eventing.svc.cluster.local:80/*
    

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