gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:16:00 27 4
gpt4 key购买 nike

我在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)

我使用官方 Helm 图安装了Kafka,因此我假设Kafka和Zookeeper pods 的设置以及对持久卷和声明的分配都适合Kubernetes。

首先:将运行状态持久存储在持久卷上是一个好主意吗?由于 pods 被认为是不可靠的,并且可能在任何时间崩溃或被逐出,因此此方法很容易出错。我是否应该认为这是值得向 Helm chart 作者报告的错误或缺陷?

由于存在错误并且其他软件可能会在持久性卷上保持其运行状态,因此我对一种通用的最佳实践方法感兴趣,该方法是如何将持久性卷置于一种状态,使使用它的Pod可以再次启动(在这种情况下,从 /opt/kafka/data/logs afaik删除锁定文件)。

到目前为止,我尝试在容器 shell 中启动控制台,并尝试运行命令以在Pod崩溃之前删除文件。这需要一些尝试并且非常烦人。

我在Ubuntu 19.10上的microk8s 1.14.2(608)上遇到了这种情况,但我认为它可能会在任何Kubernetes实现上发生。

最佳答案

要解决此错误,我认为我们仅需要Kafka pod规范中的PreStartPreStop Hook即可,就像其他官方 Helm 图表一样。

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"

关于kubernetes - 如何处理Kubernetes中持久/状态相关的Pod启动失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56303672/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com