如何配置Debezium Mongo Kafka Connector使用指定证书(K8s环境)
解决方案
你有两种可行的方式解决这个问题,核心思路是将MongoDB的SSL证书仅提供给Debezium连接器使用,同时保持Kafka Connect与Kafka集群的明文连接:
方法一:为Debezium MongoDB连接器单独配置PEM证书(无需转换格式)
MongoDB Java驱动支持直接使用PEM格式的CA证书,通过挂载证书并在连接器配置中指定路径即可实现:
- 将MongoDB的PEM证书创建为Kubernetes Secret
kubectl create secret generic mongo-cert --from-file=rds-combined-ca-bundle.pem
- 修改Kafka Connect配置,挂载证书到容器
更新kafka-connect.yaml,添加证书挂载配置,同时保持与Kafka的明文连接(使用9092端口):
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: version: 3.2.0 replicas: 1 bootstrapServers: my-cluster-kafka-bootstrap:9092 # 保持明文连接端口 image: strimzi-debezium-connector config: config.storage.replication.factor: -1 offset.storage.replication.factor: -1 status.storage.replication.factor: -1 volumes: - name: mongo-cert secret: secretName: mongo-cert volumeMounts: - name: mongo-cert mountPath: /opt/kafka/mongo-cert readOnly: true
- 更新Debezium MongoDB连接器配置,指定证书路径
修改mongo-connector.yaml的spec.config部分,添加SSL证书相关参数:
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: debezium-mongo-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mongodb.MongoDbConnector tasksMax: 1 config: mongodb.hosts: test mongodb.name: test mongodb.user: username mongodb.password: password mongodb.ssl.enabled: true mongodb.ssl.invalid.hostname.allowed: true # 添加以下SSL证书配置 mongodb.ssl.trustStore.location: /opt/kafka/mongo-cert/rds-combined-ca-bundle.pem mongodb.ssl.trustStore.type: PEM database.include.list: db-dev database.history.kafka.bootstrap.servers: my-cluster-kafka-bootstrap:9092 collection.include.list: products
方法二:使用JKS格式的信任库(兼容旧版Java环境)
如果你的环境不支持直接使用PEM证书,可以将PEM转换为JKS格式的信任库:
- 将PEM证书转换为JKS信任库
keytool -importcert -file rds-combined-ca-bundle.pem -alias mongo-ca -keystore mongo-truststore.jks -storepass your-truststore-password
- 创建包含JKS文件的Kubernetes Secret
kubectl create secret generic mongo-truststore --from-file=mongo-truststore.jks
- 修改Kafka Connect配置,挂载信任库
类似方法一,更新kafka-connect.yaml添加挂载:
spec: volumes: - name: mongo-truststore secret: secretName: mongo-truststore volumeMounts: - name: mongo-truststore mountPath: /opt/kafka/mongo-truststore readOnly: true
- 更新连接器配置,指定JKS信任库参数
spec: config: # ... 原有配置 ... mongodb.ssl.trustStore.location: /opt/kafka/mongo-truststore/mongo-truststore.jks mongodb.ssl.trustStore.password: your-truststore-password
为什么你的第二次尝试失败?
你配置的trustedCertificates是Strimzi用来指定Kafka Connect连接Kafka集群时使用的信任证书,而非给Debezium连接器用的。当你将MongoDB的CA证书放到这里,并切换到Kafka的SSL端口(9093),Kafka Connect会尝试用Mongo的CA去验证Kafka broker的证书,自然会出现bad_certificate错误。
内容的提问来源于stack exchange,提问作者Mike H
相关产品推荐
相关产品推荐

