14.7. OpenShift ルートを使用した Kafka へのアクセス
OpenShift ルートを使用して、OpenShift クラスター外のクライアントから Streams for Apache Kafka クラスターにアクセスします。
ルートを使用できるようにするには、Kafka
カスタムリソースに route
タイプリスナーの設定を追加します。適用すると、設定により、外部ブートストラップとクラスター内の各ブローカーに専用のルートとサービスが作成されます。クライアントはブートストラップルートに接続し、ブートストラップサービスを経由してクライアントをルーティングし、ブローカーに接続します。その後、ブローカーごとの接続が DNS 名を使用して確立されます。DNS 名は、ブローカー固有のルートとサービスを介してクライアントからブローカーにトラフィックをルーティングします。
ブローカーに接続するには、ルートブートストラップアドレスのホスト名と、TLS 暗号化に使用される証明書を指定します。ルートを使用したアクセスでは、ポートは常に 443 になります。
OpenShift ルートアドレスは、Kafka クラスター名、リスナー名、プロジェクト名、およびルーターのドメインで構成されます。たとえば、my-cluster-kafka-external1-bootstrap-my-project.domain.com
(<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>.<domain>) のようになります。各 DNS ラベル (ピリオド.の間) は 63 文字を超えてはならず、アドレスの合計の長さは 255 文字を超えてはなりません。
この手順では、基本的なリスナー設定を示します。TLS 暗号化 (tls
) を有効にする必要があります。クライアント認証メカニズム (authentication
) を指定することもできます。configuration
プロパティーを使用して追加の設定を追加します。たとえば、route
リスナーで host
設定プロパティーを使用して、ブートストラップサービスおよびブローカーごとのサービスで使用されるホスト名を指定できます。
リスナー設定の詳細は、GenericKafkaListener
スキーマリファレンス を参照してください。
TLS パススルー
Streams for Apache Kafka によって作成されたルートでは、TLS パススルーが有効になります。Kafka は TCP 経由でバイナリープロトコルを使用しますが、ルートは HTTP プロトコルで動作するように設計されています。TCP トラフィックをルート経由でルーティングできるようにするために、Streams for Apache Kafka は Server Name Indication (SNI) を使用した TLS パススルーを使用します。
SNI は、Kafka ブローカーへの接続を識別して渡すのに役立ちます。パススルーモードでは、TLS 暗号化が常に使用されます。接続はブローカーに渡されるため、リスナーは、ingress 証明書ではなく、内部クラスター CA によって署名された TLS 証明書を使用します。独自のリスナー証明書を使用するようにリスナーを設定するには、brokerCertChainAndKey
プロパティーを使用します。
前提条件
- 稼働中の Cluster Operator
この手順では、Kafka クラスター名は my-cluster
です。リスナーの名前は external1
です。
手順
外部リスナーを
route
タイプに設定したKafka
リソースを設定します。以下に例を示します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external1 port: 9094 type: route tls: true 1 authentication: type: tls # ... # ... zookeeper: # ...
- 1
route
タイプリスナーの場合、TLS 暗号化を有効にする必要があります (true
)。
リソースを作成または更新します。
oc apply -f <kafka_configuration_file>
kafka ブローカーの ID を確認するためのクラスター CA 証明書は、シークレットの
my-cluster-cluster-ca-cert
に作成されます。ClusterIP
タイプサービスは、各 Kafka ブローカーと、外部のブートストラップサービスに対して作成されます。デフォルトの OpenShift HAProxy ルーターを使用してサービスを公開するための DNS アドレス (ホスト/ポート) を使用して、サービスごとに
route
も作成されます。ルートは、TLS パススルーで事前設定されています。
ブートストラップとブローカー用に作成されたルート
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external1-0 my-cluster-kafka-external1-0-my-project.router.com my-cluster-kafka-external1-0 9094 passthrough my-cluster-kafka-external1-1 my-cluster-kafka-external1-1-my-project.router.com my-cluster-kafka-external1-1 9094 passthrough my-cluster-kafka-external1-2 my-cluster-kafka-external1-2-my-project.router.com my-cluster-kafka-external1-2 9094 passthrough my-cluster-kafka-external1-bootstrap my-cluster-kafka-external1-bootstrap-my-project.router.com my-cluster-kafka-external1-bootstrap 9094 passthrough
クライアント接続に使用される DNS アドレスは、各ルートの
status
に伝播されます。ブートストラップルートのステータスの例
status: ingress: - host: >- my-cluster-kafka-external1-bootstrap-my-project.router.com # ...
ターゲットブローカーを使用して、OpenSSL
s_client
を使用するポート 443 でクライアントサーバーの TLS 接続を確認します。openssl s_client -connect my-cluster-kafka-external1-0-my-project.router.com:443 -servername my-cluster-kafka-external1-0-my-project.router.com -showcerts
サーバー名は、接続をブローカーに渡すための Server Name Indication (SNI) です。
接続が成功すると、ブローカーの証明書が返されます。
ブローカーの証明書
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0
Kafka
リソースのステータスからブートストラップサービスのアドレスを取得します。oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external1")].bootstrapServers}{"\n"}' my-cluster-kafka-external1-bootstrap-my-project.router.com:443
アドレスは、Kafka クラスター名、リスナー名、プロジェクト名、およびルーターのドメイン (この例では
router.com
) で構成されます。クラスター CA 証明書を抽出します。
oc get secret my-cluster-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt
ブローカーに接続するようにクライアントを設定します。
- Kafka クラスターに接続するためのブートストラップアドレスとして、Kafka クライアントでブートストラップサービスのアドレスとポート 443 を指定します。
抽出した証明書を Kafka クライアントのトラストストアに追加して、TLS 接続を設定します。
クライアント認証メカニズムを有効にした場合は、クライアントでもそれを設定する必要があります。
独自のリスナー証明書を使用している場合は、CA 証明書をクライアントのトラストストア設定に追加する必要があるかどうかを確認してください。パブリック (外部) CA の場合、通常は追加する必要はありません。