14.7. 使用 OpenShift 路由访问 Kafka
使用 OpenShift 路由从 OpenShift 集群外部的客户端访问 Apache Kafka 集群的流。
为了可以使用路由,请在 Kafka
自定义资源中为 route
类型监听程序添加配置。应用时,配置会为外部 bootstrap 和集群中的每个代理创建一个专用路由和服务。客户端连接到 bootstrap 路由,该路由通过 bootstrap 服务将其路由到代理。然后,使用 DNS 名称建立每个代理连接,该名称通过特定于代理的路由和服务将流量从客户端路由到代理。
要连接到代理,您可以为路由 bootstrap 地址指定一个主机名,以及用于 TLS 加密的证书。对于使用路由访问,端口始终为 443。
OpenShift 路由地址由 Kafka 集群名称、侦听器名称、项目名称和路由器的域组成。例如,my-cluster-kafka-external1-bootstrap-my-project.domain.com
(<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>)。每个 DNS 标签(between period ".")不得超过 63 个字符,地址的总长度不得超过 255 个字符。
该流程显示基本的监听程序配置。必须启用 TLS 加密(tls
)。您还可以指定客户端身份验证机制(身份验证
)。使用 配置属性
添加额外的配置。例如,您可以使用 host
配置属性 和路由
监听程序来指定 bootstrap 和 per-broker 服务使用的主机名。
有关监听器配置的更多信息,请参阅 GenericKafkaListener
模式参考。
TLS passthrough
对于 Apache Kafka 的 Streams 创建的路由,启用了 TLS 透传。Kafka 通过 TCP 使用二进制协议,但路由设计为使用 HTTP 协议。为了能够通过路由路由路由 TCP 流量,Apache Kafka 的 Streams 使用 Server Name Indication (SNI)的 TLS 透传。
SNI 有助于识别并传递到 Kafka 代理的连接。在 passthrough 模式中,始终使用 TLS 加密。由于连接传递给代理,因此监听程序使用由内部集群 CA 签名的 TLS 证书,而不是入口证书。要将监听程序配置为使用您自己的监听程序证书,请使用 brokerCertChainAndKey
属性。
先决条件
- 正在运行的 Cluster Operator
在此过程中,Kafka 集群名称是 my-cluster
。侦听器的名称是 external1
。
流程
配置
Kafka
资源,将外部监听程序设置为route
类型。例如:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external1 port: 9094 type: route tls: true 1 authentication: type: tls # ... # ... zookeeper: # ...
- 1
- 对于
路由类型
监听程序,必须启用 TLS 加密(true
)。
创建或更新资源。
oc apply -f <kafka_configuration_file>
在 secret
my-cluster-cluster-ca-cert
中创建用于验证 kafka 代理身份的集群 CA 证书。为每个 Kafka 代理以及外部 bootstrap 服务创建
ClusterIP
类型服务。另外,还会为每个服务创建一个
路由
,其中包含一个 DNS 地址 (host/port),以使用默认的 OpenShift HAProxy 路由器公开它们。路由预先配置了 TLS 透传。
为 bootstrap 和代理创建的路由
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external1-0 my-cluster-kafka-external1-0-my-project.router.com my-cluster-kafka-external1-0 9094 passthrough my-cluster-kafka-external1-1 my-cluster-kafka-external1-1-my-project.router.com my-cluster-kafka-external1-1 9094 passthrough my-cluster-kafka-external1-2 my-cluster-kafka-external1-2-my-project.router.com my-cluster-kafka-external1-2 9094 passthrough my-cluster-kafka-external1-bootstrap my-cluster-kafka-external1-bootstrap-my-project.router.com my-cluster-kafka-external1-bootstrap 9094 passthrough
用于客户端连接的 DNS 地址传播到
每个路由的状态
。bootstrap 路由的状态示例
status: ingress: - host: >- my-cluster-kafka-external1-bootstrap-my-project.router.com # ...
使用目标代理使用 OpenSSL
s_client
检查端口 443 上的客户端-服务器 TLS 连接。openssl s_client -connect my-cluster-kafka-external1-0-my-project.router.com:443 -servername my-cluster-kafka-external1-0-my-project.router.com -showcerts
服务器名称是将连接传递给代理的 Server Name Indication (SNI)。
如果连接成功,则返回代理的证书。
代理的证书
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0
从
Kafka
资源的状态检索 bootstrap 服务的地址。oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external1")].bootstrapServers}{"\n"}' my-cluster-kafka-external1-bootstrap-my-project.router.com:443
该地址包含 Kafka 集群名称、侦听器名称、项目名称和路由器域(本例中为
router.com
)。提取集群 CA 证书。
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
将您的客户端配置为连接到代理。
- 指定 Kafka 客户端中的 bootstrap 服务和端口 443 的地址,作为连接到 Kafka 集群的 bootstrap 地址。
将提取的证书添加到 Kafka 客户端的信任存储中,以配置 TLS 连接。
如果启用了客户端身份验证机制,您还需要在客户端中配置它。
如果您使用自己的监听程序证书,请检查您是否需要将 CA 证书添加到客户端的信任存储配置中。如果它是一个公共(外部)CA,通常不需要添加它。