用k8s部署kafka集群configmap覆盖默认config

▓千年祇园 卐 发表于: 2022-12-19   最后更新时间: 2022-12-19 12:36:44   1,621 游览

我尝试用configmap在kafka yaml文件中对kafka集群配置。

kafka用的镜像是bitnami/kafka:v2.5.0,linux系统centos 7.0,zk用的系统镜像3.6.3。

configmap 配置如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: kafka-config
  namespace: kafka
data:
  server.properties: |
    broker.id=${HOSTNAME##*-}
    listeners=PLAINTEXT://:9092
    num.network.threads=3
    num.io.threads=8
    socket.send.buffer.bytes=102400
    socket.receive.buffer.bytes=102400
    socket.request.max.bytes=104857600
    message.max.bytes=41943040
    replica.fetch.max.bytes=41943040
    fetch.message.max.bytes=41943040
    log.dirs=/data/kafka/logs
    num.partitions=1
    num.recovery.threads.per.data.dir=1
    offsets.topic.replication.factor=1
    transaction.state.log.replication.factor=1
    transaction.state.log.min.isr=1
    log.retention.hours=168
    log.segment.bytes=1073741824
    log.retention.check.interval.ms=300000
    zookeeper.connect=zk1:2181
    zookeeper.connection.timeout.ms=18000
    group.initial.rebalance.delay.ms=0

在kafka deployment中引用的部分如下:

spec:
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
  nodeName: kafka-pod-123
  hostname: kafka-pod-123
  volumes:  
    - name: config-volume
      configMap:
        name: kafka-config
  containers:
  - name: kafka-VAR_KF_ID
    image: hbp/bitnami/kafka:2.5.0
    ports:
    - containerPort: 9092
    volumeMounts:          
      - name: config-volume
        mountPath: /configmap/config

部署完kafka集群进入其中一个容器后,发现kafka集群启动配置并没有被覆盖,但configmap确实在容器中存在了,请问这是什么原因呢?另外感觉kafka集群启动配置(蓝色框示)比之前配置少了很多,这是configmap的缘故吗?求解,谢谢~

screenshot

发表于 2022-12-19
添加评论

一个是/configmap/config目录,一个是/opt/bitnami/kafka/config目录,这俩目录都不同,怎么会被覆盖呢?

推荐你官方的安装方式:

哇,所以只需要将 /configmap/config 改成 /opt/bitnami/kafka/config 就可以了? 这样是不是 /opt/bitnami/kafka/config 有但 /configmap/config 没有的配置就也会被覆盖,变没了?

还有就是kafka集群启动配置(蓝色框示)比之前配置少了很多,这是configmap的缘故吗?

可以使用subPath,只覆盖个体的文件,例如:

volumeMounts:
  - name: config-volume
    subPath: server.properties
    mountPath: /opt/bitnami/kafka/config/server.properties

另外,你要关注的是kafka指定启动的配置文件是不是这里。

我用 find 找了一下 server.properties 这个文件,貌似只有这个地方有 (这里不能附图),您提到的subPath,我试了下,提示:

No injected configuration files found, creating default config files
/opt/bitnami/scripts/libkafka.sh: line 49: /opt/bitnami/kafka/config/server.properties: Permission denied

权限不足。

说明你这个镜像,当下运行的用户是非root的,所以权限被拒了。
可以通过runAsUser来切换当前容器的用户权限(前提是root还被保留),类似如下:

securityContext:
  runAsUser: 0

新的错误信息了:

No injected configuration files found, creating default config files
/opt/bitnami/scripts/libkafka.sh: line 49: /opt/bitnami/kafka/config/server.properties: Read-only file system

其实我宿主机相关目录已经有足够的权限了,是表明不能修改容器内的 server.properties 么

说明你不能覆盖这个文件。
首先,configmap覆盖了默认的文件,然后/opt/bitnami/scripts/libkafka.sh: line 49这个脚本去修改它,但是configmap这种类型的挂载,始终是只读的,所以是无法修改的。

哦哦,原来。如果我需要从configMap的方式修改server.properties是不是行不通了。最初的想法是希望能通过configMap重新动态修改的方式来修改kafka server.properties配置信息,以便热更新。或许有没有更好一点的办法?谢谢

使用kubernetes滚动升级,就没有热不热的了;其他的太复杂,要重新做镜像,建议不要这么搞。
我看bitnami/kafka的镜像是通过环境变量设置的kafka参数,我建议你遵循它的默认方式。

我尝试使用环境变量来设置相关配置,不巧的是,某些环境变量貌似在bitnami/kafka中并未定义,例如:

num.network.threads=3
num.io.threads=8
log.retention.hours=168

等等

那这个我帮不了你了,你哪里看的教程,就去哪里找答案吧。

好咧,谢谢~

你的答案

查看kafka相关的其他问题或提一个您自己的问题