Shinyproxy: Pembaruan bergulir untuk penyebaran glossyproxy menyebabkan pod yatim piatu

Dibuat pada 19 Agu 2019  ·  7Komentar  ·  Sumber: openanalytics/shinyproxy

Hai, ketika ada perubahan di application.yaml dan pembaruan bergulir dipilih (dengan replika disetel ke 0 dan kemudian kembali ke 1) - terutama karena gambar glossyproxy baru perlu diunduh dari artifactory - Semua pod sebelumnya yang ada diputar oleh proxy mengkilap sebelumnya tertinggal sebagai zombie

Untuk mereproduksi:

  • kubectl dapatkan semua

NAMA STATUS SIAP MULAI KEMBALI USIA
pod/shinyproxy-7f76d48c79-8x9hs 2/2 Berjalan 0 41m

NAMA JENIS CLUSTER-IP EXTERNAL-IP PORT(S) USIA
service/shinyproxy NodePort 172.30.85.1918080:32094/TCP 40m

NAMA YANG DIINGINKAN UMUR TERSEDIA SAAT INI TERBARU
deployment.apps/shinyproxy 1 1 1 1 41m

NAMA YANG DIINGINKAN SAAT INI UMUR SIAP
replicaset.apps/shinyproxy-7f76d48c79 1 1 1 41m

