13.6. OpenShift 경로를 사용하여 Kafka 액세스
OpenShift 경로를 사용하여 OpenShift 클러스터 외부 클라이언트에서 AMQ Streams Kafka 클러스터에 액세스합니다.
경로를 사용하려면 Kafka 사용자 정의 리소스에서 경로 유형 리스너에 대한 구성을 추가합니다. 적용되면 구성이 외부 부트스트랩 및 클러스터의 각 브로커에 대한 전용 경로 및 서비스를 생성합니다. 클라이언트는 부트스트랩 서비스를 통해 브로커에 연결하도록 라우팅하는 부트스트랩 경로에 연결합니다. 그런 다음 연결마다 DNS 이름을 사용하여 설정되며, 이 이름은 브로커별 경로 및 서비스를 통해 클라이언트에서 브로커로 트래픽을 라우팅합니다.
브로커에 연결하려면 경로 부트스트랩 주소의 호스트 이름과 TLS 암호화에 사용되는 인증서를 지정합니다. 경로를 사용한 액세스의 경우 포트는 항상 443입니다.
OpenShift 경로 주소는 Kafka 클러스터의 이름, 리스너 이름 및 생성된 프로젝트의 이름으로 구성됩니다. 예를 들어 my-cluster-kafka-external-bootstrap-myproject (<cluster_name>-kafka-<listener_name>-bootstrap-<namespace>)입니다. 주소의 전체 길이가 최대 63자 제한을 초과하지 않도록 주의하십시오.
이 절차에서는 기본 리스너 구성을 보여줍니다. TLS 암호화(tls)를 활성화해야 합니다. 클라이언트 인증 메커니즘(인증)을 지정할 수도 있습니다. 구성 속성을 사용하여 추가 구성을 추가합니다. 예를 들어 경로 리스너와 함께 호스트 구성 속성을 사용하여 부트스트랩 및 인수별 서비스에서 사용하는 호스트 이름을 지정할 수 있습니다.
리스너 구성에 대한 자세한 내용은 GenericKafkaListener 스키마 참조를 참조하십시오.
TLS 패스스루
AMQ Streams에서 생성한 경로에 대해 TLS 패스스루가 활성화됩니다. Kafka는 TCP를 통해 바이너리 프로토콜을 사용하지만 경로는 HTTP 프로토콜에서 작동하도록 설계되었습니다. 경로를 통해 TCP 트래픽을 라우팅할 수 있도록 AMQ Streams는 SNI(Server Name Indication)를 사용하여 TLS 패스스루를 사용합니다.
SNI는 Kafka 브로커의 연결을 식별하고 전달하는 데 도움이 됩니다. passthrough 모드에서 TLS 암호화는 항상 사용됩니다. 연결이 브로커에 전달되므로 리스너는 수신 인증서가 아닌 내부 클러스터 CA에서 서명한 TLS 인증서를 사용합니다. 자체 리스너 인증서를 사용하도록 리스너를 구성하려면 brokerCertECDHEAndKey 속성을 사용합니다.
사전 요구 사항
- 실행 중인 Cluster Operator
이 프로세스에서 Kafka 클러스터 이름은 my-cluster 입니다. 리스너의 이름은 external 입니다.
절차
외부 리스너를 사용하여
경로유형으로Kafka리소스를 구성합니다.예를 들면 다음과 같습니다.
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: kafka: # ... listeners: - name: external port: 9094 type: route tls: true1 authentication: type: tls # ... # ... zookeeper: # ...- 1
경로유형 리스너의 경우 TLS 암호화를 활성화해야 합니다(true).
리소스를 생성하거나 업데이트합니다.
oc apply -f <kafka_configuration_file>kafka 브로커의 ID를 확인하는 클러스터 CA 인증서가
my-cluster-cluster-ca-cert에 생성됩니다.각 Kafka 브로커 및 외부 부트스트랩 서비스에 대해
ClusterIP유형 서비스가 생성됩니다.기본 OpenShift HAProxy 라우터를 사용하여 이를 노출하는 DNS 주소(host/port)를 사용하여 각 서비스에 대해
경로가생성됩니다.경로는 TLS 패스스루를 사용하여 사전 구성됩니다.
부트스트랩 및 브로커에 대해 생성된 경로
NAME HOST/PORT SERVICES PORT TERMINATION my-cluster-kafka-external-0 my-cluster-kafka-external-0-my-project.router.com my-cluster-kafka-external-0 9094 passthrough my-cluster-kafka-external-1 my-cluster-kafka-external-1-my-project.router.com my-cluster-kafka-external-1 9094 passthrough my-cluster-kafka-external-2 my-cluster-kafka-external-2-my-project.router.com my-cluster-kafka-external-2 9094 passthrough my-cluster-kafka-external-bootstrap my-cluster-kafka-external-bootstrap-my-project.router.com my-cluster-kafka-external-bootstrap 9094 passthrough클라이언트 연결에 사용되는 DNS 주소는 각 경로의
상태로전파됩니다.부트스트랩 경로의 상태 예
status: ingress: - host: >- my-cluster-kafka-external-bootstrap-my-project.router.com # ...대상 브로커를 사용하여 OpenSSL
s_client를 사용하여 포트 443에서 클라이언트-서버 TLS 연결을 확인합니다.openssl s_client -connect my-cluster-kafka-external-0-my-project.router.com:443 -servername my-cluster-kafka-external-0-my-project.router.com -showcerts서버 이름은 브로커에 연결을 전달하는 SNI입니다.
연결에 성공하면 브로커의 인증서가 반환됩니다.
브로커의 인증서
Certificate chain 0 s:O = io.strimzi, CN = my-cluster-kafka i:O = io.strimzi, CN = cluster-ca v0Kafka리소스의 상태에서 부트스트랩 서비스의 주소를 검색합니다.oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}' my-cluster-kafka-external-bootstrap-my-project.router.com:443주소는 클러스터 이름, 리스너 이름, 프로젝트 이름 및 라우터 도메인(이 예에서는
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인 경우 일반적으로 CA를 추가할 필요가 없습니다.