如何为Strimzi Kafka Connect传递--add-exports JVM参数?
Strimzi 0.33.0(Java 17)下添加JVM --add-exports参数的解决方案
问题描述
我正在使用Strimzi 0.33.0(基于Java 17),其中一个Connect插件仍需访问
sun.management.ManagementFactoryHelper,但JVM抛出错误:cannot access class sun.management.ManagementFactoryHelper (in module java.management) because module java.management does not export sun.management to unnamed module @0x478cc5f1需要向JVM传递
--add-exports=java.management/sun.management=ALL-UNNAMED参数,查阅文档发现jvmOptions不支持该特性,请问还有其他实现方法吗?
可行解决方案
1. 通过KAFKA_OPTS环境变量传递参数
Strimzi部署的Kafka Connect会读取KAFKA_OPTS环境变量追加额外JVM参数,直接在KafkaConnect资源的env字段中配置即可:
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: # 其他原有配置... env: - name: KAFKA_OPTS value: "--add-exports=java.management/sun.management=ALL-UNNAMED"
该参数会自动追加到Connect的JVM启动命令中,无需修改核心配置。
2. 自定义Connect镜像修改启动脚本
如果环境变量方式不生效,可构建自定义镜像修改启动脚本:
- 编写Dockerfile基于官方Strimzi镜像:
FROM quay.io/strimzi/kafka:0.33.0-kafka-3.3.2 # 在启动脚本中追加JVM参数 RUN sed -i '/export KAFKA_OPTS/a export KAFKA_OPTS="$KAFKA_OPTS --add-exports=java.management/sun.management=ALL-UNNAMED"' /opt/kafka/bin/connect-distributed.sh
- 构建并推送镜像到私有仓库后,在KafkaConnect资源中指定自定义镜像:
spec: image: your-registry/strimzi-connect-custom:0.33.0 # 其他原有配置...
3. 挂载自定义启动脚本替代默认脚本
不想构建新镜像的话,可通过ConfigMap挂载修改后的启动脚本:
- 创建包含自定义脚本的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: custom-connect-script data: connect-distributed.sh: | #!/bin/bash # 保留原脚本的核心逻辑,添加所需JVM参数 export KAFKA_OPTS="$KAFKA_OPTS --add-exports=java.management/sun.management=ALL-UNNAMED" # 复制原connect-distributed.sh的剩余执行代码 exec /usr/bin/tini -w -e 143 -- /opt/kafka/bin/kafka-run-class.sh org.apache.kafka.connect.cli.ConnectDistributed "$@"
- 在KafkaConnect资源中挂载该ConfigMap:
spec: volumes: - name: custom-script configMap: name: custom-connect-script defaultMode: 0755 volumeMounts: - name: custom-script mountPath: /opt/kafka/bin/connect-distributed.sh subPath: connect-distributed.sh # 其他原有配置...
内容的提问来源于stack exchange,提问作者Majid Azimi
相关产品推荐
相关产品推荐

