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:
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.191
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.testshinyproxy
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.191
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.testshinyproxy
kubectl scale --replicas=0 penerapan/shinyproxy
deployment.extensions/shinyproxy diskalakan
skala kubectl --replicas=1 penyebaran/shinyproxy
deployment.extensions/shinyproxy diskalakan
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.191
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.testshinyproxy
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
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!
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: