Pod重启时的竞争条件

时间:2017-06-01 15:07:46

标签: kubernetes

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

这可能是一个已知问题吗?知道如何解决这个问题吗?

对我来说,它看起来像是某种竞争条件(也就是说它在从其终点正确注销之前已经消失了)

我们正在使用Kubernetes v1.5.3。

这就是解决方法的样子(简化):

apiVersion: apps/v1beta1
kind: StatefulSet

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

example in the docs实际上显示了问题。它开始关闭进程并同时删除端点。所以它可能已经在端点注册之前关闭了。

1 个答案:

答案 0 :(得分:0)

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

  

假设您的Dockerfile以shell格式结束CMD:

     
    

CMD myapp

  
     

shell表单使用/ bin / sh -c myapp运行命令,因此进程   这将得到SIGTERM实际上是/ bin / sh而不是它的子myapp。   根据您运行的实际shell,它可能会也可能不会   将信号传递给孩子们。

可能是你的应用程序被猛烈杀死导致~200ms连接失败。也许尝试文章中提出的选项?