Kubernetes 吊舱重启时的竞争条件

Kubernetes 吊舱重启时的竞争条件,kubernetes,Kubernetes,当其他POD通过服务(使用ClusterIP)连接到POD时,我们在重新启动POD时遇到了一个较小的问题。当pod宕机时,会有一个很小的时间跨度(~200ms),其中一些客户端请求会失败,因为它们仍然试图连接到刚刚宕机的pod。这会导致一些“连接被拒绝”错误。我们可以通过添加一个可休眠一秒钟的预停止挂钩来避免它。不幸的是,在每次部署中都这样做是很难看的 这可能是一个已知的问题吗?你知道怎么解决这个问题吗 对我来说,这看起来像某种竞赛条件(即pod在从其端点正确注销之前就消失了) 我们正在使用Ku

当其他POD通过服务(使用ClusterIP)连接到POD时,我们在重新启动POD时遇到了一个较小的问题。当pod宕机时,会有一个很小的时间跨度(~200ms),其中一些客户端请求会失败,因为它们仍然试图连接到刚刚宕机的pod。这会导致一些“连接被拒绝”错误。我们可以通过添加一个可休眠一秒钟的预停止挂钩来避免它。不幸的是,在每次部署中都这样做是很难看的

这可能是一个已知的问题吗?你知道怎么解决这个问题吗

对我来说,这看起来像某种竞赛条件(即pod在从其端点正确注销之前就消失了)

我们正在使用Kubernetes v1.5.3

这就是解决方案的外观(简化):

事实上,这说明了这个问题。它开始关闭进程,同时删除端点。因此,它可能已经在端点注册之前关闭了。

我发现了一个说法,一个常见的陷阱可能就是您的情况:

假设Dockerfile以shell形式的CMD结尾:

CMD myapp

shell表单使用/bin/sh-cmyapp运行命令,因此 这将得到SIGTERM实际上是/bin/sh,而不是它的子myapp。 根据您正在运行的实际shell,它可以运行也可以不运行 把信号传给孩子们

可能是您的应用程序被暴力杀死,导致~200毫秒的连接失败。也许可以尝试一下文章中建议的选项?

我发现一个说法是一个常见的陷阱,可能就是你的情况:

假设Dockerfile以shell形式的CMD结尾:

CMD myapp

shell表单使用/bin/sh-cmyapp运行命令,因此 这将得到SIGTERM实际上是/bin/sh,而不是它的子myapp。 根据您正在运行的实际shell,它可以运行也可以不运行 把信号传给孩子们


可能是您的应用程序被暴力杀死,导致~200毫秒的连接失败。也许可以尝试文章中建议的选项?

我们的环境并非如此。我们已经对没有任何中间shell过程非常挑剔了。我们的环境并非如此。我们已经对没有任何中间外壳工艺非常挑剔了。
apiVersion: apps/v1beta1
kind: StatefulSet

spec:
  template:
    spec:
      containers:
      - name: solr
        lifecycle:
          preStop:
            exec:
              command:
              - /bin/sleep
              - "1"