NAMA HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/shinyproxyshinyproxy-aap.apps.cpaas.service.testshinyproxyTidak ada

  • Masuk ke aplikasi (Dalam kasus saya, saya menggunakan LDAP auth dan /app_direct/ ke aplikasi mengkilap (pod baru untuk aplikasi diputar) - seperti yang diharapkan

NAMA STATUS SIAP MULAI KEMBALI USIA
pod/shinyproxy-7f76d48c79-8x9hs 2/2 Berjalan 0 43m
pod/sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 Berjalan 0 12s

NAMA JENIS CLUSTER-IP EXTERNAL-IP PORT(S) USIA
service/shinyproxy NodePort 172.30.85.1918080:32094/TCP 43m

NAMA YANG DIINGINKAN UMUR TERSEDIA SAAT INI TERBARU
deployment.apps/shinyproxy 1 1 1 1 43m

NAMA YANG DIINGINKAN SAAT INI UMUR SIAP
replicaset.apps/shinyproxy-7f76d48c79 1 1 1 43m

NAMA HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/shinyproxyshinyproxy-aap.apps.cpaas.service.testshinyproxyTidak ada

  • Setelah gambar glossyproxy baru dibuat:

kubectl scale --replicas=0 penerapan/shinyproxy
deployment.extensions/shinyproxy diskalakan

skala kubectl --replicas=1 penyebaran/shinyproxy
deployment.extensions/shinyproxy diskalakan

  • Gambar Baru telah diunduh untuk proxy mengkilap dan wadah sedang dibuat.

NAMA STATUS SIAP MULAI KEMBALI USIA
pod/shinyproxy-7f76d48c79-l5fvw 0/2 ContainerCreating 0 4s
pod/sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 Lari 0 1m

NAMA JENIS CLUSTER-IP EXTERNAL-IP PORT(S) USIA
service/shinyproxy NodePort 172.30.85.1918080:32094/TCP 44m

NAMA YANG DIINGINKAN UMUR TERSEDIA SAAT INI TERBARU
deployment.apps/shinyproxy 1 1 1 0 45m

NAMA YANG DIINGINKAN SAAT INI UMUR SIAP
replicaset.apps/shinyproxy-7f76d48c79 1 1 0 45m

NAMA HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/shinyproxyshinyproxy-aap.apps.cpaas.service.testshinyproxyTidak ada

  • Pada tahap ini aplikasi web saya tidak responsif - satu-satunya hal yang harus dilakukan adalah menutup tab/jendela. Dan pod (untuk aplikasi R) tetap ada kecuali dihapus secara manual.

  • Pod yang memakan sumber daya tidak dapat diakses, karena layanan baru menunjuk ke penerapan dan aplikasi yang diperbarui hanya dapat diakses melalui rute melalui layanan

  • Juga sangat sulit untuk mengidentifikasi pod mana yang basi dan menghapusnya secara manual

Komentar yang paling membantu

Saya menemukan solusi untuk masalah ini. Ini sebenarnya bukan masalah dalam glossyproxy atau containerproxy karena aplikasi Spring Boot dimatikan dengan benar dan anggun.

Masalahnya adalah wadah sespan kubctl proxy . Untuk Kubernetes tidak jelas apakah containerproxy bergantung pada container sespan untuk berkomunikasi dengan Kubernetes itu sendiri. Jadi, pada penerapan baru, Kubernetes akan mengirim SIGTERM ke proxy dan container sidecar di semua pod lama. Container sespan akan segera dihentikan dan containerproxy gagal berkomunikasi dengan Kubernetes.

Saya membaca bahwa Kubernetes akan menyelesaikan dependensi startup dan shutdown ini di v1.18 seperti yang didokumentasikan di sini:
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/

Sampai saat itu ada solusi sederhana untuk menempatkan anotasi siklus hidup berikut ke wadah sespan:

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

Semua 7 komentar

Hai @ramkumarg1

Saat mengkilapproxy menerima sebagai sinyal SIGTERM (saat penerapan diperkecil), ia harus diakhiri dengan baik dengan menghentikan semua pod aplikasi terlebih dahulu. Anda mungkin harus meningkatkan masa tenggang terminationGracePeriodSeconds dalam spesifikasi pod (default adalah 30 detik). Jika glossyproxy tidak dapat dihentikan dalam periode ini, ia akan menerima SIGKILL dan segera dihentikan, meninggalkan pod yatim piatu. Info lebih lanjut di sini: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

Terima kasih @dseynaev Saya mengubah spesifikasi penerapan untuk menyertakan terminasiGracePeriodSeconds - tetapi tidak ada bedanya. Pod segera dimatikan - Mungkin, masalah ini terkait dengan https://github.com/kubernetes/kubernetes/issues/47576 di mana boot musim semi perlu menangani SIGTERM dengan anggun?

spec:
  terminationGracePeriodSeconds : 180
  containers:
  - name: shinyproxy

Kami mengamati masalah yang sama dengan pod zombie, dan bagi kami pengaturan masa tenggang penghentian juga tidak menyelesaikan ini.

Saya memiliki masalah yang sama dan inilah yang dicatat oleh glossy/containerproxy setelah penghentian:

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'

Saya menemukan solusi untuk masalah ini. Ini sebenarnya bukan masalah dalam glossyproxy atau containerproxy karena aplikasi Spring Boot dimatikan dengan benar dan anggun.

Masalahnya adalah wadah sespan kubctl proxy . Untuk Kubernetes tidak jelas apakah containerproxy bergantung pada container sespan untuk berkomunikasi dengan Kubernetes itu sendiri. Jadi, pada penerapan baru, Kubernetes akan mengirim SIGTERM ke proxy dan container sidecar di semua pod lama. Container sespan akan segera dihentikan dan containerproxy gagal berkomunikasi dengan Kubernetes.

Saya membaca bahwa Kubernetes akan menyelesaikan dependensi startup dan shutdown ini di v1.18 seperti yang didokumentasikan di sini:
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/

Sampai saat itu ada solusi sederhana untuk menempatkan anotasi siklus hidup berikut ke wadah sespan:

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

Saya dapat mengonfirmasi bahwa perbaikan @fmannhardt menyelesaikan ini. Terima kasih banyak!

Halo semua

Dengan ShinyProxy versi terbaru (saya tidak yakin versi yang tepat, tetapi setidaknya ShinyProxy 2.3.1) tidak perlu menggunakan sidecar kube-proxy. ShinyProxy secara otomatis mendeteksi lokasi dan autentikasi Kubernetes API.
Oleh karena itu saya pikir masalah ini secara otomatis terpecahkan.
Namun demikian, terima kasih atas waktu dan penyelidikan Anda!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

algo-se picture algo-se  ·  6Komentar

lucius-verus-fan picture lucius-verus-fan  ·  7Komentar

dylancis picture dylancis  ·  3Komentar

jfrubioz picture jfrubioz  ·  9Komentar

lucius-verus-fan picture lucius-verus-fan  ·  8Komentar