مرحبًا ، عندما يكون هناك تغيير في التطبيق. yaml ويتم اختيار التحديث المتداول (مع تعيين النسخ المتماثلة على 0 ثم العودة إلى 1) - بشكل أساسي لأن صورة shinyproxy الجديدة يجب تنزيلها من المصنع - جميع البودات السابقة التي كانت نسجها بواسطة shinyproxy السابق تُترك وراءها مثل zombie
لإعادة إنتاج:
إعادة تعيين الوضع الجاهز للاسم العمر
جراب / shinyproxy-7f76d48c79-8x9hs 2/2 الجري 0 41 م
الاسم النوع CLUSTER-IP منفذ IP خارجي (S) العمر
الخدمة / shinyproxy NodePort 172.30.85.191
الاسم المطلوب العصر الحالي المحدث المتاح
Deploy.apps / shinyproxy 1 1 1 1 41 م
الاسم المطلوب في العصر الحالي
replicaset.apps / shinyproxy-7f76d48c79 1 1 1 41m
اسم المضيف / PORT PATH SERVICES PORT PORT WILDCARD
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test shinyproxy
إعادة تعيين الوضع الجاهز للاسم العمر
جراب / shinyproxy-7f76d48c79-8x9hs 2/2 الجري 0 43 م
جراب / sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 تشغيل 0 12s
الاسم النوع CLUSTER-IP منفذ IP خارجي (S) العمر
الخدمة / shinyproxy NodePort 172.30.85.191
الاسم المطلوب العصر الحالي المحدث المتاح
publish.apps / shinyproxy 1 1 1 1 43m
الاسم المطلوب في العصر الحالي
replicaset.apps / shinyproxy-7f76d48c79 1 1 1 43m
اسم المضيف / PORT PATH SERVICES PORT PORT WILDCARD
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test shinyproxy
مقياس kubectl - النسخ المتماثلة = 0 نشر / shinyproxy
الانتشار.التمديدات / تحجيم shinyproxy
مقياس kubectl - النسخ المتماثلة = 1 نشر / shinyproxy
الانتشار.التمديدات / تحجيم shinyproxy
إعادة تعيين الوضع الجاهز للاسم العمر
pod / shinyproxy-7f76d48c79-l5fvw 0/2 حاوية إنشاء 0 4s
جراب / sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 الجري 0 1 م
الاسم النوع CLUSTER-IP منفذ IP خارجي (S) العمر
الخدمة / shinyproxy NodePort 172.30.85.191
الاسم المطلوب العصر الحالي المحدث المتاح
publish.apps / shinyproxy 1 1 1 0 45m
الاسم المطلوب في العصر الحالي
replicaset.apps / shinyproxy-7f76d48c79 1 1 0 45m
اسم المضيف / PORT PATH SERVICES PORT PORT WILDCARD
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test shinyproxy
في هذه المرحلة ، يكون تطبيق الويب الخاص بي غير مستجيب - الشيء الوحيد الذي يجب فعله هو إغلاق علامة التبويب / النافذة. ويستمر البود (لتطبيق R) في البقاء ما لم يتم حذفه يدويًا.
لا يمكن الوصول إلى الكبسولة التي تستهلك الموارد ، لأن الخدمة الجديدة تشير إلى النشر والتطبيق المحدثين لا يمكن الوصول إليها إلا من خلال مسار عبر الخدمة
كما أنه من الصعب جدًا تحديد القرون التي لا معنى لها وحذفها يدويًا
مرحبًا @ ramkumarg1
عندما يستقبل shinyproxy كإشارة SIGTERM (عندما يتم تصغير النشر) ، يجب أن ينتهي برشاقة عن طريق إيقاف جميع كبسولات التطبيق أولاً. قد تضطر إلى زيادة فترة السماح terminationGracePeriodSeconds
في مواصفات البود (الافتراضي هو 30 ثانية). إذا كان shinyproxy غير قادر على الإنهاء خلال هذه الفترة ، فسوف يتلقى SIGKILL ويتم إنهاؤه على الفور ، تاركًا وراءه القرون اليتيمة. مزيد من المعلومات هنا: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
شكرًا dseynaev لقد غيرت مواصفات النشر لتشمل terminationGracePeriodSeconds - لكنها لم تحدث فرقًا. تم قتل الكبسولة على الفور - ربما ، هذه المشكلة مرتبطة بـ https://github.com/kubernetes/kubernetes/issues/47576 حيث يحتاج حذاء الربيع إلى التعامل مع SIGTERM بأمان؟
spec:
terminationGracePeriodSeconds : 180
containers:
- name: shinyproxy
نلاحظ نفس المشكلة مع قرون الزومبي ، وبالنسبة لنا ، لا يؤدي إعداد فترة السماح للإنهاء أيضًا إلى حل هذه المشكلة.
لدي نفس المشكلة وهذا ما يتم تسجيله بواسطة shiny / containerproxy عند الإنهاء:
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 يعتمد على الحاوية الجانبية للتواصل مع Kubernetes نفسها. لذلك ، في عملية نشر جديدة ، سترسل Kubernetes SIGTERM إلى كل من الوكيل والحاوية الجانبية في جميع الكبسولات القديمة. سيتم إنهاء الحاوية الجانبية على الفور وفشل وكيل الحاوية في الاتصال بـ Kubernetes.
قرأت أن Kubernetes على وشك حل تبعيات بدء التشغيل وإيقاف التشغيل في الإصدار 1.18 كما هو موثق هنا:
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/
حتى ذلك الحين ، هناك حل بسيط لوضع التعليق التوضيحي التالي لدورة الحياة على حاوية السيارة الجانبية:
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. يكتشف ShinyProxy تلقائيًا موقع ومصادقة Kubernetes API.
لذلك أعتقد أن هذه المشكلة تم حلها تلقائيًا.
ومع ذلك ، شكرا لك على وقتك والتحقيق!
التعليق الأكثر فائدة
لقد وجدت حلا لهذه المشكلة. هذه ليست مشكلة في الواقع في shinyproxy أو containerproxy لأن تطبيق Spring Boot مغلق بشكل صحيح ورشيق.
المشكلة هي الحاوية الجانبية
kubctl proxy
. بالنسبة إلى Kubernetes ، ليس من الواضح ما إذا كان containerproxy يعتمد على الحاوية الجانبية للتواصل مع Kubernetes نفسها. لذلك ، في عملية نشر جديدة ، سترسل Kubernetes SIGTERM إلى كل من الوكيل والحاوية الجانبية في جميع الكبسولات القديمة. سيتم إنهاء الحاوية الجانبية على الفور وفشل وكيل الحاوية في الاتصال بـ Kubernetes.قرأت أن Kubernetes على وشك حل تبعيات بدء التشغيل وإيقاف التشغيل في الإصدار 1.18 كما هو موثق هنا:
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/
حتى ذلك الحين ، هناك حل بسيط لوضع التعليق التوضيحي التالي لدورة الحياة على حاوية السيارة الجانبية: