我在kubernetes pod上有以下问题,专门访问持久卷,而在使用它的上一个pod关闭时显然未删除文件:
[2019-05-25 09:11:33,980] ERROR [KafkaServer id=0] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
org.apache.kafka.common.KafkaException: Failed to acquire lock on file .lock in /opt/kafka/data/logs. A Kafka instance in another process or thread is using this directory.
at kafka.log.LogManager$$anonfun$lockLogDirs$1.apply(LogManager.scala:240)
at kafka.log.LogManager$$anonfun$lockLogDirs$1.apply(LogManager.scala:236)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
at kafka.log.LogManager.lockLogDirs(LogManager.scala:236)
at kafka.log.LogManager.<init>(LogManager.scala:97)
at kafka.log.LogManager$.apply(LogManager.scala:953)
at kafka.server.KafkaServer.startup(KafkaServer.scala:237)
at io.confluent.support.metrics.SupportedServerStartable.startup(SupportedServerStartable.java:114)
at io.confluent.support.metrics.SupportedKafka.main(SupportedKafka.java:66)
我使用官方掌舵图安装了kafka,所以我假设Kafka和Zookeeper Pods的设置以及任一分配的持续数量和索赔适合Kubernetes。
首先:这是在持久卷上坚持运行状态的好主意吗?由于POD应该是不可靠的,并且可以在任何时间点崩溃或被驱逐出境,因此此方法非常容易出现错误。我应该认为这是一个错误或缺陷,值得向Helm图表作者报告吗?
由于存在错误,并且其他软件可能会持续存在在持续卷上运行状态,因此我对一般最佳实践方法感兴趣,如何将持续卷带入可以再次开始的pod可以重新开始的状态(在这种情况下它应该从 /opt/kafka/data/logs
afaik删除锁定文件(。
到目前为止,我试图在容器外壳中启动一个控制台,并试图在POD崩溃之前运行命令以删除文件。这需要一些尝试,非常烦人。
我在Ubuntu 19.10上使用Microk8s 1.14.2(608(进行了体验,但我认为这可能会在任何Kubernetes实施中发生。
要解决此错误,我认为我们只需要像其他官方头盔图一样在kafka pod规范中 PreStart
和 PreStop
钩子。
containers:
- name: kafka-broker
...
lifecycle:
preStart:
exec:
command:
- "/bin/sh"
- "-ec"
- |
rm -rf ${KAFKA_LOG_DIRS}/.lock
preStop:
exec:
command:
- "/bin/sh"
- "-ec"
- "/usr/bin/kafka-server-stop"