如何通过Helm部署Kafka-exporter并集成自定义ConfigMap
问题描述
我需要通过Helm部署Kafka-exporter,并集成自定义ConfigMap实现动态的多Kafka集群配置。当前ConfigMap包含多个集群的地址信息,后续还会新增更多集群,但之前尝试用configMapKeyRef只能单个读取值,无法适配动态新增的集群。以下是我的配置文件:
当前values.yaml
# kafkaServer: # - kafka0.svc.cluster.local:9092 # - kafka1.svc.cluster.local:9092 # - kafka2.svc.cluster.local:9092 service: annotations: prometheus.io/path: /metrics prometheus.io/scrape: "true" prometheus: serviceMonitor: enabled: true namespace: observability additionalLabels: release: prometheus
自定义ConfigMap
apiVersion: v1 data: KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0.svc.cluster.local:9092 KAFKA_CLUSTERS_0_NAME: kafka0 KAFKA_CLUSTERS_1_BOOTSTRAPSERVERS: kafka1.svc.cluster.local:9092 KAFKA_CLUSTERS_1_NAME: kafka1 KAFKA_CLUSTERS_2_BOOTSTRAPSERVERS: kafka2.svc.cluster.local:9092 KAFKA_CLUSTERS_2_NAME: kafka2 kind: ConfigMap metadata: name: kafka-configmap namespace: default
解决方案
由于Kafka-exporter不支持直接读取配置文件,我们可以通过环境变量批量注入+启动脚本解析的方式实现动态配置,无需修改values.yaml即可适配ConfigMap的新增集群。
步骤1:修改deployment.yaml模板
1.1 批量注入ConfigMap环境变量
在容器的env配置后添加envFrom,将ConfigMap中所有键值对注入为环境变量:
env: {{- range $env := .Values.env }} - name: {{ $env.name }} value: {{ $env.value }} {{- end }} {{- if .Values.sasl.scram.enabled }} - name: SCRAM_USERNAME valueFrom: secretKeyRef: name: {{ template "prometheus-kafka-exporter.saslScramSecretName" . }} key: username - name: SCRAM_PASSWORD valueFrom: secretKeyRef: name: {{ template "prometheus-kafka-exporter.saslScramSecretName" . }} key: password {{- end }} # 新增:批量注入ConfigMap环境变量 envFrom: - configMapRef: name: kafka-configmap
1.2 替换启动命令为动态参数生成脚本
将容器的args替换为Shell脚本,自动从环境变量中提取所有Kafka集群地址,生成对应的--kafka.server参数:
command: ["/bin/sh", "-c"] args: - | # 提取所有KAFKA_CLUSTERS_*_BOOTSTRAPSERVERS环境变量,生成启动参数 SERVER_ARGS="" for var in $(env | grep "^KAFKA_CLUSTERS_[0-9]_BOOTSTRAPSERVERS=" | cut -d= -f1); do SERVER=$(eval echo \$$var) SERVER_ARGS="$SERVER_ARGS --kafka.server=$SERVER" done # 启动Kafka-exporter,合并原有配置与动态生成的集群参数 /bin/kafka_exporter --verbosity={{ .Values.verbosity }} \ {{- if .Values.sarama.logEnabled }} --log.enable-sarama \ {{- end }} {{- if .Values.kafkaBrokerVersion }} --kafka.version={{ .Values.kafkaBrokerVersion }} \ {{- end }} {{- if .Values.tls.enabled }} --tls.enabled \ {{- if .Values.tls.mountPath }} --tls.ca-file={{ .Values.tls.mountPath }}/ca.crt \ --tls.cert-file={{ .Values.tls.mountPath }}/tls.crt \ --tls.key-file={{ .Values.tls.mountPath }}/tls.key \ {{- end }} {{- if .Values.tls.insecureSkipVerify }} --tls.insecure-skip-tls-verify \ {{- else if .Values.tls.serverName }} --tls.server-name={{ .Values.tls.serverName }} \ {{- end }} {{- end }} {{- if .Values.sasl.enabled }} --sasl.enabled \ {{- if not .Values.sasl.handshake }} --sasl.handshake=false \ {{- end }} {{- if .Values.sasl.scram.enabled }} --sasl.username=$(SCRAM_USERNAME) \ --sasl.password=$(SCRAM_PASSWORD) \ --sasl.mechanism={{ .Values.sasl.scram.mechanism }} \ {{- end }} {{- if .Values.sasl.kerberos.enabled }} --sasl.service-name={{ .Values.sasl.kerberos.serviceName }} \ --sasl.kerberos-config-path={{ .Values.sasl.kerberos.mountPath }}/kerberos.conf \ --sasl.realm={{ .Values.sasl.kerberos.realm }} \ --sasl.keytab-path={{ .Values.sasl.kerberos.mountPath }}/kerberos.keytab \ --sasl.kerberos-auth-type={{ .Values.sasl.kerberos.kerberosAuthType }} \ {{- end }} {{- if .Values.server.tls.enabled }} --server.tls.ca-file={{ .Values.server.tls.mountPath }}/ca.crt \ --server.tls.cert-file={{ .Values.server.tls.mountPath }}/tls.crt \ --server.tls.key-file={{ .Values.server.tls.mountPath }}/tls.key \ --server.tls.mutual-auth-enabled={{ .Values.server.tls.mutualAuthEnabled }} \ {{- end }} {{- end }} {{- if .Values.extraArgs }} {{- range .Values.extraArgs }} {{ . }} \ {{- end }} {{- end }} $SERVER_ARGS
1.3 注释原有静态集群参数
将模板中原有静态生成--kafka.server的代码注释掉:
# {{- range $server := .Values.kafkaServer }} # - '--kafka.server={{ $server }}' # {{- end }}
步骤2:自动触发Pod滚动更新(可选)
为了让ConfigMap更新后自动重启Pod,在Pod模板的metadata.annotations中添加ConfigMap的哈希校验值:
metadata: annotations: checksum/kafka-config: {{ lookup "v1" "ConfigMap" "default" "kafka-configmap" | toYaml | sha256sum }} {{ toYaml .Values.annotations | indent 8 }}
效果说明
- 后续在ConfigMap中新增
KAFKA_CLUSTERS_3_BOOTSTRAPSERVERS等条目时,启动脚本会自动识别并添加对应的--kafka.server参数 - ConfigMap更新后,Pod会自动滚动重启(如果添加了哈希校验),无需手动修改Helm配置
内容的提问来源于stack exchange,提问作者sledge13
相关产品推荐
相关产品推荐

