Kubernetes์์ Pod๋ ์ผ์์ ์ธ(ephemeral) ์ํฐํฐ๋ก ๊ฐ์ฃผ๋๊ณ ๋ค์ํ ์ด์ ๋ก ์ข ๋ฃํ ์ ์์ผ๋ฉฐ Pod์ ์ข ๋ฃ๋ ์์ธ ์ํฉ์ด ์๋๋ผ Kubernetes์ ์ ์์ ์ธ ๋์์ ๋๋ค.
Pod๊ฐ ์ข
๋ฃ๋ ๋ ์ฆ์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๋ฉด ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ(in-flight requests)์ด ๊ฐ์ ๋ก ์ค๋จ๋๋ฉด์ Timeout์ด๋ 5xx Error๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ด ์ข
๋ฃ๋ฅผ ์ํํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์์ ์ ์ธ ์์คํ
์ ๊ตฌ์ถํ๊ณ ํ๋ฅญํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํต์ฌ์ ์ธ ์์์
๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Pod์ ์ข
๋ฃ ๊ณผ์ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ก์ด ์์ฒญ์ ๋ฐ์ง ์๋๋ก ํ๊ณ , ์ด๋ฏธ ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ์ ์ ์์ ์ผ๋ก ์๋ฃํ ๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๊ณ ์ข
๋ฃํด์ผํฉ๋๋ค.
์ด๋ฌํ ์ข ๋ฃ ๋ฐฉ์์ Graceful Shutdown์ด๋ผ๊ณ ํฉ๋๋ค.
Pod ์ญ์ ์์ฒญ์ด Kubernetes API Server๋ก ์ ๋ฌ๋๋ฉด API Server๋ Pod๋ฅผ ์ญ์ ๋์์ผ๋ก ํ์ํฉ๋๋ค.
์ด๋ kubelet์ ํด๋น Pod์ ์ปจํ
์ด๋ ์ข
๋ฃ ์ ์ฐจ๋ฅผ ์์ํ๊ณ , EndpointSlice Controller๋ ์ข
๋ฃ ์ค์ธ Pod๊ฐ ํธ๋ํฝ ๋์์์ ์ ์ธ๋ ์ ์๋๋ก EndpointSlice์ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
Graceful Shutdown์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ
์ ํ๋ฆฌ์ผ์ด์ ์์ SIGTERM ์ฒ๋ฆฌํ๊ธฐ
Kubelet์ Container Runtime์ ํตํด ๊ฐ ์ปจํ
์ด๋์ ๋ฉ์ธ ํ๋ก์ธ์ค(PID 1 ํ๋ก์ธ์ค)์ ์ผ๋ฐ์ ์ผ๋ก SIGTERM์ ์ ๋ฌํฉ๋๋ค.
Kubernetes๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ๊ณผ ๊ฐ์ ๋ด๋ถ ์ํ๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ ํ๋ฆฌ์ผ์ด์
์ SIGTERM์ ๋ฐ์ผ๋ฉด ์ฒ๋ฆฌ ์ค์ธ ์์ฒญ๊ณผ ์ฌ์ฉ ์ค์ธ ์์์ ์ ๋ฆฌํ ๋ค ์ค์ค๋ก ์ข
๋ฃํด์ผํฉ๋๋ค.
๋ง์ฝ SIGTERM์ ๋ฌด์ํ๊ฑฐ๋ Grace Period๊ฐ ๋ง๋ฃ๋ ๋๊น์ง ์ปจํ
์ด๋๊ฐ ์ข
๋ฃํ์ง ๋ชปํ๋ฉด Container Runtime์ด SIGKILL์ ์ ๋ฌํ์ฌ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ๋ก ์ข
๋ฃํฉ๋๋ค.
preStop Hook ์ฌ์ฉํ๊ธฐ
preStop์ ์ปจํ
์ด๋์ SIGTERM์ ์ ๋ฌํ๊ธฐ ์ ์ ์คํ๋๋ Kubernetes Lifecycle Hook์
๋๋ค. SIGTERM์ผ๋ก ์ข
๋ฃ ์ฒ๋ฆฌ๋ฅผ ์์ํ ์ ์๋ ๊ฒฝ์ฐ, preStop์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ข
๋ฃ API๋ ๋ช
๋ น์ ํธ์ถํ ์ ์์ต๋๋ค.
๋ํ, preStop์ EndpointSlice ๋ณ๊ฒฝ ์ฌํญ์ด kube-proxy๋ Load Balancer๊น์ง ์ ํ๋๊ธฐ ์ ์ ์ปจํ
์ด๋๊ฐ ๋จผ์ ์ข
๋ฃ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ผ์ ์๊ฐ ๋๊ธฐํ๋ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ข
๋ฃ ์ค์ธ Pod๊ฐ ํธ๋ํฝ ๋์์์ ์ ์ธ๋ ์๊ฐ์ ํ๋ณดํ๊ณ , ์ข
๋ฃ ๊ณผ์ ์์ ๋ฐ์ ํ ์ ์๋ Timeout์ด๋ 5xx Error๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
terminationGracePeriodSeconds ์ค์ ํ๊ธฐ
terminationGracePeriodSeconds(Grace Period)๋ Kubernetes๊ฐ Pod์ ์ ์ ์ข ๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ์๊ฐ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ 30์ด์ ๋๋ค. ์ด ์๊ฐ์ด ๋ง๋ฃ๋์๋๋ฐ๋ ์ปจํ ์ด๋๊ฐ ์คํ ์ค์ด๋ผ๋ฉด SIGKILL์ ์ ๋ฌํ์ฌ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ ๋ก ์ข ๋ฃํฉ๋๋ค.
Grace Period๋ SIGTERM์ด ์ ๋ฌ๋๋ ์์ ์ด ์๋๋ผ preStop์ด ์คํ๋๊ธฐ ์ ๋ถํฐ ๊ณ์ฐ๋ฉ๋๋ค. ์ด๋ preStop ์คํ ์๊ฐ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์๊ฐ์ ํฉ์ด terminationGracePeriodSeconds๋ณด๋ค ๊ธธ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ฆฌ ์์ ์ ์๋ฃํ๊ธฐ ์ ์ SIGKILL์ ์ํด ๊ฐ์ ๋ก ์ข ๋ฃ๋ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Grace Period๋ preStop ์คํ ์๊ฐ๊ณผ ์ต๋ in-flight request ์ฒ๋ฆฌ ์๊ฐ, Connection ๋ฐ ์์ ์ ๋ฆฌ ์๊ฐ์ ๋ชจ๋ ๊ณ ๋ คํ์ฌ ์ฐ์ ๋์ด์ผ ํฉ๋๋ค.
EKS ELB Deregistration Delay ์ค์ ํ๊ธฐ
Pod๊ฐ ์ญ์ ๋ก EndpointSlice๊ฐ ๋ณ๊ฒฝ๋๋ฉด AWS Load Balancer Controller๋ ์ด๋ฅผ ๊ฐ์งํ๊ณ target-type: ip ๋ผ๋ฉด ํด๋น Pod IP๋ฅผ Target Group์์ Deregisterํฉ๋๋ค. ๋ง์ฝ Target์ด ์ฆ์ Deregister๋๋ฉด ์ฒ๋ฆฌ ์ค์ธ in-flight requests๊ฐ ์๋ฃ๋๊ธฐ ์ ์ ์ฐ๊ฒฐ์ด ์ค๋จ๋์ด Timeout์ด๋ 5xx Error๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ Deregistration Delay๋ฅผ ์ค์ ํ์ฌ Target์ ์ผ์ ์๊ฐ draining ์ํ๋ก ์ ์งํ๊ณ , ์๋ก์ด ์์ฒญ์ ์ ๋ฌํ์ง ์์ผ๋ฉด์ ๊ธฐ์กด ์์ฒญ์ ์ ์์ ์ผ๋ก ์๋ฃํ ์๊ฐ์ ํ๋ณดํด์ผํฉ๋๋ค.
๋ฐ๋ฉด target-type: instance์์๋ ELB์ Target์ด Worker Node์ด๊ธฐ ๋๋ฌธ์, Pod๊ฐ ์ข
๋ฃ๋์ด๋ ELB Target์ Deregistration์ ๋ฐ์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ Pod ์ข
๋ฃ ์ ํด๋น Pod๋ฅผ ํธ๋ํฝ ๋์์์ ์ ์ธํ๋ ์ฒ๋ฆฌ๋ ELB๊ฐ ์๋๋ผ EndpointSlice์ kube-proxy๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
Deregistration Delay์ terminationGracePeriodSeconds๋ ์๋ก ๋ค๋ฅธ ๊ณ์ธต์์ ๋์ํฉ๋๋ค.
Deregistration Delay๋ ELB๊ฐ ๊ธฐ์กด ์์ฒญ๊ณผ Connection์ Drainํ๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ด๊ณ ,
terminationGracePeriodSeconds๋ Kubernetes๊ฐ Pod ๋ด๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ ์์ ์ผ๋ก ์ข
๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์
๋๋ค.