5.3. 使用 Ingress NGINX Controller for OpenShift 访问 Kafka
使用 Ingress NGINX Controller for Kubernetes 从 OpenShift 集群外部的客户端访问 AMQ Streams Kafka 集群。
为了能够将 Ingress NGINX Controller 用于 OpenShift,请在 Kafka
自定义资源中为 ingress
类型监听程序添加配置。应用时,配置会为外部 bootstrap 和集群中的每个代理创建一个专用的入口和服务。客户端连接到 bootstrap ingress,通过 bootstrap 服务路由它们以连接到代理。然后,使用 DNS 名称建立每个代理连接,通过特定于代理的入口和服务将流量从客户端路由到代理。
要连接到代理,您可以为 ingress bootstrap 地址和 TLS 证书指定一个主机名。身份验证是可选的。
对于使用 ingress 的访问,Kafka 客户端中使用的端口通常是 443。
TLS 透传
确保您在 Ingress NGINX Controller for OpenShift 部署中启用 TLS 透传。Kafka 通过 TCP 使用二进制协议,但 Ingress NGINX Controller for OpenShift 旨在使用 HTTP 协议。为了能够通过 ingresses 路由 TCP 流量,AMQ Streams 使用带有 Server Name Indication (SNI)的 TLS 透传。
SNI 有助于识别并传递到 Kafka 代理的连接。在 passthrough 模式中,始终使用 TLS 加密。因为连接传递给代理,所以监听程序使用由内部集群 CA 签名的 TLS 证书,而不是入口证书。要将监听程序配置为使用您自己的监听程序证书,请使用 brokerCertChainAndKey
属性。
有关启用 TLS 透传的更多信息,请参阅 TLS 透传文档。
先决条件
- OpenShift 的 Ingress NGINX Controller 运行启用了 TLS 透传
- 正在运行的 Cluster Operator
在此过程中,Kafka 集群名称是 my-cluster
。
流程
配置
Kafka
资源,并将外部监听程序设置为ingress
类型。为 bootstrap 服务以及 Kafka 集群中每个 Kafka 代理指定一个入口主机名。在
bootstrap
和broker-<index>
; 前缀中添加任何主机名来标识 bootstrap 和代理。例如:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建或更新资源。
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 验证 kafka 代理的身份在 secret
my-cluster-cluster-ca-cert
中创建了集群 CA 证书。ClusterIP
类型服务为每个 Kafka 代理创建,以及外部 bootstrap 服务。另外,会为每个服务创建一个
入口
,DNS 地址会使用 Ingress NGINX Controller for OpenShift 来公开它们。为 bootstrap 和代理创建的入口
NAME CLASS HOSTS ADDRESS PORTS my-cluster-kafka-0 nginx broker-0.myingress.com external.ingress.com 80,443 my-cluster-kafka-1 nginx broker-1.myingress.com external.ingress.com 80,443 my-cluster-kafka-2 nginx broker-2.myingress.com external.ingress.com 80,443 my-cluster-kafka-bootstrap nginx bootstrap.myingress.com external.ingress.com 80,443
NAME CLASS HOSTS ADDRESS PORTS my-cluster-kafka-0 nginx broker-0.myingress.com external.ingress.com 80,443 my-cluster-kafka-1 nginx broker-1.myingress.com external.ingress.com 80,443 my-cluster-kafka-2 nginx broker-2.myingress.com external.ingress.com 80,443 my-cluster-kafka-bootstrap nginx bootstrap.myingress.com external.ingress.com 80,443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 用于客户端连接的 DNS 地址会传播到每个入口
的状态
。bootstrap ingress 的状态
status: loadBalancer: ingress: - hostname: external.ingress.com # ...
status: loadBalancer: ingress: - hostname: external.ingress.com # ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用目标代理,使用 OpenSSL
s_client
检查端口 443 上的 client-server TLS 连接。openssl s_client -connect broker-0.myingress.com:443 -servername broker-0.myingress.com -showcerts
openssl s_client -connect broker-0.myingress.com:443 -servername broker-0.myingress.com -showcerts
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 服务器名称是用于将连接传递给代理的 SNI。
如果连接成功,则返回代理的证书。
代理的证书
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提取集群 CA 证书。
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将您的客户端配置为连接到代理。
-
指定 Kafka 客户端中的 bootstrap 主机(从监听器
配置
)和端口 443,作为连接到 Kafka 集群的 bootstrap 地址。例如:bootstrap.myingress.com:443
。 将提取的证书添加到 Kafka 客户端的信任存储中,以配置 TLS 连接。
如果您启用了任何身份验证,您还需要在客户端中配置它。
-
指定 Kafka 客户端中的 bootstrap 主机(从监听器
如果您使用自己的监听程序证书,请检查是否需要将 CA 证书添加到客户端的信任存储中。如果是公共(外部)CA,您通常不需要添加它。