27.14. 常见问题解答
27.14.1. 与 Cluster Operator 相关的问题
27.14.1.1. 为什么需要集群管理员特权来安装 AMQ Streams?
要安装 AMQ Streams,您需要创建以下集群范围资源:
- 
								自定义资源定义(CRD)指示 OpenShift 关于特定于 AMQ Streams 的资源,如 Kafka和KafkaConnect
- 
								ClusterRole和ClusterRoleBindings
集群范围的资源(不限定于特定 OpenShift 命名空间)通常需要安装 集群管理员特权。
						作为集群管理员,您可以检查正在安装的所有资源(在 /install/ 目录中),以确保 ClusterRole 不授予不必要的特权。
					
						安装后,Cluster Operator 以常规部署的形式运行,因此具有访问 Deployment 的任何标准(非 admin)OpenShift 用户都可以进行配置。集群管理员可以为标准用户授予管理 Kafka 自定义资源所需的权限。
					
另请参阅:
OpenShift 有内置 特权升级阻止,这意味着 Cluster Operator 无法授予它本身没有的权限,特别是无法在它无法访问的命名空间中授予此类权限。因此,Cluster Operator 必须具有它编排的所有组件所需的权限。
Cluster Operator 需要能够授予访问权限,以便:
- 
								主题 Operator 可以在 Operator 运行的命名空间中创建 Role和RoleBindings来管理KafkaTopics
- 
								User Operator 可以在 Operator 运行的命名空间中创建 Role和RoleBindings来管理KafkaUsers
- 
								AMQ Streams 通过创建一个ClusterRoleBinding发现节点的故障域
						在使用机架感知分区分配时,代理 pod 需要能够获取有关它 正在运行的节点 的信息,例如 Amazon AWS 中的 Availability Zone。Node 是一个集群范围的资源,因此只能通过 ClusterRoleBinding 授予权限,而不通过命名空间范围的 RoleBinding 授予权限。
					
27.14.1.3. 标准 OpenShift 用户能否创建 Kafka 自定义资源?
默认情况下,标准 OpenShift 用户没有管理 Cluster Operator 处理的自定义资源所需的权限。集群管理员可以使用 OpenShift RBAC 资源授予用户必要的特权。
如需更多信息,请参阅 第 4.5 节 “设计 AMQ Streams 管理员”。
27.14.1.4. 在 日志中获取锁定警告失败 是什么?
对于每个集群,Cluster Operator 每次仅执行一个操作。Cluster Operator 使用锁定来确保没有为同一集群运行两个并行操作。其他操作必须在锁定发布前等待当前操作完成。
- INFO
- 集群操作示例包括 集群创建、滚动更新、缩减 和扩展。
如果锁定的等待时间过长,则操作超时,并将以下警告信息输出到日志中:
2018-03-04 17:09:24 WARNING AbstractClusterOperations:290 - Failed to acquire lock for kafka cluster lock::kafka::myproject::my-cluster
2018-03-04 17:09:24 WARNING AbstractClusterOperations:290 - Failed to acquire lock for kafka cluster lock::kafka::myproject::my-cluster
						根据 STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 和 STRIMZI_OPERATION_TIMEOUT_MS 的具体配置,这个警告信息偶尔可能会出现任何底层问题。下一次定期协调中会获取超时的操作,以便操作可以获取锁定并再次执行。
					
如果此消息定期出现,即使不应为给定集群运行其他操作,这可能表示锁因为错误而没有正确发布。如果出现这种情况,请尝试重启 Cluster Operator。
27.14.1.5. 在使用 TLS 连接到 NodePort 时,为什么主机名验证失败?
目前,使用带有启用 TLS 加密的 NodePort 的非集群访问不支持 TLS 主机名验证。因此,验证主机名的客户端将无法连接。例如,Java 客户端会失败并显示以下例外:
Caused by: java.security.cert.CertificateException: No subject alternative names matching IP address 168.72.15.231 found at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:168) at sun.security.util.HostnameChecker.match(HostnameChecker.java:94) at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455) at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:436) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:252) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1501) ... 17 more
Caused by: java.security.cert.CertificateException: No subject alternative names matching IP address 168.72.15.231 found
 at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:168)
 at sun.security.util.HostnameChecker.match(HostnameChecker.java:94)
 at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455)
 at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:436)
 at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:252)
 at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136)
 at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1501)
 ... 17 more
						要连接,您必须禁用主机名验证。在 Java 客户端中,您可以通过将配置选项 ssl.endpoint.identification.algorithm 设置为空字符串来实现。
					
使用属性文件配置客户端时,您可以以这种方式完成此操作:
ssl.endpoint.identification.algorithm=
ssl.endpoint.identification.algorithm=在 Java 中直接配置客户端时,将配置选项设置为空字符串:
props.put("ssl.endpoint.identification.algorithm", "");
props.put("ssl.endpoint.identification.algorithm", "");