嗨,当 application.yaml 发生更改并选择滚动更新时(副本设置为 0,然后返回 1)-主要是因为需要从工件下载新的 shinyproxy 映像-所有早期的 pod被先前的闪亮代理旋转起来,被当作僵尸的
重现:
名称 就绪 状态 重新开始 年龄
吊舱/shinyproxy-7f76d48c79-8x9hs 2/2 运行 0 41m
名称 类型 CLUSTER-IP EXTERNAL-IP PORT(S) 年龄
服务/shinyproxy 节点端口 172.30.85.191
姓名 期望的当前最新可用年龄
部署.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
名称 就绪 状态 重新开始 年龄
吊舱/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.191
姓名 期望的当前最新可用年龄
部署.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
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.191
姓名 期望的当前最新可用年龄
部署.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 是陈旧的并手动删除也非常困难
嗨@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 的位置和身份验证。
因此我认为这个问题会自动解决。
不过,感谢您的时间和调查!
最有用的评论
我找到了解决这个问题的方法。 这实际上不是 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 容器: