我在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吊舱的设置以及对持久性卷和声明的分配都适合Kubernetes。
首先:将运行状态持久存储在持久卷上是一个好主意吗?由于吊舱被认为是不可靠的,并且可能在任何时间点崩溃或被逐出,因此此方法非常容易出错。我是否应该认为这是值得向舵图作者报告的错误或缺陷?
由于存在错误,并且其他软件可能会在持久性卷上保持其运行状态,因此我对一种通用的最佳实践方法感兴趣,该方法是如何将持久性卷置于一种状态,在该状态下,使用它的pod可以再次启动(在这种情况下)应该从/opt/kafka/data/logs
afaik中删除锁定文件)。
到目前为止,我尝试在容器外壳中启动控制台,并尝试运行命令以在Pod崩溃之前删除文件。这需要一些尝试并且非常烦人。
我在Ubuntu 19.10上使用microk8s 1.14.2(608)遇到了这种情况,但是我认为它可能会在任何Kubernetes实现中发生。
答案 0 :(得分:1)
要解决此错误,我认为我们只需要PreStart
和PreStop
卡夫卡(Kafka)吊舱规范中的钩子,就像其他官方头盔图表一样即可。
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"