如何处理Kubernetes中持续/依赖状态的POD启动失败



我在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规范中 PreStartPreStop钩子。

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"

最新更新