配置 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-1 和 namespace-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-1 和 namespace-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 应如何(例如,对于 MTChannelBasedBroker 或 Knative 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。
步骤¶
-
通过运行以下命令,为
knative-eventing命名空间添加标签,以便 Istio 可以处理基于 JWT 的用户身份验证kubectl label namespace knative-eventing istio-injection=enabled -
重新启动 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 -
创建一个 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 -
通过运行以下命令启动一个
curlpodkubectl -n default run curl --image=radial/busyboxplus:curl -i --tty -
通过运行以下命令,向 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 -
您将收到一个
202HTTP 响应码,表示 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/* -
在
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"] -
在
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" -
现在重试
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/* -
要访问 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/*