kubernetes中无法查看zookeeper启动日志

▓千年祇园 卐 发表于: 2022-12-21   最后更新时间: 2022-12-22 13:33:18   970 游览

1、我在k8s中使用zookeeper 3.6.3的官方镜像搭建zk集群,发现镜像中/conf目录下有以下4个文件:
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg

2、但部署后k8s容器中只有zoo.cfg这个文件,没有了log4j.properties, 从而用kubectl logs查看zk pod日志时
会显示如下:

kubernetes中无法查看zookeeper启动日志

3、我发现在镜像中conf目录隶属于zookeeper:zookeeper用户组:用户下,尝试创建 zookeeper:zookeeper用户组,并赋予相关权限,但容器中 /conf 目录下仍只有 zoo.cfg 文件,这样由于没有 log4j.properties 无法继续显示启动日志,如果这个 pod 部署不成功 Error/CrashLoopBackOff 均无法查看其失败的原因。

4、请问一下我需要额外配置什么,在k8s容器中才会显示其它3个配置文件呢?或者如何查看pod Error/CrashLoopBackOff 部署失败的详情?谢谢

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

查看相关的事件,看看是否可以定位到相关错误:

kubectl get events -n base-services

谢谢回复,我按您的方法试了一下,得到的信息也是比较少,跟kubectl describe pod的结果差不多。请问下您们用k8s部署后也会出现log4j配置文件丢失吗?

你的zoo.cfg配置文件是否是通过外部挂载的方式,进行挂载的。如果是直接挂载目录的话,容器中的原始文件将会被覆盖清空。
建议你使用子目录的方式,单独挂载文件目录。

          volumeMounts:
            - mountPath: /opt/zookeeper-xxxxx.xxx.xx/conf/zoo.cfg
              name: cfg
              subPath: zoo.cfg

谢谢回复。我是通过主机目录映射的方式挂载的,应该就是你说的外部挂载方式,其中template:spec如下:

 spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      nodeName: zk-1234
      volumes:
        - name: time-volume
          hostPath:
            path: /etc/localtime
        - name: zk-conf
          hostPath:
            path: /opt/local/data/zk/conf
        - name: zk-data
          hostPath:
            path: /opt/local/data/zk/data
        - name: zk-datalog
          hostPath:
            path: /opt/local/data/zk/datalog
        #- name: zk-logs
        #  hostPath:
        #    path: /opt/local/data/zk/logs
      containers:
      - name: zk0
        image: zookeeper:3.6.3  
        ports:
        - containerPort: 2181       
        volumeMounts:
          - mountPath: /etc/localtime
            name: time-volume
          - mountPath: /data
            name: zk-data
          - mountPath: /conf
            name: zk-conf
          - mountPath: /datalog
            name: zk-datalog

(1).像我这样的配置yml方式如果采用subPath就可以实现原始文件完全映射了,是吧?
(2).这样如果数据更新会不会同步呢?
(3).此外,如果/conf目录下有3个文件:configuration.xsl log4j.properties zoo.cfg, 是需要像zoo.cfg一样,对其它两个文件均使用subPath的方式挂载吗?

问题1:你没有使用subPath挂载,你是使用的全文件夹目录挂载的。只要你主机的/opt/local/data/zk/conf这个目录下有几个配置文件,容器中就只会有几个配置文件,他会将原来容器中的清空,再挂你的主机中的文件。
问题2:你挂载了文件自然就与主机的配置一样的。
问题3:如果你的主机中没写全配置文件,就必须每个都需要写subPath挂载。

谢谢~
起先,我主机的目录是空的,对于镜像中/conf目录如果不进行挂载,则/conf目录也有上面的configuration.xsl log4j.properties zoo.cfg这些文件,一旦进行volumeMounts挂载后,/conf将被清空,最后会将zoo.cfg拷贝到主机目录下。

您说的

 volumeMounts:
            - mountPath: /opt/zookeeper-xxxxx.xxx.xx/conf/zoo.cfg
              name: cfg
              subPath: zoo.cfg

我也尝试将mountPath改成/conf/zoo.cfg,其它跟您的一致,结果在主机目录下生成zoo.cfg目录,此时kubectl logs仍没有相关日志,于是我再将log4j.properties也采用subPath的方法,结果也只是生成log4j.properties目录,仍没有相关日志,估计还是pod中/conf仍没有log4j.properties文件的缘故。

后来我尝试用其它目录作为mountPath,如/home, 此时pod中/conf有上面的几个文件了,也产生的日志文件,不过,此时zoo.cfg虽然在pod下/home生成了,但并没有映射到主机目录了,zk也就没读zoo.cfg配置信息,故不能组成集群

https://www.kubebiz.com/KubeBiz/zookeeper
你可以参考这个网站使用的zookeeper案例。 是你想要的集群方式。

多谢,对于st模式的集群模式之前尝试过,应该是ok的,但我们现在要求用deployment+host主机映射,所以有了上述一些问题。

你的答案

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