5.4. 使用 OpenShift 路由访问 Kafka


使用 OpenShift 路由从 OpenShift 集群外的客户端访问 AMQ Streams Kafka 集群。

为了可以使用路由,请在 Kafka 自定义资源中为 路由类型 监听程序添加配置。应用时,配置会为外部 bootstrap 和集群中的每个代理创建一个专用的路由和服务。客户端连接到 bootstrap 路由,该路由通过 bootstrap 服务路由以连接到代理。然后,使用 DNS 名称建立每个代理连接,通过特定于代理的路由和服务将流量从客户端路由到代理。

要连接到代理,您可以为路由 bootstrap 地址指定主机名,以及用于身份验证的证书。

对于使用路由访问,端口始终为 443。

警告

OpenShift 路由地址由 Kafka 集群的名称、侦听器的名称及其在其中创建的项目的名称组成。例如,my-cluster-kafka-listener1-bootstrap-myproject (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>)。请注意,地址的整个长度不超过 63 个字符的最大值。

TLS 透传

为 AMQ Streams 创建的路由启用 TLS 透传。Kafka 通过 TCP 使用二进制协议,但路由设计为与 HTTP 协议一起使用。为了能够通过路由路由 TCP 流量,AMQ Streams 使用带有 Server Name Indication (SNI)的 TLS 透传。

SNI 有助于识别并传递到 Kafka 代理的连接。在 passthrough 模式中,始终使用 TLS 加密。因为连接传递给代理,所以监听程序使用由内部集群 CA 签名的 TLS 证书,而不是入口证书。要将监听程序配置为使用您自己的监听程序证书,请使用 brokerCertChainAndKey 属性

先决条件

  • 正在运行的 Cluster Operator

在此过程中,Kafka 集群名称是 my-cluster

流程

  1. 配置 Kafka 资源,将外部监听程序设置为 route 类型。

    例如:

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      labels:
        app: my-cluster
      name: my-cluster
      namespace: myproject
    spec:
      kafka:
        # ...
        listeners:
          - name: listener1
            port: 9094
            type: route
            tls: true 
    1
    
            # ...
        # ...
      zookeeper:
        # ...
    Copy to Clipboard Toggle word wrap
    1
    对于 路由类型 监听程序,必须启用 TLS 加密(true)。
  2. 创建或更新资源。

    oc apply -f <kafka_configuration_file>
    Copy to Clipboard Toggle word wrap

    验证 kafka 代理的身份在 secret my-cluster-cluster-ca-cert 中创建了集群 CA 证书。

    ClusterIP 类型服务为每个 Kafka 代理创建,以及外部 bootstrap 服务。

    另外,还会为每个服务创建一个路由,其中包含一个 DNS 地址 (host/port),以使用默认的 OpenShift HAProxy 路由器公开它们。

    路由预先配置了 TLS 透传。

    为 bootstrap 和代理创建的路由

    NAME                                  HOST/PORT                                                   SERVICES                              PORT  TERMINATION
    my-cluster-kafka-listener1-0          my-cluster-kafka-listener1-0-my-project.router.com          my-cluster-kafka-listener1-0          9094  passthrough
    my-cluster-kafka-listener1-1          my-cluster-kafka-listener1-1-my-project.router.com          my-cluster-kafka-listener1-1          9094  passthrough
    my-cluster-kafka-listener1-2          my-cluster-kafka-listener1-2-my-project.router.com          my-cluster-kafka-listener1-2          9094  passthrough
    my-cluster-kafka-listener1-bootstrap  my-cluster-kafka-listener1-bootstrap-my-project.router.com  my-cluster-kafka-listener1-bootstrap  9094  passthrough
    Copy to Clipboard Toggle word wrap

    用于客户端连接的 DNS 地址会传播到每个路由的 状态

    bootstrap 路由的状态示例

    status:
      ingress:
        - host: >-
            my-cluster-kafka-listener1-bootstrap-my-project.router.com
     # ...
    Copy to Clipboard Toggle word wrap

  3. 使用目标代理,使用 OpenSSL s_client 检查端口 443 上的 client-server TLS 连接。

    openssl s_client -connect my-cluster-kafka-listener1-0-my-project.router.com:443 -servername my-cluster-kafka-listener1-0-my-project.router.com -showcerts
    Copy to Clipboard Toggle word wrap

    服务器名称是用于将连接传递给代理的 SNI。

    如果连接成功,则返回代理的证书。

    代理的证书

    Certificate chain
     0 s:O = io.strimzi, CN = my-cluster-kafka
       i:O = io.strimzi, CN = cluster-ca v0
    Copy to Clipboard Toggle word wrap

  4. Kafka 资源的状态检索 bootstrap 服务的地址。

    oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="listener1")].bootstrapServers}{"\n"}'
    
    my-cluster-kafka-listener1-bootstrap-my-project.router.com:443
    Copy to Clipboard Toggle word wrap

    该地址包含集群名称、侦听器名称、项目名称和路由器的域(本例中为router.com )。

  5. 提取集群 CA 证书。

    oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
    Copy to Clipboard Toggle word wrap
  6. 将您的客户端配置为连接到代理。

    1. 指定 Kafka 客户端中的 bootstrap 服务和端口 443 的地址,作为连接到 Kafka 集群的 bootstrap 地址。
    2. 将提取的证书添加到 Kafka 客户端的信任存储中,以配置 TLS 连接。

      如果您启用了任何身份验证,您还需要在客户端中配置它。

注意

如果您使用自己的监听程序证书,请检查是否需要将 CA 证书添加到客户端的信任存储中。如果是公共(外部)CA,您通常不需要添加它。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat