Shinyproxy: يتسبب التحديث المتداول لنشر shinyproxy في ظهور القرون اليتيمة

تم إنشاؤها على ١٩ أغسطس ٢٠١٩  ·  7تعليقات  ·  مصدر: openanalytics/shinyproxy

مرحبًا ، عندما يكون هناك تغيير في التطبيق. yaml ويتم اختيار التحديث المتداول (مع تعيين النسخ المتماثلة على 0 ثم العودة إلى 1) - بشكل أساسي لأن صورة shinyproxy الجديدة يجب تنزيلها من المصنع - جميع البودات السابقة التي كانت نسجها بواسطة shinyproxy السابق تُترك وراءها مثل zombie

لإعادة إنتاج:

  • kubectl الحصول على كل شيء

إعادة تعيين الوضع الجاهز للاسم العمر
جراب / shinyproxy-7f76d48c79-8x9hs 2/2 الجري 0 41 م

الاسم النوع CLUSTER-IP منفذ IP خارجي (S) العمر
الخدمة / shinyproxy NodePort 172.30.85.1918080: 32094 / TCP 40 م

الاسم المطلوب العصر الحالي المحدث المتاح
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لا أحد

  • تسجيل الدخول إلى التطبيق (في حالتي ، أستخدم مصادقة LDAP و / app_direct / إلى تطبيق لامع (يتم إنشاء جراب جديد للتطبيق) - كما هو متوقع

إعادة تعيين الوضع الجاهز للاسم العمر
جراب / 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.1918080: 32094 / TCP 43 م

الاسم المطلوب العصر الحالي المحدث المتاح
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لا أحد

  • بعد إنشاء صورة 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.1918080: 32094 / TCP 44 م

الاسم المطلوب العصر الحالي المحدث المتاح
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) في البقاء ما لم يتم حذفه يدويًا.

  • لا يمكن الوصول إلى الكبسولة التي تستهلك الموارد ، لأن الخدمة الجديدة تشير إلى النشر والتطبيق المحدثين لا يمكن الوصول إليها إلا من خلال مسار عبر الخدمة

  • كما أنه من الصعب جدًا تحديد القرون التي لا معنى لها وحذفها يدويًا

التعليق الأكثر فائدة

لقد وجدت حلا لهذه المشكلة. هذه ليست مشكلة في الواقع في 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

ال 7 كومينتر

مرحبًا @ 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.
لذلك أعتقد أن هذه المشكلة تم حلها تلقائيًا.
ومع ذلك ، شكرا لك على وقتك والتحقيق!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات