附录 A. 常见问题解答
A.1. 与 Cluster Operator 相关的问题
A.1.1. 为什么我需要集群管理员特权才能安装 AMQ Streams?
要安装 AMQ Streams,您需要创建以下集群范围的资源:
-
自定义资源定义(CRD)指示 OpenShift 关于 AMQ Streams 专用资源,如
Kafka
和KafkaConnect
-
ClusterRole 和
ClusterRoleBindings
集群范围的资源(不限定在特定的 OpenShift 命名空间内),通常需要 集群管理员 特权才能安装。
作为集群管理员,您可以检查要安装的所有资源(在 /install/
目录中),以确保 ClusterRole 不会
授予不必要的特权。
安装后,Cluster Operator 会作为常规 Deployment
运行,因此具有访问 Deployment
的权限的任何标准(非 admin)OpenShift 用户都可以进行配置。集群管理员可向标准用户授予管理 Kafka
自定义资源所需的权限。
另请参阅:
A.1.2. 为什么 Cluster Operator 需要创建 ClusterRoleBinding?
OpenShift 内置了 特权升级防御,这意味着 Cluster Operator 无法为其授予本身没有的特权,特别是,它无法在它无法访问的命名空间中授予此类权限。因此,Cluster Operator 必须具有它编配 的所有 组件所需的权限。
Cluster Operator 需要能够授予访问权限,以便:
-
Topic Operator 可以管理
KafkaTopics
,方法是在操作器运行的命名空间中创建Roles
和RoleBindings
-
User Operator 可以管理
KafkaUsers
,方法是在 Operator 运行的命名空间中创建Roles
和RoleBindings
-
AMQ Streams 通过创建一个
ClusterRoleBinding
来发现
节点的故障域
使用机架感知分区分配时,代理 pod 需要能够获取有关在其上运行的 节点
的信息,例如 Amazon AWS 中的 Availability Zone。节点
是一个集群范围的资源,因此只能通过 ClusterRoleBinding 而不是命名空间范围的RoleBinding
授予对它的访问权限 。
A.1.3. 标准 OpenShift 用户是否可以创建 Kafka 自定义资源?
默认情况下,标准 OpenShift 用户没有管理由 Cluster Operator 处理的自定义资源所需的权限。集群管理员可以使用 OpenShift RBAC 资源为用户授予必要的特权。
如需更多信息,请参阅 OpenShift 上部署和升级 AMQ 流指南中的指定 AMQ 流 管理员。
A.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。
A.1.5. 为什么在使用 TLS 连接 NodePort 时主机名验证失败?
目前,使用启用了 TLS 加密的 NodePorts 进行集群外访问不支持 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", "");