当其他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实际上显示了问题。它开始关闭进程并同时删除端点。所以它可能已经在端点注册之前关闭了。
答案 0 :(得分:0)
我发现post说了一个常见的陷阱,可能是你的情况:
假设您的Dockerfile以shell格式结束CMD:
CMD myapp
shell表单使用/ bin / sh -c myapp运行命令,因此进程 这将得到SIGTERM实际上是/ bin / sh而不是它的子myapp。 根据您运行的实际shell,它可能会也可能不会 将信号传递给孩子们。
可能是你的应用程序被猛烈杀死导致~200ms连接失败。也许尝试文章中提出的选项?