์๋ ํ์ธ์, application.yaml์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ณ ๋กค๋ง ์ ๋ฐ์ดํธ๊ฐ ์ ํ๋ ๋(๋ณต์ ๋ณธ์ 0์ผ๋ก ์ค์ ํ ๋ค์ ๋ค์ 1๋ก ์ค์ ) - ์ฃผ๋ก ์๋ก์ด Shinyproxy ์ด๋ฏธ์ง๋ฅผ ์ํฐํฉํธ์์ ๋ค์ด๋ก๋ํด์ผ ํ๊ธฐ ๋๋ฌธ์ - ์ด์ ์ ์์๋ ๋ชจ๋ ํฌ๋ ์ด์ Shinyproxy์ ์ํด ์คํ์ ๋์ด ์ข๋น๋ก ๋จ๊ฒจ์ง๋๋ค.
์ฌํํ๋ ค๋ฉด:
์ด๋ฆ ์ค๋น ์ํ ๋ค์ ์์ ์ฐ๋ น
pod/shinyproxy-7f76d48c79-8x9hs 2/2 ์คํ 0 41m
์ด๋ฆ ์ ํ CLUSTER-IP ์ธ๋ถ IP ํฌํธ(๋ค) ๋์ด
์๋น์ค/shinyproxy NodePort 172.30.85.191
์ด๋ฆ ์ํ๋ ํ์ฌ ์ต์ ๊ฐ๋ฅ ์ฐ๋ น
Deployment.apps/shinyproxy 1 1 1 1 41m
์ด๋ฆ ํฌ๋ง ํ์ฌ ์ค๋น ์ฐ๋ น
replicaset.apps/shinyproxy-7f76d48c79 1 1 1 41m
์ด๋ฆ ํธ์คํธ/ํฌํธ ๊ฒฝ๋ก ์๋น์ค ํฌํธ ์ข
๋ฃ ์์ผ๋์นด๋
route.route.openshift.io/shinyproxy shinyproxy-aap.apps.cpaas.service.test Shinyproxy
์ด๋ฆ ์ค๋น ์ํ ๋ค์ ์์ ์ฐ๋ น
pod/shinyproxy-7f76d48c79-8x9hs 2/2 ์คํ 0 43m
pod/sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 ์คํ 0 12์ด
์ด๋ฆ ์ ํ CLUSTER-IP ์ธ๋ถ IP ํฌํธ(๋ค) ๋์ด
์๋น์ค/shinyproxy NodePort 172.30.85.191
์ด๋ฆ ์ํ๋ ํ์ฌ ์ต์ ๊ฐ๋ฅ ์ฐ๋ น
Deployment.apps/shinyproxy 1 1 1 1 43m
์ด๋ฆ ํฌ๋ง ํ์ฌ ์ค๋น ์ฐ๋ น
replicaset.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
pod/sp-pod-e7603441-03ba-470b-925a-22cfba1716de 1/1 ๋ฌ๋ 0 1m
์ด๋ฆ ์ ํ CLUSTER-IP ์ธ๋ถ IP ํฌํธ(๋ค) ๋์ด
์๋น์ค/shinyproxy NodePort 172.30.85.191
์ด๋ฆ ์ํ๋ ํ์ฌ ์ต์ ๊ฐ๋ฅ ์ฐ๋ น
Deployment.apps/shinyproxy 1 1 1 0 45m
์ด๋ฆ ํฌ๋ง ํ์ฌ ์ค๋น ์ฐ๋ น
replicaset.apps/shinyproxy-7f76d48c79 1 1 0 45m
์ด๋ฆ ํธ์คํธ/ํฌํธ ๊ฒฝ๋ก ์๋น์ค ํฌํธ ์ข
๋ฃ ์์ผ๋์นด๋
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๋ฅผ ํฌํจํ๋๋ก ๋ฐฐํฌ ์ฌ์์ ๋ณ๊ฒฝํ์ง๋ง ์ฐจ์ด๊ฐ ์์์ต๋๋ค. ํฌ๋๊ฐ ์ฆ์ ์ข ๋ฃ๋จ - ์๋ง๋ ์ด ๋ฌธ์ ๋ ์คํ๋ง ๋ถํธ๊ฐ SIGTERM์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ https://github.com/kubernetes/kubernetes/issues/47576 ์ ์ฐ๊ฒฐ๋์ด ์์ต๋๊น?
spec:
terminationGracePeriodSeconds : 180
containers:
- name: shinyproxy
์ฐ๋ฆฌ๋ ์ข๋น ํฌ๋์์ ๋์ผํ ๋ฌธ์ ๋ฅผ ๊ด์ฐฐํ์ผ๋ฉฐ ์ข ๋ฃ ์ ์ ๊ธฐ๊ฐ ์ค์ ์ผ๋ก๋ ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ ์ด๊ฒ์ ์ข ๋ฃ ์ ๋ฐ์ง/์ปจํ ์ด๋ ํ๋ก์์ ์ํด ๊ธฐ๋ก๋๋ ๊ฒ์ ๋๋ค.
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'
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๋ค. Spring Boot ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ณ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ค์ ๋ก shinyproxy ๋๋ containerproxy์์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋ฌธ์ ๋ kubctl proxy
์ฌ์ด๋์นด ์ปจํ
์ด๋์
๋๋ค. Kubernetes์ ๊ฒฝ์ฐ containerproxy๊ฐ Kubernetes ์์ฒด์ ํต์ ํ๊ธฐ ์ํด ์ฌ์ด๋์นด ์ปจํ
์ด๋์ ์์กดํ๋์ง ๋ช
ํํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ๋ฐฐํฌ์์ Kubernetes๋ ๋ชจ๋ ์ด์ ํฌ๋์ ํ๋ก์์ ์ฌ์ด๋์นด ์ปจํ
์ด๋ ๋ชจ๋์ SIGTERM์ ๋ณด๋
๋๋ค. ์ฌ์ด๋์นด ์ปจํ
์ด๋๊ฐ ์ฆ์ ์ข
๋ฃ๋๊ณ containerproxy๊ฐ Kubernetes์ ํต์ ํ์ง ๋ชปํฉ๋๋ค.
์ฌ๊ธฐ์ ์ค๋ช
๋ ๋๋ก Kubernetes๊ฐ v1.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-proxy ์ฌ์ด๋์นด๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค. ShinyProxy๋ Kubernetes API์ ์์น ๋ฐ ์ธ์ฆ์ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ ์๋์ผ๋ก ํด๊ฒฐ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ทํ์ ์๊ฐ๊ณผ ์กฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๋ค. Spring Boot ์ฑ์ด ์ฌ๋ฐ๋ฅด๊ณ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ค์ ๋ก shinyproxy ๋๋ containerproxy์์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค.
๋ฌธ์ ๋
kubctl proxy
์ฌ์ด๋์นด ์ปจํ ์ด๋์ ๋๋ค. Kubernetes์ ๊ฒฝ์ฐ containerproxy๊ฐ Kubernetes ์์ฒด์ ํต์ ํ๊ธฐ ์ํด ์ฌ์ด๋์นด ์ปจํ ์ด๋์ ์์กดํ๋์ง ๋ช ํํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ๋ฐฐํฌ์์ Kubernetes๋ ๋ชจ๋ ์ด์ ํฌ๋์ ํ๋ก์์ ์ฌ์ด๋์นด ์ปจํ ์ด๋ ๋ชจ๋์ SIGTERM์ ๋ณด๋ ๋๋ค. ์ฌ์ด๋์นด ์ปจํ ์ด๋๊ฐ ์ฆ์ ์ข ๋ฃ๋๊ณ containerproxy๊ฐ Kubernetes์ ํต์ ํ์ง ๋ชปํฉ๋๋ค.์ฌ๊ธฐ์ ์ค๋ช ๋ ๋๋ก Kubernetes๊ฐ v1.18์์ ์ด๋ฌํ ์์ ๋ฐ ์ข ๋ฃ ์ข ์์ฑ์ ํด๊ฒฐํ๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ์ฝ์์ต๋๋ค.
https://github.com/kubernetes/enhancements/issues/753
https://banzaicloud.com/blog/k8s-sidecars/
๊ทธ๋๊น์ง๋ ์ฌ์ด๋์นด ์ปจํ ์ด๋์ ๋ค์ ์๋ช ์ฃผ๊ธฐ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฐ๋จํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.