5.2. 为 OpenShift 外部的客户端设置访问权限
此流程演示了如何从 OpenShift 外部配置对 Kafka 集群的客户端访问。
使用 Kafka 集群的地址,您可以提供到不同 OpenShift 命名空间或整个 OpenShift 外部客户端的外部访问。
您可以配置外部 Kafka 侦听程序以提供访问权限。
支持以下外部监听程序类型:
- 
						使用 OpenShift Route和默认 HAProxy 路由器的路由
- 
						使用负载均衡器服务的 LoadBalancer
- 
						NodePort用于在 OpenShift 节点上使用端口
- 
						Ingress用于 OpenShift Ingress 和 Kubernetes 的 NGINX Ingress Controller
选择的类型取决于您的要求,以及您的环境和基础架构。例如,负载均衡器可能不适用于某些基础架构,如裸机,其中节点端口提供了一个更好的选项。
在这个过程中:
- 为 Kafka 集群配置了一个外部监听程序,它带有 TLS 加密和身份验证,并启用了 Kafka 简单授权。
- 
						为客户端创建一个 KafkaUser,并为 简单授权 定义了 TLS 身份验证和访问控制列表(ACL)。
您可以将侦听器配置为使用 TLS 或 SCRAM-SHA-512 身份验证,这两种身份验证都可用于 TLS 加密。如果使用授权服务器,您可以使用基于令牌的 OAuth 2.0 身份验证和 OAuth 2.0 授权。Open Policy Agent(OPA)授权还支持 Kafka 授权 选项。
				当您配置 KafkaUser 身份验证和授权机制时,请确保它们与等同的 Kafka 配置匹配:
			
- 
						KafkaUser.spec.authenticationmatchesKafka.spec.kafka.listeners[*].authentication
- 
						KafkaUser.spec.authorization与Kafka.spec.kafka.authorization匹配
				您应至少有一个监听器支持您要用于 KafkaUser 的身份验证。
			
Kafka 用户和 Kafka 代理之间的身份验证取决于每个用户的身份验证设置。例如,如果 Kafka 配置中没有启用 TLS 的用户,则无法验证它。
AMQ Streams Operator 自动配置过程:
- Cluster Operator 创建监听程序并设置集群和客户端证书颁发机构(CA)证书,以便在 Kafka 集群中启用身份验证。
- User Operator 根据所选的身份验证类型,创建代表客户端以及用于客户端身份验证的安全凭证的用户。
在这一流程中,使用了 Cluster Operator 生成的证书,但您可以通过 安装您自己的证书 来替换它们。您还可以将监听程序配置为使用 由外部证书颁发机构管理的 Kafka 侦听器证书。
证书以 PKCS #12 格式(.p12)和 PEM(.crt)格式提供。
先决条件
- Kafka 集群可用于客户端
- Cluster Operator 和 User Operator 在集群中运行
- OpenShift 集群外的客户端连接到 Kafka 集群
步骤
- 使用外部 Kafka 侦听程序配置 - Kafka集群。- 定义通过监听程序访问 Kafka 代理所需的身份验证
- 在 Kafka 代理上启用授权 - 例如: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 1
- 2
- 用于标识侦听器的名称。在 Kafka 集群中必须是唯一的。
- 3
- Kafka 内侦听器使用的端口号。在给定 Kafka 集群中,端口号必须是唯一的。允许的端口号是 9092 及以上,但端口 9404 和 9999 除外,它们已用于 Prometheus 和 JMX。根据监听程序类型,端口号可能与连接 Kafka 客户端的端口号不同。
- 4
- 外部监听程序类型,指定为route、loadbalancer、nodeport或ingress。内部监听程序指定为内部监听程序。
- 5
- 在监听器上启用 TLS 加密。默认为false。路由监听程序不需要 TLS 加密。
- 6
- 指定为tls的身份验证。
- 7
- (可选,仅适用于节点端口侦听器)配置 ,以指定 AMQ Streams 作为节点地址使用的第一个地址类型的首选。
- 8
- (可选)AMQ Streams 自动决定要公告给客户端的地址。这些地址由 OpenShift 自动分配。如果您运行 AMQ Streams 的基础架构不提供正确的 地址,您可以覆盖 bootstrap 和代理服务 地址。验证不会在覆盖上执行。覆盖配置根据监听器类型而有所不同。例如,您可以覆盖用于路由、DNS 名称或负载均衡器 IP 地址的主机,以及nodeport的节点端口。
- 9
- Authoization 指定为simple,它使用AclAuthorizerKafka 插件。
- 10
- (可选)超级用户可以访问所有代理,无论 ACL 中定义的任何访问权限限制。
 警告- OpenShift Route 地址包含 Kafka 集群的名称、侦听器的名称以及在其中创建的命名空间的名称。例如,my - -cluster-kafka-listener1-bootstrap-myproject(CLUSTER-NAME-kafka-LISTENER-NAME-bootstrap-NAMESPACE)。如果您使用的是- 路由监听程序类型,请注意地址的长度不超过 63 个字符的最大限制。
 
