11.8. 常见问题解答
11.8.1. 与 Cluster Operator 相关的问题
11.8.1.1. 为什么我需要集群管理员特权才能安装 AMQ Streams?
要安装 AMQ Streams,您需要创建以下集群范围资源:
-
自定义资源定义(CRD)指示 OpenShift 特定于 AMQ Streams 的资源,如
Kafka
和KafkaConnect
-
ClusterRole
和ClusterRoleBindings
集群范围内的资源(不特定于特定 OpenShift 命名空间)的资源通常 需要集群管理员特权 才能安装。
作为集群管理员,您可以检查正在安装的所有资源(在 /install/
目录中),以确保 ClusterRole
没有授予不必要的权限。
安装后,Cluster Operator 会作为常规 Deployment
运行,因此具有访问 Deployment
的任何标准(非管理员)OpenShift 用户都可以进行配置。集群管理员可向标准用户授予管理 Kafka
自定义资源所需的权限。
另请参阅:
11.8.1.2. Cluster Operator 为何需要创建 ClusterRoleBindings
?
OpenShift 具有内置 特权升级会阻止,这意味着 Cluster Operator 无法授予其本身的权限,特别是,它无法在它无法访问的命名空间中授予此类权限。因此,Cluster Operator 必须具有它编排的所有组件所需的权限。
Cluster Operator 需要能够授予访问权限,以便:
-
Topic Operator 可以管理
KafkaTopics
,方法是在 Operator 中运行的命名空间中创建一个Role
和RoleBindings
-
User Operator 可以管理
KafkaUsers
,方法是在 Operator 中运行的命名空间中创建一个Role
和RoleBindings
-
AMQ Streams 发现了
节点
的故障域,方法是创建一个ClusterRoleBinding
在使用机架感知分区分配时,代理 pod 需要能够获取有关其运行 的节点的信息
,例如:Amazon AWS 中的 Availability Zone。节点是
集群范围的资源,因此只能通过 ClusterRoleBinding
而非全命名空间范围的 RoleBinding
授予访问权限。
11.8.1.3. 标准 OpenShift 用户能否创建 Kafka 自定义资源?
默认情况下,标准 OpenShift 用户没有管理 Cluster Operator 处理的自定义资源所需的权限。集群管理员可以使用 OpenShift RBAC 资源授予用户必要的特权。
如需更多信息,请参阅在 OpenShift 的 部署和升级 AMQ Streams 指南中的设计 AMQ Streams 管理员。
11.8.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
根据 STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
和 STRIMZI_OPERATION_TIMEOUT_MS
的具体配置,可能会偶尔出现任何底层问题。在下一次定期协调过程中获取超时的操作,以便操作可以获取锁定并再次执行。
如果这个消息出现,即使在不应为给定集群运行任何其他操作时也是如此,这可能表示因为错误而没有正确释放锁定。如果出现这种情况,请尝试重启 Cluster Operator。
11.8.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
要连接,您必须禁用主机名验证。在 Java 客户端中,您可以通过将配置选项 ssl.endpoint.identification.algorithm
设置为空字符串来实现。
在使用属性文件配置客户端时,您可以以这种方式实现:
ssl.endpoint.identification.algorithm=
在 Java 中直接配置客户端时,将配置选项设置为空字符串:
props.put("ssl.endpoint.identification.algorithm", "");