付録A よくある質問
A.1. Cluster Operator に関する質問
A.1.1. AMQ Streams のインストールに、クラスター管理者の権限が必要なのはなぜですか ?
AMQ Streams をインストールするには、以下のクラスタースコープのリソースの作成が可能でなければなりません。
-
Kafka
やKafkaConnect
などの AMQ Streams 固有のリソースについて OpenShift に指示するカスタムリソース定義 (CRD) -
ClusterRoles
およびClusterRoleBindings
特定の OpenShift namespace にスコープ指定されていないクラスタースコープのリソースをインストールするには、通常は クラスター管理者 の権限が必要です。
クラスター管理者として、(/install/
ディレクトリーに) インストールされているすべてのリソースを検査し、ClusterRole
が不要な権限を付与しないようにします。
インストール後に、Cluster Operator は通常の Deployment
として実行されるため、Deployment
へのアクセス権限を持つ OpenShift の標準ユーザー (管理者以外) であれば誰でもこれを設定できます。クラスター管理者は、Kafka
カスタムリソースの管理に必要な権限を標準ユーザーに付与できます。
以下も参照してください。
A.1.2. Cluster Operator が ClusterRoleBindings
を作成する必要があるのはなぜですか ?
OpenShift には組み込みの 権限昇格防止機能 があります。これは、Cluster Operator は付与されていない権限を付与できず、特にアクセスできない namespace にこのような権限を付与できないことを意味します。そのため、Cluster Operator は、オーケストレーションする すべて のコンポーネントに必要な権限を持つ必要があります。
以下を実行するため、Cluster Operator によるアクセス権の付与が必要です。
-
Topic Operator は、operator が実行される namespace に
Roles
およびRoleBindings
を作成することで、KafkaTopics
を管理できます。 -
User Operator は、operator が実行される namespace に
Roles
およびRoleBindings
を作成することで、KafkaUsers
を管理できます。 -
Node
の障害ドメインは、ClusterRoleBinding
を作成することで、AMQ Streams によって検出されます。
ラック認識のパーティション割り当てを使用する場合、ブローカー Pod は、Amazon AWS のアベイラビリティーゾーンなどの実行中の Node
についての情報を取得できなければなりません。Node
はクラスタースコープのリソースであるため、アクセスは namespace スコープの RoleBinding
ではなく、ClusterRoleBinding
を介してのみ許可できます。
A.1.3. OpenShift の標準ユーザーは Kafka カスタムリソースを作成できますか ?
デフォルトでは、OpenShift の標準ユーザーには、Cluster Operator で処理されるカスタムリソースの管理に必要な権限がありません。クラスター管理者は、OpenShift RBAC リソースを使用してユーザーに必要な権限を付与できます。
詳細は、AMQ Streams の管理者の指名 を参照してください。
A.1.4. ログの Failed to acquire lock 警告の意味
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", "");