- 创建或更新 - Kafka资源。- oc apply -f KAFKA-CONFIG-FILE - oc apply -f KAFKA-CONFIG-FILE- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 使用 TLS 身份验证配置 Kafka 代理监听程序。 - 为每个 Kafka 代理 pod 创建一个服务。 - 创建一个服务作为连接到 Kafka 集群的 bootstrap 地址。 - 服务也作为使用 - nodeport侦听器到 Kafka 集群 的外部 bootstrap 地址 创建。- 也使用与 - Kafka资源相同的名称来创建用于验证 kafka 代理身份的集群 CA 证书。
- 从 - Kafka资源的状态查找 bootstrap 地址和端口。- oc get kafka KAFKA-CLUSTER-NAME -o jsonpath='{.status.listeners[?(@.type=="external")].bootstrapServers}'- oc get kafka KAFKA-CLUSTER-NAME -o jsonpath='{.status.listeners[?(@.type=="external")].bootstrapServers}'- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 使用 Kafka 客户端中的 bootstrap 地址连接到 Kafka 集群。 
- 从生成的 - KAFKA-CLUSTER-NAME -cluster-ca-cert Secret中提取公共集群 CA 证书和密码。- oc get secret KAFKA-CLUSTER-NAME-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12- oc get secret KAFKA-CLUSTER-NAME-cluster-ca-cert -o jsonpath='{.data.ca\.p12}' | base64 -d > ca.p12- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - oc get secret KAFKA-CLUSTER-NAME-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password- oc get secret KAFKA-CLUSTER-NAME-cluster-ca-cert -o jsonpath='{.data.ca\.password}' | base64 -d > ca.password- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 使用 Kafka 客户端中的证书和密码,使用 TLS 加密连接到 Kafka 集群。 注意- 默认情况下,集群 CA 证书自动续订。如果您使用您自己的 Kafka 侦听程序证书,则需要 手动续订证书。 
- 创建或修改代表需要访问 Kafka 集群的客户端的用户。 
- 创建或修改 - KafkaUser资源。- oc apply -f USER-CONFIG-FILE - oc apply -f USER-CONFIG-FILE- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 已创建用户,以及名称与 - KafkaUser资源相同的 Secret。Secret 包含用于 TLS 客户端身份验证的私钥和公钥。- 例如: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 将客户端配置为使用所需的属性连接到 Kafka 集群,以便与 Kafka 集群建立安全连接。 - 添加公共集群证书的身份验证详情: - security.protocol: SSL ssl.truststore.location: PATH-TO/ssl/keys/truststore ssl.truststore.password: CLUSTER-CA-CERT-PASSWORD ssl.truststore.type=PKCS12 - security.protocol: SSL- 1 - ssl.truststore.location: PATH-TO/ssl/keys/truststore- 2 - ssl.truststore.password: CLUSTER-CA-CERT-PASSWORD- 3 - ssl.truststore.type=PKCS12- 4 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注意- 使用 - security.protocol:在通过 TLS 使用 SCRAM-SHA 身份验证时,SASL_SSL
- 添加用于连接到 Kafka 集群的 bootstrap 地址和端口: - bootstrap.servers: BOOTSTRAP-ADDRESS:PORT - bootstrap.servers: BOOTSTRAP-ADDRESS:PORT- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 添加公共用户证书的身份验证详情: - ssl.keystore.location: PATH-TO/ssl/keys/user1.keystore ssl.keystore.password: USER-CERT-PASSWORD - ssl.keystore.location: PATH-TO/ssl/keys/user1.keystore- 1 - ssl.keystore.password: USER-CERT-PASSWORD- 2 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 公共用户证书在创建时由客户端 CA 签名。