如何在Kubernetes中处理持久/状态相关的Pod启动失败?

时间:2019-05-25 09:47:02

标签: kubernetes apache-kafka locking kubernetes-helm

我在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实现中发生。

1 个答案:

答案 0 :(得分:1)

要解决此错误,我认为我们只需要PreStartPreStop卡夫卡(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"