๋ฉ๋ชจ. ๋ฒ์ญ: ์ธ๊ณ์ ์ผ๋ก ์ ๋ช ํ Tinder ์๋น์ค์ ์ง์์ ์ต๊ทผ ์ธํ๋ผ๋ฅผ Kubernetes๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ๋ํ ๋ช ๊ฐ์ง ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ์ ๊ณต์ ํ์ต๋๋ค. ์ด ํ๋ก์ธ์ค๋ ๊ฑฐ์ 8๋ ์ด ๊ฑธ๋ ธ์ผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ 200๊ฐ์ ์ปจํ ์ด๋์์ ํธ์คํ ๋๋ 48๊ฐ์ ์๋น์ค๋ก ๊ตฌ์ฑ๋ KXNUMXs์์ ๋งค์ฐ ๋๊ท๋ชจ ํ๋ซํผ์ด ์ถ์๋์์ต๋๋ค. Tinder ์์ง๋์ด๋ค์ ์ด๋ค ํฅ๋ฏธ๋ก์ด ์ด๋ ค์์ ์ง๋ฉดํ๊ณ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ์ป์์ต๋๊น? ์ด ๋ฒ์ญ์ ์ฝ์ด๋ณด์ธ์.
์ด์ ๋ ๋ฌด์์ ๋๊น?
๊ฑฐ์ XNUMX๋ ์ Tinder๋ ํ๋ซํผ์ Kubernetes๋ก ์ด์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด Tinder ํ์ด ๋ถ๋ณ ๋ฐฐํฌ๋ฅผ ํตํด ์ต์ํ์ ๋ ธ๋ ฅ์ผ๋ก ์ปจํ ์ด๋ํํ๊ณ ํ๋ก๋์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. (๋ถ๋ณ ๋ฐฐํฌ). ์ด ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ ๋ธ๋ฆฌ, ๋ฐฐํฌ ๋ฐ ์ธํ๋ผ ์์ฒด๋ ์ฝ๋๋ก ๊ณ ์ ํ๊ฒ ์ ์๋ฉ๋๋ค.
ํ์ฅ์ฑ๊ณผ ์์ ์ฑ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ๋ ์ฐพ๊ณ ์์์ต๋๋ค. ํ์ฅ์ด ์ค์ํด์ก์ ๋ ์๋ก์ด EC2 ์ธ์คํด์ค๊ฐ ๊ฐ๋๋ ๋๊น์ง ๋ช ๋ถ ์ ๋ ๊ธฐ๋ค๋ ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ปจํ ์ด๋๋ฅผ ์์ํ๊ณ ๋ช ๋ถ์ด ์๋ ๋ช ์ด ๋ง์ ํธ๋ํฝ ์๋น์ค๋ฅผ ์์ํ๋ค๋ ์์ด๋์ด๊ฐ ์ฐ๋ฆฌ์๊ฒ ๋งค์ฐ ๋งค๋ ฅ์ ์ด์์ต๋๋ค.
๊ทธ ๊ณผ์ ์ ์ด๋ ค์ด ๊ฒ์ผ๋ก ํ๋ช ๋์์ต๋๋ค. 2019๋ ์ด ๋ง์ด๊ทธ๋ ์ด์ ์ค์ Kubernetes ํด๋ฌ์คํฐ๊ฐ ์๊ณ ์ง๋์ ๋๋ฌํ๊ณ ํธ๋ํฝ ๋ณผ๋ฅจ, ํด๋ฌ์คํฐ ํฌ๊ธฐ ๋ฐ DNS๋ก ์ธํด ๋ค์ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ๊ทธ ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ 200๊ฐ์ ์๋น์ค๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๊ณ 1000๊ฐ์ ๋ ธ๋, 15000๊ฐ์ ํฌ๋ ๋ฐ 48000๊ฐ์ ์คํ ์ค์ธ ์ปจํ ์ด๋๋ก ๊ตฌ์ฑ๋ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ ์งํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ง์ ํฅ๋ฏธ๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ด๋ป๊ฒํด์ผํฉ๋๊น?
2018๋ XNUMX์๋ถํฐ ๋ค์ํ ๋ง์ด๊ทธ๋ ์ด์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณค์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ์๋น์ค๋ฅผ ์ปจํ ์ด๋ํํ๊ณ ์ด๋ฅผ Kubernetes ํ ์คํธ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ ๋ฐฐํฌํ๋ ๊ฒ๋ถํฐ ์์ํ์ต๋๋ค. XNUMX์๋ถํฐ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ธฐ์กด ์๋น์ค๋ฅผ Kubernetes๋ก ์ฒด๊ณ์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์์ํ์ต๋๋ค. ๋ค์ ํด XNUMX์๊น์ง ์ฐ๋ฆฌ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋ฃํ์ผ๋ฉฐ ์ด์ Tinder ํ๋ซํผ์ Kubernetes์์๋ง ์คํ๋ฉ๋๋ค.
Kubernetes์ฉ ์ด๋ฏธ์ง ๋น๋
์ฐ๋ฆฌ๋ Kubernetes ํด๋ฌ์คํฐ์์ ์คํ๋๋ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ํ 30๊ฐ ์ด์์ ์์ค ์ฝ๋ ์ ์ฅ์๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฝ๋๋ ๋์ผํ ์ธ์ด์ ๋ํ ์ฌ๋ฌ ๋ฐํ์ ํ๊ฒฝ์ ๊ฐ์ถ ๋ค์ํ ์ธ์ด(์: Node.js, Java, Scala, Go)๋ก ์์ฑ๋ฉ๋๋ค.
๋น๋ ์์คํ ์ ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ํด ์์ ํ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ "๋น๋ ์ปจํ ์คํธ"๋ฅผ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Dockerfile๊ณผ ์ ธ ๋ช ๋ น ๋ชฉ๋ก์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํด๋น ์ฝํ ์ธ ๋ ์์ ํ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ๋ฉฐ ๋์์ ์ด๋ฌํ ๋ชจ๋ ๋น๋ ์ปจํ ์คํธ๋ ํ์คํ๋ ํ์์ ๋ฐ๋ผ ์์ฑ๋ฉ๋๋ค. ๋น๋ ์ปจํ ์คํธ๋ฅผ ํ์คํํ๋ฉด ํ๋์ ๋จ์ผ ๋น๋ ์์คํ ์ด ๋ชจ๋ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ 1-1. Builder ์ปจํ
์ด๋๋ฅผ ํตํ ํ์คํ๋ ๋น๋ ํ๋ก์ธ์ค
๋ฐํ์ ๊ฐ ์ผ๊ด์ฑ์ ์ต๋ํํ๋ ค๋ฉด (๋ฐํ์ ํ๊ฒฝ) ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ์ค์ ๋์ผํ ๋น๋ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ๊ณผ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์ ์ฒด ํ๋ซํผ์์ ๋น๋ ํ๊ฒฝ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฐํด์ผ ํ์ต๋๋ค. ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ๋ชจ๋ ์กฐ๋ฆฝ ๊ณต์ ์ ํน์ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ํ๋ฉ๋๋ค. ๊ฑด์ถ์ ์.
๊ทธ์ ์ปจํ ์ด๋ ๊ตฌํ์๋ ๊ณ ๊ธ Docker ๊ธฐ์ ์ด ํ์ํ์ต๋๋ค. Builder๋ ๋น๊ณต๊ฐ Tinder ์ ์ฅ์์ ์ก์ธ์คํ๋ ๋ฐ ํ์ํ ๋ก์ปฌ ์ฌ์ฉ์ ID์ ๋น๋ฐ(์: SSH ํค, AWS ์๊ฒฉ ์ฆ๋ช ๋ฑ)์ ์์ํฉ๋๋ค. ๋น๋ ์ํฐํฉํธ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ ์ฅํ๊ธฐ ์ํด ์์ค๊ฐ ํฌํจ๋ ๋ก์ปฌ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง์ดํธํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด Builder ์ปจํ ์ด๋์ ํธ์คํธ ๊ฐ์ ๋น๋ ์ํฐํฉํธ๋ฅผ ๋ณต์ฌํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ์ถ๊ฐ ๊ตฌ์ฑ ์์ด ์ ์ฅ๋ ๋น๋ ์ํฐํฉํธ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ผ๋ถ ์๋น์ค์ ๊ฒฝ์ฐ ์ปดํ์ผ ํ๊ฒฝ์ ๋ฐํ์ ํ๊ฒฝ์ ๋งคํํ๊ธฐ ์ํด ๋ ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค์ด์ผ ํ์ต๋๋ค. ์๋ฅผ ๋ค์ด Node.js bcrypt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์น ์ค์ ํ๋ซํผ๋ณ ๋ฐ์ด๋๋ฆฌ ์ํฐํฉํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ปดํ์ผ ํ๋ก์ธ์ค ์ค์ ์๊ตฌ ์ฌํญ์ ์๋น์ค๋ง๋ค ๋ค๋ฅผ ์ ์์ผ๋ฉฐ ์ต์ข Dockerfile์ ์ฆ์ ์ปดํ์ผ๋ฉ๋๋ค.
Kubernetes ํด๋ฌ์คํฐ ์ํคํ ์ฒ ๋ฐ ๋ง์ด๊ทธ๋ ์ด์
ํด๋ฌ์คํฐ ํฌ๊ธฐ ๊ด๋ฆฌ
์ฐ๋ฆฌ๋ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค kube-aws Amazon EC2 ์ธ์คํด์ค์ ์๋ํ๋ ํด๋ฌ์คํฐ ๋ฐฐํฌ๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ์ฒ์์๋ ๋ชจ๋ ๊ฒ์ด ํ๋์ ๊ณตํต ๋ ธ๋ ํ์์ ์๋ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ฆฌ์์ค๋ฅผ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ํฌ๊ธฐ์ ์ธ์คํด์ค ์ ํ๋ณ๋ก ์ํฌ๋ก๋๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค๋ ํ์์ฑ์ ๋น ๋ฅด๊ฒ ๊นจ๋ฌ์์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ ๋ก๋๋ ๋ฉํฐ ์ค๋ ๋ ํฌ๋๋ฅผ ์คํํ๋ ๊ฒ์ด ๋ค์์ ๋จ์ผ ์ค๋ ๋ ํฌ๋์ ๊ณต์กดํ๋ ๊ฒ๋ณด๋ค ์ฑ๋ฅ ์ธก๋ฉด์์ ๋ ์์ธกํ๊ธฐ ์ฝ๋ค๋ ๋ ผ๋ฆฌ๊ฐ ์์์ต๋๋ค.
๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ์ ํ์ต๋๋ค.
- m5.4x ํฐ - ๋ชจ๋ํฐ๋ง์ฉ(ํ๋ก๋ฉํ ์ฐ์ค)
- c5.4x ํฐ - Node.js ์ํฌ๋ก๋์ฉ(๋จ์ผ ์ค๋ ๋ ์ํฌ๋ก๋)
- c5.2x ํฐ - Java ๋ฐ Go(๋ฉํฐ์ค๋ ๋ ์ํฌ๋ก๋)์ฉ
- c5.4x ํฐ โ ์ ์ดํ์ฉ(๋ ธ๋ 3๊ฐ).
๋ง์ด๊ทธ๋ ์ด์
๊ธฐ์กด ์ธํ๋ผ์์ Kubernetes๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์ํ ์ค๋น ๋จ๊ณ ์ค ํ๋๋ ์๋น์ค ๊ฐ์ ๊ธฐ์กด ์ง์ ํต์ ์ ์๋ก์ด ๋ก๋ ๋ฐธ๋ฐ์(ELB(Elastic Load Balancer))๋ก ๋ฆฌ๋๋ ์ ํ๋ ๊ฒ์ด์์ต๋๋ค. Virtual Private Cloud(VPC)์ ํน์ ์๋ธ๋ท์์ ์์ฑ๋์์ต๋๋ค. ์ด ์๋ธ๋ท์ Kubernetes VPC์ ์ฐ๊ฒฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋น์ค ์ข ์์ฑ์ ํน์ ์์๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋ชจ๋์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์์ต๋๋ค.
์ด๋ฌํ ์๋ํฌ์ธํธ๋ ๊ฐ๊ฐ์ ์๋ก์ด ELB๋ฅผ ๊ฐ๋ฆฌํค๋ CNAME์ด ์๋ ๊ฐ์ค์น๊ฐ ๋ถ์ฌ๋ DNS ๋ ์ฝ๋ ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ต๋๋ค. ์ ํํ๊ธฐ ์ํด ๊ฐ์ค์น๊ฐ 0์ธ Kubernetes ์๋น์ค์ ์ ELB๋ฅผ ๊ฐ๋ฆฌํค๋ ์ ํญ๋ชฉ์ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํญ๋ชฉ์ TTL(Time To Live)์ 0์ผ๋ก ์ค์ ํ์ต๋๋ค. ๊ทธ ํ ์ด์ ๋ฐ ์ ๊ฐ์ค์น๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฒ์ฒํ ์กฐ์ ๋์๊ณ ๊ฒฐ๊ตญ ๋ก๋์ 100%๊ฐ ์ ์๋ฒ๋ก ์ ์ก๋์์ต๋๋ค. ์ ํ์ด ์๋ฃ๋ ํ TTL ๊ฐ์ด ๋ณด๋ค ์ ์ ํ ์์ค์ผ๋ก ๋์์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ณด์ ํ Java ๋ชจ๋์ ๋ฎ์ TTL DNS์ ๋์ฒํ ์ ์์์ง๋ง Node ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ๋ ์ง ๋ชปํ์ต๋๋ค. ์์ง๋์ด ์ค ํ ๋ช ์ด ์ฐ๊ฒฐ ํ ์ฝ๋์ ์ผ๋ถ๋ฅผ ๋ค์ ์์ฑํ์ฌ 60์ด๋ง๋ค ํ์ ์ ๋ฐ์ดํธํ๋ ๊ด๋ฆฌ์์ ๋ํํ์ต๋๋ค. ์ ํํ ์ ๊ทผ ๋ฐฉ์์ ๋์ ๋๋ ์ฑ๋ฅ ์ ํ ์์ด ๋งค์ฐ ์ ์๋ํ์ต๋๋ค.
๋ ์จ
๋คํธ์ํฌ ํจ๋ธ๋ฆญ์ ํ๊ณ
8๋ 2019์ XNUMX์ผ ์ด๋ฅธ ์์นจ, Tinder ํ๋ซํผ์ด ์๊ธฐ์น ์๊ฒ ์ถฉ๋ํ์ต๋๋ค. ๊ทธ๋ ์์นจ ์ผ์ฐ ํ๋ซํผ ์ง์ฐ ์๊ฐ์ด ๊ด๋ จ ์์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ํด๋ฌ์คํฐ์ ํฌ๋ ๋ฐ ๋ ธ๋ ์๊ฐ ์ฆ๊ฐํ์ต๋๋ค. ์ด๋ก ์ธํด ๋ชจ๋ ๋ ธ๋์์ ARP ์บ์๊ฐ ์์ง๋์์ต๋๋ค.
ARP ์บ์์ ๊ด๋ จ๋ ์ธ ๊ฐ์ง Linux ์ต์ ์ด ์์ต๋๋ค.
(
gc_thresh3 - ์ด๊ฒ์ ์๊ฒฉํ ์ ํ์ ๋๋ค. ๋ก๊ทธ์ "์ด์ ํ ์ด๋ธ ์ค๋ฒํ๋ก" ํญ๋ชฉ์ด ๋ํ๋๋ ๊ฒ์ ๋๊ธฐ GC(๊ฐ๋น์ง ์์ง) ํ์๋ ์ธ์ ํญ๋ชฉ์ ์ ์ฅํ ๊ณต๊ฐ์ด ARP ์บ์์ ์ถฉ๋ถํ์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์ปค๋์ ๋จ์ํ ํจํท์ ์์ ํ ํ๊ธฐํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ฉ
๊ทธ๋ฆผ 2-1. ํ๋๋ฌ ๋ค์ด์ด๊ทธ๋จ(
๊ทธ๋ฆผ 2-2. VXLAN ํจํค์ง(
๊ฐ Kubernetes ์์
์ ๋
ธ๋๋ ๋ ํฐ /24 ๋ธ๋ก์ /9 ๋ง์คํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ ํ ๋นํฉ๋๋ค. ๊ฐ ๋
ธ๋์ ๋ํด ์ด๋
์ถ๊ฐ์ ์ผ๋ก node-pod(๋๋ pod-pod) ํต์ ์ ๊ถ๊ทน์ ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. eth0 (์์ ํ๋๋ฌ ๋ค์ด์ด๊ทธ๋จ์ ํ์๋ ๋๋ก) ๊ทธ๋ฌ๋ฉด ๊ฐ ํด๋น ์์ค ๋ฐ ๋์ ํธ์คํธ์ ๋ํ ARP ํ ์ด๋ธ์ ์ถ๊ฐ ํญ๋ชฉ์ด ์์ฑ๋ฉ๋๋ค.
์ฐ๋ฆฌ ํ๊ฒฝ์์๋ ์ด๋ฌํ ์ ํ์ ์์ฌ์ํต์ด ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค. Kubernetes์ ์๋น์ค ๊ฐ์ฒด์ ๊ฒฝ์ฐ ELB๊ฐ ์์ฑ๋๊ณ Kubernetes๋ ๊ฐ ๋ ธ๋๋ฅผ ELB์ ๋ฑ๋กํฉ๋๋ค. ELB๋ ํฌ๋์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ฉฐ ์ ํํ ๋ ธ๋๊ฐ ํจํท์ ์ต์ข ๋ชฉ์ ์ง๊ฐ ์๋ ์๋ ์์ต๋๋ค. ์์ ์ ๋ ธ๋๊ฐ ELB๋ก๋ถํฐ ํจํท์ ์์ ํ ๋ ๊ท์น์ ๊ณ ๋ คํ๋ค๋ ๊ฒ์ ๋๋ค. iptables์ ํน์ ์๋น์ค์ ๋ํด ๋ค๋ฅธ ๋ ธ๋์ ํฌ๋๋ฅผ ๋ฌด์์๋ก ์ ํํฉ๋๋ค.
์ฅ์ ๋น์ ํด๋ฌ์คํฐ์๋ 605๊ฐ์ ๋ ธ๋๊ฐ ์์์ต๋๋ค. ์์์ ์ธ๊ธํ ์ด์ ๋ก ์ธํด ์ด ์ ๋๋ฉด ์ค์์ฑ์ ๊ทน๋ณตํ๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค. gc_thresh3, ์ด๋ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ฉด ํจํท์ด ์ญ์ ๋๊ธฐ ์์ํ ๋ฟ๋ง ์๋๋ผ /24 ๋ง์คํฌ๊ฐ ์๋ ์ ์ฒด Flannel ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์ด ARP ํ ์ด๋ธ์์ ์ฌ๋ผ์ง๋๋ค. ๋ ธ๋-ํ ํต์ ๋ฐ DNS ์ฟผ๋ฆฌ๊ฐ ์ค๋จ๋ฉ๋๋ค(DNS๋ ํด๋ฌ์คํฐ์์ ํธ์คํ ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ด ๋ฌธ์์ ๋ท๋ถ๋ถ์ ์ฐธ์กฐํ์ธ์).
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ฐ์ ๋๋ ค์ผ ํฉ๋๋ค. gc_thresh1, gc_thresh2 ะธ gc_thresh3 ๋๋ฝ๋ ๋คํธ์ํฌ๋ฅผ ๋ค์ ๋ฑ๋กํ๋ ค๋ฉด Flannel์ ๋ค์ ์์ํ์ธ์.
์์์น ๋ชปํ DNS ํ์ฅ
๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค ์ค์ DNS๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ๊ด๋ฆฌํ๊ณ ์๋น์ค๋ฅผ ๊ธฐ์กด ์ธํ๋ผ์์ Kubernetes๋ก ์ ์ง์ ์ผ๋ก ์ด์ ํ์ต๋๋ค. Route53์์๋ ๊ด๋ จ RecordSet์ ๋ํด ์๋์ ์ผ๋ก ๋ฎ์ TTL ๊ฐ์ ์ค์ ํ์ต๋๋ค. ์ด์ ์ธํ๋ผ๊ฐ EC2 ์ธ์คํด์ค์์ ์คํ ์ค์ด์์ ๋ ํด์๊ธฐ ๊ตฌ์ฑ์ Amazon DNS๋ฅผ ๊ฐ๋ฆฌ์ผฐ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๋น์ฐํ ๊ฒ์ผ๋ก ์ฌ๊ฒผ๊ณ ๋ฎ์ TTL์ด ์ฐ๋ฆฌ ์๋น์ค์ Amazon ์๋น์ค(์: DynamoDB)์ ๋ฏธ์น๋ ์ํฅ์ ๊ฑฐ์ ๋์ ๋์ง ์์์ต๋๋ค.
์๋น์ค๋ฅผ Kubernetes๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด์ DNS๊ฐ ์ด๋น 250๋ง ๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, ์ ํ๋ฆฌ์ผ์ด์ ์์ DNS ์ฟผ๋ฆฌ์ ๋ํ ์ง์์ ์ด๊ณ ์ฌ๊ฐํ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ์ต๋๋ค. ์ด๋ DNS ๊ณต๊ธ์๋ฅผ CoreDNS(์ต๋ ๋ก๋ ์ 1000๊ฐ์ ์ฝ์ด์์ ์คํ๋๋ 120๊ฐ์ ํฌ๋์ ๋๋ฌ)๋ก ์ต์ ํํ๊ณ ์ ํํ๋ ค๋ ์์ฒญ๋ ๋ ธ๋ ฅ์๋ ๋ถ๊ตฌํ๊ณ ๋ฐ์ํ์ต๋๋ค.
๋ค๋ฅธ ๊ฐ๋ฅํ ์์ธ๊ณผ ํด๊ฒฐ์ฑ
์ ์กฐ์ฌํ๋ ์ค ์ฐ๋ฆฌ๋ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด ๋ฌธ์ ๋ ์์ค ๋ฐ ๋์ ๋คํธ์ํฌ ์ฃผ์ ๋ณํ(SNAT ๋ฐ DNAT) ๋จ๊ณ์ ํ์ ํ ์ด๋ธ ์ ๋ ฅ ๋จ๊ณ์์ ๋ฐ์ํฉ๋๋ค. ํ๊ณก. ๋ด๋ถ์ ์ผ๋ก ๋ ผ์๋๊ณ ์ปค๋ฎค๋ํฐ์์ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ํ๋๋ DNS๋ฅผ ์์ ์ ๋ ธ๋ ์์ฒด๋ก ์ด๋ํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด ๊ฒฝ์ฐ:
- ํธ๋ํฝ์ด ๋ ธ๋ ๋ด๋ถ์ ์ ์ง๋๋ฏ๋ก SNAT๋ ํ์ํ์ง ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ผ์ฐํ ํ ํ์๋ ์์ต๋๋ค. eth0.
- ๋์ IP๊ฐ ๋ ธ๋์ ๋ก์ปฌ์ด๊ณ ๊ท์น์ ๋ฐ๋ผ ๋ฌด์์๋ก ์ ํ๋ ํฌ๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ DNAT๊ฐ ํ์ํ์ง ์์ต๋๋ค. iptables์.
์ฐ๋ฆฌ๋ ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ณ ์ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. CoreDNS๋ Kubernetes์์ DaemonSet์ผ๋ก ๋ฐฐํฌ๋์์ผ๋ฉฐ ์ฐ๋ฆฌ๋ Kubernetes์์ ๋ก์ปฌ ๋ ธ๋ DNS ์๋ฒ๋ฅผ ๊ตฌํํ์ต๋๋ค. resolve.conf ํ๋๊ทธ๋ฅผ ์ค์ ํ์ฌ ๊ฐ ํฌ๋ --ํด๋ฌ์คํฐ-DNS ํ Kubeletโ. ์ด ์๋ฃจ์ ์ DNS ์๊ฐ ์ด๊ณผ์ ํจ๊ณผ์ ์ธ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ ํ ํจํท ์์ค์ด ๋ฐ์ํ๊ณ ์นด์ดํฐ๊ฐ ์ฆ๊ฐํ์ต๋๋ค. insert_failed ํ๋๋ฌ ์ธํฐํ์ด์ค์์. DNS ํธ๋ํฝ์ ๋ํด์๋ง SNAT ๋ฐ/๋๋ DNAT๋ฅผ ์ ๊ฑฐํ ์ ์์๊ธฐ ๋๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๊ตฌํ๋ ํ์๋ ์ด๋ฌํ ํ์์ด ๊ณ์๋์์ต๋๋ค. ๋ค๋ฅธ ์ ํ์ ํธ๋ํฝ์ ๋ํด์๋ ๊ฒฝ์ ์กฐ๊ฑด์ด ์ ์ง๋์์ต๋๋ค. ๋คํํ ๋๋ถ๋ถ์ ํจํท์ TCP์ด๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ๋จํ ์ฌ์ ์ก๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ์ ํ ๋ชจ๋ ์ ํ์ ํธ๋ํฝ์ ์ ํฉํ ์๋ฃจ์ ์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
๋ ๋์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ํด Envoy ์ฌ์ฉ
๋ฐฑ์๋ ์๋น์ค๋ฅผ Kubernetes๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด์ Pod ๊ฐ์ ๋ก๋ ๋ถ๊ท ํ์ผ๋ก ์ด๋ ค์์ ๊ฒช๊ธฐ ์์ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ HTTP Keepalive๋ก ์ธํด ๊ฐ ๋ฐฐํฌ๊ฐ ์ถ์๋ ์ฒซ ๋ฒ์งธ ์ค๋น๋ ํฌ๋์์ ELB ์ฐ๊ฒฐ์ด ์ค๋จ๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ํธ๋ํฝ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์์ ๋น์จ์ ํฌ๋๋ฅผ ํต๊ณผํ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์คํธํ ์ฒซ ๋ฒ์งธ ์๋ฃจ์ ์ ์ต์ ์ ์๋๋ฆฌ์ค์ ๋ํ ์๋ก์ด ๋ฐฐํฌ์์ MaxSurge๋ฅผ 100%๋ก ์ค์ ํ๋ ๊ฒ์ด์์ต๋๋ค. ๋๊ท๋ชจ ๋ฐฐํฌ ์ธก๋ฉด์์ ๊ทธ ํจ๊ณผ๋ ๋ฏธ๋ฏธํ๊ณ ์ ๋ง์ด ์ข์ง ์์ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ ๋ค๋ฅธ ์๋ฃจ์ ์ ์ค์ํ ์๋น์ค์ ๋ํ ๋ฆฌ์์ค ์์ฒญ์ ์ธ์์ ์ผ๋ก ๋๋ฆฌ๋ ๊ฒ์ด์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ทผ์ฒ์ ๋ฐฐ์น๋ ํฌ๋๋ ๋ค๋ฅธ ๋ฌด๊ฑฐ์ด ํฌ๋์ ๋นํด ์กฐ์ข ํ ๊ณต๊ฐ์ด ๋ ๋ง์ต๋๋ค. ์์ ๋ญ๋น๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ฅ๊ธฐ์ ์ผ๋ก๋ ํจ๊ณผ๊ฐ ์์ ๊ฒ์ ๋๋ค. ๋ํ ์ฐ๋ฆฌ์ Node ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ์ผ ์ค๋ ๋์ด๋ฏ๋ก ํ๋์ ์ฝ์ด๋ง ์ฌ์ฉํ ์ ์์์ต๋๋ค. ์ ์ผํ ์ค์ ์๋ฃจ์ ์ ๋ ๋์ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ค๋ซ๋์ ์์ ํ ๊ฐ์ฌํ๊ณ ์ถ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์ ๊ตฌ์ฑ์ ์๊ฐํด ๋์ต๋๋ค. ๊ฐ ํฌ๋์ ๋จ์ผ ๊ฒฝ๋ก์ ๋ํด Envoy ์ฌ์ด๋์นด๋ฅผ ๊ฐ๊ณ ํฌํธ๋ฅผ ํตํด ๋ก์ปฌ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ปจํ ์ด๋์ ์ฐ๊ฒฐํฉ๋๋ค. ์ ์ฌ์ ์ธ ๊ณ๋จ์ ์ฐ๊ฒฐ์ ์ต์ํํ๊ณ ์์ ํํธ ๋ฐ๊ฒฝ์ ์ ์งํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๊ฐ ์๋น์ค์ ๋ํด ๊ฐ์ฉ ์์ญ(AZ)๋น ํ๋์ฉ Envoy ์ ๋ฉด ํ๋ก์ ํฌ๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ค์ ํน์ ์๋น์ค์ ๋ํด ๊ฐ AZ์ ํฌ๋ ๋ชฉ๋ก์ ๋ฐํํ๋ ์์ง๋์ด ์ค ํ ๋ช ์ด ์์ฑํ ๊ฐ๋จํ ์๋น์ค ๊ฒ์ ์์ง์ ์์กดํ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ Service Front-Envoy๋ ํ๋์ ์ ์คํธ๋ฆผ ํด๋ฌ์คํฐ ๋ฐ ๊ฒฝ๋ก์ ํจ๊ป ์ด ์๋น์ค ๊ฒ์ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ต๋๋ค. ๋จ์ผ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ณ ์ํํ ๋ฐฐํฌ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์ ํ ์๊ฐ ์ ํ์ ์ค์ ํ๊ณ , ๋ชจ๋ ํ๋ก ์ฐจ๋จ๊ธฐ ์ค์ ์ ๋๋ฆฌ๊ณ , ์ต์ ์ฌ์๋ ๊ตฌ์ฑ์ ์ถ๊ฐํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ฐ ์๋น์ค ์ ๋ฉด Envoy ์์ TCP ELB๋ฅผ ๋ฐฐ์นํ์ต๋๋ค. ๊ธฐ๋ณธ ํ๋ก์ ๋ ์ด์ด์ Keepalive๊ฐ ์ผ๋ถ Envoy ํฌ๋์ ๋ฉ์ท๋๋ผ๋ ์ฌ์ ํ ๋ก๋๋ฅผ ํจ์ฌ ๋ ์ ์ฒ๋ฆฌํ ์ ์์๊ณ ๋ฐฑ์๋์์ ์ต์ ์์ฒญ์ ํตํด ๊ท ํ์ ์ ์งํ๋๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
๋ฐฐํฌ๋ฅผ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ํฌ๋์ ์ฌ์ด๋์นด ํฌ๋ ๋ชจ๋์ preStop ํํฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ํํฌ๋ ์ฌ์ด๋์นด ์ปจํ ์ด๋์ ์๋ ๊ด๋ฆฌ ์๋ํฌ์ธํธ์ ์ํ๋ฅผ ํ์ธํ๋ ๋์ ์ค๋ฅ๋ฅผ ์ ๋ฐํ์ผ๋ฉฐ ํ์ฑ ์ฐ๊ฒฐ์ด ์ข ๋ฃ๋ ์ ์๋๋ก ์ ์ ๋์ ์ ์ ๋ชจ๋๋ก ์ ํ๋์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ทธํ ๋ก ๋น ๋ฅด๊ฒ ์์ง์ผ ์ ์์๋ ์ด์ ์ค ํ๋๋ ์ผ๋ฐ์ ์ธ Prometheus ์ค์น์ ์ฝ๊ฒ ํตํฉํ ์ ์์๋ ์์ธํ ์ธก์ ํญ๋ชฉ ๋๋ถ์ด์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ตฌ์ฑ ๋งค๊ฐ๋ณ์๋ฅผ ์กฐ์ ํ๊ณ ํธ๋ํฝ์ ์ฌ๋ถ๋ฐฐํ๋ ๋์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํํ ํ์ธํ ์ ์์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์ฆ๊ฐ์ ์ด๊ณ ๋ช ๋ฐฑํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ฐ์ฅ ๋ถ๊ท ํํ ์๋น์ค๋ถํฐ ์์ํ๊ณ ํ์ฌ๋ ํด๋ฌ์คํฐ์์ ๊ฐ์ฅ ์ค์ํ 12๊ฐ์ ์๋น์ค ์์์ ์๋ํ๊ณ ์์ต๋๋ค. ์ฌํด ์ฐ๋ฆฌ๋ ๊ณ ๊ธ ์๋น์ค ๊ฒ์, ํ๋ก ์ฐจ๋จ, ์ด์์น ๊ฐ์ง, ์๋ ์ ํ ๋ฐ ์ถ์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ ์ฒด ์๋น์ค ๋ฉ์๋ก์ ์ ํ์ ๊ณํํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฆผ 3โ1. Envoy๋ก ์ ํํ๋ ๋์ ํ ์๋น์ค์ CPU ์ตํฉ
์ต์ข ๊ฒฐ๊ณผ
์ด๋ฌํ ๊ฒฝํ๊ณผ ์ถ๊ฐ ์ฐ๊ตฌ๋ฅผ ํตํด ์ฐ๋ฆฌ๋ ๋๊ท๋ชจ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ค๊ณ, ๋ฐฐํฌ ๋ฐ ์ด์ํ๋ ๋ฐ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๊ฐ์ถ ๊ฐ๋ ฅํ ์ธํ๋ผ ํ์ ๊ตฌ์ถํ์ต๋๋ค. ์ด์ ๋ชจ๋ Tinder ์์ง๋์ด๋ ์ปจํ ์ด๋๋ฅผ ํจํค์งํ๊ณ Kubernetes์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐ ํ์ํ ์ง์๊ณผ ๊ฒฝํ์ ๋ณด์ ํ๊ณ ์์ต๋๋ค.
๊ธฐ์กด ์ธํ๋ผ์ ์ถ๊ฐ ์ฉ๋์ด ํ์ํ ๋ ์๋ก์ด EC2 ์ธ์คํด์ค๊ฐ ์์๋ ๋๊น์ง ๋ช ๋ถ ์ ๋ ๊ธฐ๋ค๋ ค์ผ ํ์ต๋๋ค. ์ด์ ๋ช ๋ถ์ด ์๋ ๋ช ์ด ๋ง์ ์ปจํ ์ด๋๊ฐ ์คํ๋๊ณ ํธ๋ํฝ ์ฒ๋ฆฌ๊ฐ ์์๋ฉ๋๋ค. ๋จ์ผ EC2 ์ธ์คํด์ค์์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์์ฝํ๋ฉด ์ํ ์ง์ค๋ ํฅ์๋ฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, 2019๋ ์๋ ์ ๋ ๋๋น EC2 ๋น์ฉ์ด ํฌ๊ฒ ๊ฐ์ํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฑฐ์ 2019๋ ์ด ๊ฑธ๋ ธ์ง๋ง 200๋ 1000์์ ์๋ฃ๋์์ต๋๋ค. ํ์ฌ Tinder ํ๋ซํผ์ ์๋น์ค 15๊ฐ, ๋ ธ๋ 000๊ฐ, ํฌ๋ 48๊ฐ, ์คํ ์ค์ธ ์ปจํ ์ด๋ 000๊ฐ๋ก ๊ตฌ์ฑ๋ Kubernetes ํด๋ฌ์คํฐ์์๋ง ์คํ๋ฉ๋๋ค. ์ธํ๋ผ๋ ๋ ์ด์ ์ด์ํ๋ง์ ์์ญ์ด ์๋๋๋ค. ์ฐ๋ฆฌ์ ๋ชจ๋ ์์ง๋์ด๋ ์ด๋ฌํ ์ฑ ์์ ๊ณต์ ํ๊ณ ์ฝ๋๋ง์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ณ ๋ฐฐํฌํ๋ ํ๋ก์ธ์ค๋ฅผ ์ ์ดํฉ๋๋ค.
๋ฒ์ญ๊ฐ์ ์ถ์
๋ํ ๋น์ฌ ๋ธ๋ก๊ทธ์์ ์ผ๋ จ์ ๊ธฐ์ฌ๋ฅผ ์ฝ์ด๋ณด์ธ์.
- ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 1 ๋ถ: eBay์ 4200๊ฐ ๋๋ก ๋ฐ TessMaster ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 2 ๋ถ: ์ปจ์ปค์ SAP ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 3 ๋ถ: GitHub์ ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 4 ๋ถ: SoundCloud(ํ๋ก๋ฉํ ์ฐ์ค ์ ์) ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 5 ๋ถ: ๋์งํธ๋ฑ ํฌ ๋ชฌ์กฐ ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 6 ๋ถ: ๋ธ๋ผ ๋ธ๋ผ ์นด๋ฅด ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 7 ๋ถ: BlackRock ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 8 ๋ถ: ํ์จ์ด ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 9 ๋ถ: CERN ๋ฐ 210๊ฐ K8s ํด๋ฌ์คํฐ ". - ยซ
ํ๋ก๋์ ๋ถ์ผ์ Kubernetes ์ฑ๊ณต ์ฌ๋ก. 10 ๋ถ: ๋ ๋ง ".
์ถ์ฒ : habr.com