Shinyproxy: Shinyproxy 部署的滚动更新会导致孤儿 pod

创建于 2019-08-19  ·  7评论  ·  资料来源: openanalytics/shinyproxy

嗨,当 application.yaml 发生更改并选择滚动更新时(副本设置为 0,然后返回 1)-主要是因为需要从工件下载新的 shinyproxy 映像-所有早期的 pod被先前的闪亮代理旋转起来,被当作僵尸的

重现:

  • kubectl 得到所有

名称 就绪 状态 重新开始 年龄
吊舱/shinyproxy-7f76d48c79-8x9hs 2/2 运行 0 41m

名称 类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄
服务/shinyproxy 节点端口 172.30.85.1918080:32094/TCP 40m

姓名 期望的当前最新可用年龄
部署.apps/shinyproxy 1 1 1 1 41m

姓名 期望的当前就绪年龄
复制集.apps/shinyproxy-7f76d48c79 1 1 1 41m

名称主机/端口路径服务端口终止通配符
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test shinyproxy没有

  • 登录到应用程序(在我的情况下,我使用 LDAP auth 和 /app_direct/ 到闪亮的应用程序(应用程序的新 pod 已启动) - 正如预期的那样

名称 就绪 状态 重新开始 年龄
吊舱/shinyproxy-7f76d48c79-8x9hs 2/2 运行 0 43m
pod/sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 运行 0 12s

名称 类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄
服务/shinyproxy 节点端口 172.30.85.1918080:32094/TCP 43m

姓名 期望的当前最新可用年龄
部署.apps/shinyproxy 1 1 1 1 43m

姓名 期望的当前就绪年龄
复制集.apps/shinyproxy-7f76d48c79 1 1 1 43m

名称主机/端口路径服务端口终止通配符
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test shinyproxy没有

  • 在新的 shinyproxy 镜像构建之后:

kubectl scale --replicas=0 部署/shinyproxy
deployment.extensions/shinyproxy 缩放

kubectl scale --replicas=1 部署/shinyproxy
deployment.extensions/shinyproxy 缩放

  • 已为闪亮的代理和正在创建的容器下载了新图像。

名称 就绪 状态 重新开始 年龄
pod/shinyproxy-7f76d48c79-l5fvw 0/2 ContainerCreating 0 4s
吊舱/sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 运行 0 1m

名称 类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄
服务/shinyproxy 节点端口 172.30.85.1918080:32094/TCP 44m

姓名 期望的当前最新可用年龄
部署.apps/shinyproxy 1 1 1 0 45m

姓名 期望的当前就绪年龄
复制集.apps/shinyproxy-7f76d48c79 1 1 0 45m

名称主机/端口路径服务端口终止通配符
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test shinyproxy没有

  • 在这个阶段,我的 Web 应用程序没有响应——唯一要做的就是关闭选项卡/窗口。 除非手动删除,否则 pod(用于 R 应用程序)将继续保留。

  • 无法访问正在消耗资源的 pod,因为新服务指向更新的部署,应用程序只能通过服务上的路由访问

  • 识别哪些 pod 是陈旧的并手动删除也非常困难

最有用的评论

我找到了解决这个问题的方法。 这实际上不是 Shinyproxy 或 containerproxy 的问题,因为 Spring Boot 应用程序已正确且优雅地关闭。

问题是kubctl proxy边车容器。 对于 Kubernetes,containerproxy 是否依赖 sidecar 容器与 Kubernetes 本身进行通信尚不清楚。 因此,在新部署中,Kubernetes 将向所有旧 pod 中的代理和 sidecar 容器发送 SIGTERM。 sidecar 容器将立即终止,并且 containerproxy 无法与 Kubernetes 通信。

我读到 Kubernetes 即将在 v1.18 中解决这些启动和关闭依赖项,如下所述:
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/

在此之前,有一个简单的解决方法可以将以下生命周期注释放入 sidecar 容器:

          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 5"] # wait 5 seconds to let shinyproxy remove the pods on graceful shutdown

所有7条评论

@ramkumarg1

当 shinyproxy 接收到 SIGTERM 信号时(当部署缩减时),它应该通过首先停止所有应用程序 pod 来优雅地终止。 您可能需要在 pod 规范中增加宽限期terminationGracePeriodSeconds (默认为 30 秒)。 如果 Shinyproxy 在此期间无法终止,它将收到 SIGKILL 并立即终止,留下孤立的 pod。 更多信息: https ://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

谢谢@dseynaev ,我更改了部署规范以包括terminationGracePeriodSeconds - 但它没有'有所作为。 pod 立即被杀死 - 也许,这个问题与https://github.com/kubernetes/kubernetes/issues/47576相关,spring boot 需要优雅地处理 SIGTERM?

spec:
  terminationGracePeriodSeconds : 180
  containers:
  - name: shinyproxy

我们在僵尸 pod 上观察到同样的问题,对我们来说,终止宽限期设置也不能解决这个问题。

我有同样的问题,这是闪亮/容器代理在终止时记录的内容:

2020-01-30 10:56:56.785  INFO 1 --- [           main] e.o.c.ContainerProxyApplication          : Started ContainerProxyApplication in 39.115 seconds (JVM running for 43.619)
2020-01-30 10:57:01.374  INFO 1 --- [  XNIO-2 task-1] io.undertow.servlet                      : Initializing Spring FrameworkServlet 'dispatcherServlet'
2020-01-30 10:57:01.375  INFO 1 --- [  XNIO-2 task-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2020-01-30 10:57:01.507  INFO 1 --- [  XNIO-2 task-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 131 ms
2020-01-30 10:57:26.275  INFO 1 --- [ XNIO-2 task-16] e.o.containerproxy.service.UserService   : User logged in [user: **]
2020-01-30 10:57:35.802  INFO 1 --- [  XNIO-2 task-3] e.o.containerproxy.service.ProxyService  : Proxy activated [user: ***] [spec: insight] [id: 9274ad33-665a-4d47-bab5-6c4b39a618b8]
2020-01-30 10:59:02.376  INFO 1 --- [       Thread-2] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext<strong i="6">@2b2948e2</strong>: startup date [Thu Jan 30 10:56:24 GMT 2020]; root of context hierarchy
2020-01-30 10:59:02.377 ERROR 1 --- [pool-4-thread-1] java.io.InputStreamReader                : Error while pumping stream.
java.io.EOFException: null
    at okio.RealBufferedSource.require(RealBufferedSource.java:61) ~[okio-1.15.0.jar!/:na]
    at okio.RealBufferedSource.readHexadecimalUnsignedLong(RealBufferedSource.java:303) ~[okio-1.15.0.jar!/:na]
    at okhttp3.internal.http1.Http1Codec$ChunkedSource.readChunkSize(Http1Codec.java:469) ~[okhttp-3.12.0.jar!/:na]
    at okhttp3.internal.http1.Http1Codec$ChunkedSource.read(Http1Codec.java:449) ~[okhttp-3.12.0.jar!/:na]
    at okio.RealBufferedSource$1.read(RealBufferedSource.java:439) ~[okio-1.15.0.jar!/:na]
    at java.io.InputStream.read(InputStream.java:101) ~[na:1.8.0_171]
    at io.fabric8.kubernetes.client.utils.BlockingInputStreamPumper.run(BlockingInputStreamPumper.java:49) ~[kubernetes-client-4.2.2.jar!/:na]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
2020-01-30 10:59:02.394  INFO 1 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2020-01-30 10:59:02.403  INFO 1 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans
2020-01-30 10:59:02.514  WARN 1 --- [       Thread-2] .s.c.a.CommonAnnotationBeanPostProcessor : Invocation of destroy method failed on bean with name 'proxyService': eu.openanalytics.containerproxy.ContainerProxyException: Failed to stop container
2020-01-30 10:59:02.525  INFO 1 --- [       Thread-2] io.undertow.servlet                      : Destroying Spring FrameworkServlet 'dispatcherServlet'

我找到了解决这个问题的方法。 这实际上不是 Shinyproxy 或 containerproxy 的问题,因为 Spring Boot 应用程序已正确且优雅地关闭。

问题是kubctl proxy边车容器。 对于 Kubernetes,containerproxy 是否依赖 sidecar 容器与 Kubernetes 本身进行通信尚不清楚。 因此,在新部署中,Kubernetes 将向所有旧 pod 中的代理和 sidecar 容器发送 SIGTERM。 sidecar 容器将立即终止,并且 containerproxy 无法与 Kubernetes 通信。

我读到 Kubernetes 即将在 v1.18 中解决这些启动和关闭依赖项,如下所述:
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/

在此之前,有一个简单的解决方法可以将以下生命周期注释放入 sidecar 容器:

          lifecycle:
            preStop:
              exec:
                command: ["sh", "-c", "sleep 5"] # wait 5 seconds to let shinyproxy remove the pods on graceful shutdown

我可以确认@fmannhardt的修复解决了这个问题。 太感谢了!

大家好

使用最新版本的 ShinyProxy(我不确定究竟是哪个版本,但至少是 ShinyProxy 2.3.1),不需要使用 kube-proxy sidecar。 ShinyProxy 自动检测 Kubernetes API 的位置和身份验证。
因此我认为这个问题会自动解决。
不过,感谢您的时间和调查!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

benkates picture benkates  ·  3评论

jat255 picture jat255  ·  3评论

jfrubioz picture jfrubioz  ·  9评论

fmmattioni picture fmmattioni  ·  3评论

shrektan picture shrektan  ·  9评论