13.3. 리스너를 사용하여 Kafka 클러스터에 클라이언트 액세스 설정
Kafka 클러스터의 주소를 사용하여 동일한 OpenShift 클러스터의 클라이언트에 대한 액세스를 제공하거나 다른 OpenShift 네임스페이스 또는 OpenShift 외부의 클라이언트에 대한 외부 액세스를 제공할 수 있습니다. 다음 절차에서는 OpenShift 외부 또는 다른 OpenShift 클러스터에서 Kafka 클러스터에 대한 클라이언트 액세스를 구성하는 방법을 설명합니다.
Kafka 리스너는 Kafka 클러스터에 대한 액세스를 제공합니다. 클라이언트 액세스는 다음 구성을 사용하여 보호됩니다.
-
외부 리스너는 TLS 암호화 및 mTLS 인증 및 Kafka
간단한인증이 활성화된 Kafka 클러스터에 대해 구성됩니다. -
KafkaUser는 mTLS 인증 및간단한권한 부여를 위해 정의된 ACL(액세스 제어 목록)을 사용하여 클라이언트에 대해 생성됩니다.
상호 tls,scram-sha-512 또는 oauth 인증을 사용하도록 리스너를 구성할 수 있습니다. mTLS는 항상 암호화를 사용하지만 SCRAM-SHA-512 및 OAuth 2.0 인증을 사용할 때 암호화를 사용하는 것이 좋습니다.
Kafka 브로커에 대해 간단한,oauth,opa 또는 사용자 정의 인증을 구성할 수 있습니다. 활성화되면 권한 부여가 활성화된 모든 리스너에 적용됩니다.
KafkaUser 인증 및 권한 부여 메커니즘을 구성할 때 동등한 Kafka 구성과 일치하는지 확인합니다.
-
KafkaUser.spec.authentication은Kafka.spec.kafka.listeners[*].authentication과 일치합니다. -
KafkaUser.spec.authorization과Kafka.spec.kafka.authorization과 일치
KafkaUser 에 사용하려는 인증을 지원하는 리스너가 하나 이상 있어야 합니다.
Kafka 사용자와 Kafka 브로커 간의 인증은 각각에 대한 인증 설정에 따라 다릅니다. 예를 들어 Kafka 구성에서 활성화되지 않은 경우 mTLS로 사용자를 인증할 수 없습니다.
AMQ Streams Operator는 구성 프로세스를 자동화하고 인증에 필요한 인증서를 생성합니다.
- Cluster Operator는 리스너를 생성하고 클러스터 및 클라이언트 CA(인증 기관) 인증서를 설정하여 Kafka 클러스터와의 인증을 활성화합니다.
- User Operator는 선택한 인증 유형을 기반으로 클라이언트 및 클라이언트 인증에 사용되는 보안 자격 증명을 나타내는 사용자를 생성합니다.
클라이언트 구성에 인증서를 추가합니다.
이 절차에서는 Cluster Operator에서 생성한 CA 인증서가 사용되지만 자체 인증서를 설치하여 교체할 수 있습니다. 외부 CA(인증 기관)에서 관리하는 Kafka 리스너 인증서를 사용하도록 리스너를 구성할 수도 있습니다.
인증서는 PEM(.crt) 및 PKCS #12(.p12) 형식으로 사용할 수 있습니다. 이 절차에서는 PEM 인증서를 사용합니다. X.509 형식의 인증서를 사용하는 클라이언트와 PEM 인증서를 사용합니다.
동일한 OpenShift 클러스터 및 네임스페이스의 내부 클라이언트의 경우 Pod 사양에 클러스터 CA 인증서를 마운트할 수 있습니다. 자세한 내용은 클러스터 CA를 신뢰하도록 내부 클라이언트 구성을 참조하십시오.
사전 요구 사항
- Kafka 클러스터는 OpenShift 클러스터 외부에서 실행되는 클라이언트에서 연결할 수 있습니다.
- Cluster Operator 및 User Operator가 클러스터에서 실행 중입니다.
절차
Kafka 리스너를 사용하여 Kafka 클러스터를 구성합니다.
- 리스너를 통해 Kafka 브로커에 액세스하는 데 필요한 인증을 정의합니다.
Kafka 브로커에서 인증을 활성화합니다.
리스너 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: myproject spec: kafka: # ... listeners:1 - name: external2 port: 90943 type: <listener_type>4 tls: true5 authentication: type: tls6 configuration:7 #... authorization:8 type: simple superUsers: - super-user-name9 # ...- 1
- 외부 리스너를 활성화하는 구성 옵션은 일반 Kafka 리스너 스키마 참조에 설명되어 있습니다.
- 2
- 리스너를 식별할 이름입니다. Kafka 클러스터 내에서 고유해야 합니다.
- 3
- Kafka 내부의 리스너에서 사용하는 포트 번호입니다. 포트 번호는 지정된 Kafka 클러스터 내에서 고유해야 합니다. 허용되는 포트 번호는 9092이고 포트 9404 및 9999를 제외하고 이미 Prometheus 및 10.0.0.1에 사용됩니다. 리스너 유형에 따라 포트 번호가 Kafka 클라이언트를 연결하는 포트 번호와 동일하지 않을 수 있습니다.
- 4
경로(OpenShift만), 로드 밸런서 ,노드 포트또는수신(Kubernetes만)로 지정된 외부 리스너 유형.내부 리스너는내부또는cluster-ip로 지정됩니다.- 5
- 필수 항목입니다. 리스너의 TLS 암호화입니다.
route및ingress유형 리스너의 경우true로 설정해야 합니다. mTLS 인증의 경우인증속성도 사용합니다. - 6
- 리스너의 클라이언트 인증 메커니즘. mTLS를 사용한 서버 및 클라이언트 인증의 경우
tls: true및authentication.type: tls를 지정합니다. - 7
- (선택 사항) 리스너 유형의 요구 사항에 따라 추가 리스너 구성 을 지정할 수 있습니다.
- 8
- 권한 부여는
AclAuthorizerKafka 플러그인을 사용하는단순로 지정됩니다. - 9
- (선택 사항) 슈퍼 사용자는 ACL에 정의된 액세스 제한에 관계없이 모든 브로커에 액세스할 수 있습니다.
주의OpenShift 경로 주소는 Kafka 클러스터의 이름, 리스너의 이름 및 생성된 네임스페이스의 이름으로 구성됩니다. 예를 들면
my-cluster-kafka-listener1-bootstrap-myproject(CLUSTER-NAME-kafka-LISTENER-NAME -bootstrap-NAMESPACE)입니다.경로리스너 유형을 사용하는 경우 주소의 전체 길이가 최대 63자 제한을 초과하지 않도록 주의하십시오.
Kafka리소스를 생성하거나 업데이트합니다.oc apply -f <kafka_configuration_file>Kafka 클러스터는 mTLS 인증을 사용하는 Kafka 브로커 리스너로 구성됩니다.
각 Kafka 브로커 Pod에 대해 서비스가 생성됩니다.
Kafka 클러스터 연결에 필요한 부트스트랩 주소로 사용되는 서비스가 생성됩니다.
또한
nodeport리스너를 사용하여 Kafka 클러스터에 외부 연결을 위해 외부 부트스트랩 주소로 서비스가 생성됩니다.kafka 브로커의 ID를 확인하는 클러스터 CA 인증서도 시크릿 <
cluster_name> -cluster-ca-cert에 생성됩니다.참고외부 리스너를 사용하는 동안 Kafka 클러스터를 스케일링하는 경우 모든 Kafka 브로커의 롤링 업데이트가 트리거될 수 있습니다. 구성에 따라 달라집니다.
Kafka리소스의 상태에서 Kafka 클러스터에 액세스하는 데 사용할 수 있는 부트스트랩 주소를 검색합니다.oc get kafka <kafka_cluster_name> -o=jsonpath='{.status.listeners[?(@.name=="<listener_name>")].bootstrapServers}{"\n"}'예를 들면 다음과 같습니다.
oc get kafka my-cluster -o=jsonpath='{.status.listeners[?(@.name=="external")].bootstrapServers}{"\n"}'Kafka 클라이언트에서 부트스트랩 주소를 사용하여 Kafka 클러스터에 연결합니다.
Kafka 클러스터에 액세스해야 하는 클라이언트를 나타내는 사용자를 생성하거나 수정합니다.
-
Kafka리스너와 동일한 인증 유형을 지정합니다. 간단한권한 부여를 위한 권한 부여 ACL을 지정합니다.사용자 구성 예
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster1 spec: authentication: type: tls2 authorization: type: simple acls:3 - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read - resource: type: group name: my-group patternType: literal operations: - Read
-
KafkaUser리소스를 생성하거나 수정합니다.oc apply -f USER-CONFIG-FILE사용자는
KafkaUser리소스와 동일한 이름의 시크릿과 함께 생성됩니다. 보안에는 mTLS 인증을 위한 공개 및 개인 키가 포함됩니다.보안 예
apiVersion: v1 kind: Secret metadata: name: my-user labels: strimzi.io/kind: KafkaUser strimzi.io/cluster: my-cluster type: Opaque data: ca.crt: <public_key> # Public key of the clients CA user.crt: <user_certificate> # Public key of the user user.key: <user_private_key> # Private key of the user user.p12: <store> # PKCS #12 store for user certificates and keys user.password: <password_for_store> # Protects the PKCS #12 storeKafka 클러스터의 <
cluster_name> -cluster-ca-cert시크릿에서 클러스터 CA 인증서를 추출합니다.oc get secret <cluster_name>-cluster-ca-cert -o jsonpath='{.data.ca\.crt}' | base64 -d > ca.crt<user
_name> 시크릿에서 사용자 CA 인증서를추출합니다.oc get secret <user_name> -o jsonpath='{.data.user\.crt}' | base64 -d > user.crt<user
_name> 시크릿에서 사용자의 개인 키를추출합니다.oc get secret <user_name> -o jsonpath='{.data.user\.key}' | base64 -d > user.keyKafka 클러스터에 연결하기 위해 부트스트랩 주소 호스트 이름 및 포트를 사용하여 클라이언트를 구성합니다.
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "<hostname>:<port>");Kafka 클러스터의 ID를 확인하도록 신뢰 저장소 자격 증명으로 클라이언트를 구성합니다.
공용 클러스터 CA 인증서를 지정합니다.
신뢰 저장소 구성 예
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_TRUSTSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_TRUSTSTORE_CERTIFICATES_CONFIG, "<ca.crt_file_content>");SSL은 mTLS 인증에 대해 지정된 보안 프로토콜입니다. TLS를 통해 SCRAM-SHA-512 인증에 대해
SASL_SSL을 지정합니다. PEM은 신뢰 저장소의 파일 형식입니다.Kafka 클러스터에 연결할 때 사용자를 확인하도록 키 저장소 자격 증명으로 클라이언트를 구성합니다.
공개 인증서 및 개인 키를 지정합니다.
키 저장소 구성 예
props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SSL"); props.put(SslConfigs.SSL_KEYSTORE_TYPE_CONFIG, "PEM"); props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "<user.crt_file_content>"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "<user.key_file_content>");키 저장소 인증서와 개인 키를 구성에 직접 추가합니다. 를 단일 줄 형식으로 추가합니다.
BEGINCERTIFICATE와ENDCERTIFICATE 구분자 사이에 줄 바꿈 문자(\n)로 시작합니다.\n을 사용하여 원래 인증서에서 각 행을 종료합니다.키 저장소 구성 예
props.put(SslConfigs.SSL_KEYSTORE_CERTIFICATE_CHAIN_CONFIG, "-----BEGIN CERTIFICATE----- \n<user_certificate_content_line_1>\n<user_certificate_content_line_n>\n-----END CERTIFICATE---"); props.put(SslConfigs.SSL_KEYSTORE_KEY_CONFIG, "----BEGIN PRIVATE KEY-----\n<user_key_content_line_1>\n<user_key_content_line_n>\n-----END PRIVATE KEY-----");