Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜

๋ฉ”๋ชจ. ๋ฒˆ์—ญ: ์„ธ๊ณ„์ ์œผ๋กœ ์œ ๋ช…ํ•œ Tinder ์„œ๋น„์Šค์˜ ์ง์›์€ ์ตœ๊ทผ ์ธํ”„๋ผ๋ฅผ Kubernetes๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐ ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ˆ ์  ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณต์œ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๊ฑฐ์˜ 8๋…„์ด ๊ฑธ๋ ธ์œผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ 200๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” 48๊ฐœ์˜ ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋œ KXNUMXs์—์„œ ๋งค์šฐ ๋Œ€๊ทœ๋ชจ ํ”Œ๋žซํผ์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Tinder ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์–ด๋–ค ํฅ๋ฏธ๋กœ์šด ์–ด๋ ค์›€์— ์ง๋ฉดํ–ˆ๊ณ  ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฒˆ์—ญ์„ ์ฝ์–ด๋ณด์„ธ์š”.

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜

์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฑฐ์˜ 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๊ณผ ์…ธ ๋ช…๋ น ๋ชฉ๋ก์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋Š” ์™„์ „ํžˆ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋™์‹œ์— ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋Š” ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์— ๋”ฐ๋ผ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋‹จ์ผ ๋นŒ๋“œ ์‹œ์Šคํ…œ์ด ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜
๊ทธ๋ฆผ 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 ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜
(์ถœ์ฒ˜)

gc_thresh3 - ์ด๊ฒƒ์€ ์—„๊ฒฉํ•œ ์ œํ•œ์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ์— "์ด์›ƒ ํ…Œ์ด๋ธ” ์˜ค๋ฒ„ํ”Œ๋กœ" ํ•ญ๋ชฉ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์€ ๋™๊ธฐ GC(๊ฐ€๋น„์ง€ ์ˆ˜์ง‘) ํ›„์—๋„ ์ธ์ ‘ ํ•ญ๋ชฉ์„ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ARP ์บ์‹œ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ปค๋„์€ ๋‹จ์ˆœํžˆ ํŒจํ‚ท์„ ์™„์ „ํžˆ ํ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ ํ”Œ๋ž€๋„ฌ Kubernetes์˜ ๋„คํŠธ์›Œํฌ ํŒจ๋ธŒ๋ฆญ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํŒจํ‚ท์€ VXLAN์„ ํ†ตํ•ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. VXLAN์€ L2 ๋„คํŠธ์›Œํฌ ์œ„์— ์˜ฌ๋ ค์ง„ L3 ํ„ฐ๋„์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์€ MAC-in-UDP(MAC Address-in-User Datagram Protocol) ์บก์Šํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋ ˆ์ด์–ด 2 ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ์˜ ํ™•์žฅ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ ๋„คํŠธ์›Œํฌ์˜ ์ „์†ก ํ”„๋กœํ† ์ฝœ์€ IP์™€ UDP์ž…๋‹ˆ๋‹ค.

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜
๊ทธ๋ฆผ 2-1. ํ”Œ๋ž€๋„ฌ ๋‹ค์ด์–ด๊ทธ๋žจ(์ถœ์ฒ˜)

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜
๊ทธ๋ฆผ 2-2. VXLAN ํŒจํ‚ค์ง€(์ถœ์ฒ˜)

๊ฐ Kubernetes ์ž‘์—…์ž ๋…ธ๋“œ๋Š” ๋” ํฐ /24 ๋ธ”๋ก์˜ /9 ๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ์ด๋Š” ๋ฐฉ๋ฒ• ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ํ•ญ๋ชฉ ํ•˜๋‚˜, ARP ํ…Œ์ด๋ธ”์— ํ•ญ๋ชฉ ํ•˜๋‚˜(flannel.1 ์ธํ„ฐํŽ˜์ด์Šค), ์Šค์œ„์นญ ํ…Œ์ด๋ธ”(FDB)์— ํ•ญ๋ชฉ ํ•˜๋‚˜. ์ž‘์—…์ž ๋…ธ๋“œ๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘๋  ๋•Œ ๋˜๋Š” ์ƒˆ ๋…ธ๋“œ๊ฐ€ ๊ฒ€์ƒ‰๋  ๋•Œ๋งˆ๋‹ค ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ 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๊ฐœ์˜ ํฌ๋“œ์— ๋„๋‹ฌ)๋กœ ์ตœ์ ํ™”ํ•˜๊ณ  ์ „ํ™˜ํ•˜๋ ค๋Š” ์—„์ฒญ๋‚œ ๋…ธ๋ ฅ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์›์ธ๊ณผ ํ•ด๊ฒฐ์ฑ…์„ ์กฐ์‚ฌํ•˜๋˜ ์ค‘ ์šฐ๋ฆฌ๋Š” ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ัั‚ะฐั‚ัŒัŽ, ํŒจํ‚ท ํ•„ํ„ฐ๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋„ท ํ•„ํ„ฐ ๋ฆฌ๋ˆ…์Šค์—์„œ. ์šฐ๋ฆฌ๊ฐ€ ๊ด€์ฐฐํ•œ ์‹œ๊ฐ„ ์ดˆ๊ณผ์™€ ์นด์šดํ„ฐ ์ฆ๊ฐ€ insert_failed Flannel ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฒฐ๊ณผ๋Š” ๊ธฐ์‚ฌ์˜ ๊ฒฐ๊ณผ์™€ ์ผ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ ๋ณ€ํ™˜(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๋Š” ๋Œ€๊ทœ๋ชจ SOA ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ ์˜คํ”ˆ ์†Œ์Šค ๋ ˆ์ด์–ด XNUMX ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค. ์ž๋™ ์žฌ์‹œ๋„, ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ, ์ „์—ญ ์†๋„ ์ œํ•œ์„ ํฌํ•จํ•œ ๊ณ ๊ธ‰ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ์ˆ ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ฉ”๋ชจ. ๋ฒˆ์—ญ: ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ Envoy๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Istio์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.)

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํฌ๋“œ์™€ ๋‹จ์ผ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด Envoy ์‚ฌ์ด๋“œ์นด๋ฅผ ๊ฐ–๊ณ  ํฌํŠธ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ž ์žฌ์ ์ธ ๊ณ„๋‹จ์‹ ์—ฐ๊ฒฐ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ž‘์€ ํžˆํŠธ ๋ฐ˜๊ฒฝ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๊ฐ€์šฉ ์˜์—ญ(AZ)๋‹น ํ•˜๋‚˜์”ฉ Envoy ์ „๋ฉด ํ”„๋ก์‹œ ํฌ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํŠน์ • ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๊ฐ AZ์˜ ํฌ๋“œ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด ์ค‘ ํ•œ ๋ช…์ด ์ž‘์„ฑํ•œ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค ๊ฒ€์ƒ‰ ์—”์ง„์— ์˜์กดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Service Front-Envoy๋Š” ํ•˜๋‚˜์˜ ์—…์ŠคํŠธ๋ฆผ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ๊ฒฝ๋กœ์™€ ํ•จ๊ป˜ ์ด ์„œ๋น„์Šค ๊ฒ€์ƒ‰ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์›ํ™œํ•œ ๋ฐฐํฌ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ์‹œ๊ฐ„ ์ œํ•œ์„ ์„ค์ •ํ•˜๊ณ , ๋ชจ๋“  ํšŒ๋กœ ์ฐจ๋‹จ๊ธฐ ์„ค์ •์„ ๋Š˜๋ฆฌ๊ณ , ์ตœ์†Œ ์žฌ์‹œ๋„ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๊ฐ ์„œ๋น„์Šค ์ „๋ฉด Envoy ์•ž์— TCP ELB๋ฅผ ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํ”„๋ก์‹œ ๋ ˆ์ด์–ด์˜ Keepalive๊ฐ€ ์ผ๋ถ€ Envoy ํฌ๋“œ์— ๋ฉˆ์ท„๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋กœ๋“œ๋ฅผ ํ›จ์”ฌ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋ฐฑ์—”๋“œ์—์„œ ์ตœ์†Œ ์š”์ฒญ์„ ํ†ตํ•ด ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ์™€ ์‚ฌ์ด๋“œ์นด ํฌ๋“œ ๋ชจ๋‘์— preStop ํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ๋Š” ์‚ฌ์ด๋“œ์นด ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๊ด€๋ฆฌ ์—”๋“œํฌ์ธํŠธ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ–ˆ์œผ๋ฉฐ ํ™œ์„ฑ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋„๋ก ์ž ์‹œ ๋™์•ˆ ์ ˆ์ „ ๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ทธํ† ๋ก ๋น ๋ฅด๊ฒŒ ์›€์ง์ผ ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ผ๋ฐ˜์ ์ธ Prometheus ์„ค์น˜์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ƒ์„ธํ•œ ์ธก์ • ํ•ญ๋ชฉ ๋•๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์žฌ๋ถ„๋ฐฐํ•˜๋Š” ๋™์•ˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋Š” ์ฆ‰๊ฐ์ ์ด๊ณ  ๋ช…๋ฐฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฐ€์žฅ ๋ถˆ๊ท ํ˜•ํ•œ ์„œ๋น„์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๊ณ  ํ˜„์žฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ 12๊ฐœ์˜ ์„œ๋น„์Šค ์•ž์—์„œ ์ž‘๋™ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ฌํ•ด ์šฐ๋ฆฌ๋Š” ๊ณ ๊ธ‰ ์„œ๋น„์Šค ๊ฒ€์ƒ‰, ํšŒ๋กœ ์ฐจ๋‹จ, ์ด์ƒ์น˜ ๊ฐ์ง€, ์†๋„ ์ œํ•œ ๋ฐ ์ถ”์  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์ „์ฒด ์„œ๋น„์Šค ๋ฉ”์‹œ๋กœ์˜ ์ „ํ™˜์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜
๊ทธ๋ฆผ 3โ€“1. Envoy๋กœ ์ „ํ™˜ํ•˜๋Š” ๋™์•ˆ ํ•œ ์„œ๋น„์Šค์˜ CPU ์œตํ•ฉ

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜

Tinder๊ฐ€ Kubernetes๋กœ ์ „ํ™˜

์ตœ์ข… ๊ฒฐ๊ณผ

์ด๋Ÿฌํ•œ ๊ฒฝํ—˜๊ณผ ์ถ”๊ฐ€ ์—ฐ๊ตฌ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋Œ€๊ทœ๋ชจ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค๊ณ„, ๋ฐฐํฌ ๋ฐ ์šด์˜ํ•˜๋Š” ๋ฐ ๊ฐ•๋ ฅํ•œ ๊ธฐ์ˆ ์„ ๊ฐ–์ถ˜ ๊ฐ•๋ ฅํ•œ ์ธํ”„๋ผ ํŒ€์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  Tinder ์—”์ง€๋‹ˆ์–ด๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŒจํ‚ค์ง•ํ•˜๊ณ  Kubernetes์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ง€์‹๊ณผ ๊ฒฝํ—˜์„ ๋ณด์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ์ธํ”„๋ผ์— ์ถ”๊ฐ€ ์šฉ๋Ÿ‰์ด ํ•„์š”ํ•  ๋•Œ ์ƒˆ๋กœ์šด EC2 ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๊นŒ์ง€ ๋ช‡ ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ ค์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ช‡ ๋ถ„์ด ์•„๋‹Œ ๋ช‡ ์ดˆ ๋งŒ์— ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ EC2 ์ธ์Šคํ„ด์Šค์—์„œ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ˆ์•ฝํ•˜๋ฉด ์ˆ˜ํ‰ ์ง‘์ค‘๋„ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, 2019๋…„์—๋Š” ์ „๋…„ ๋Œ€๋น„ EC2 ๋น„์šฉ์ด ํฌ๊ฒŒ ๊ฐ์†Œํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๊ฑฐ์˜ 2019๋…„์ด ๊ฑธ๋ ธ์ง€๋งŒ 200๋…„ 1000์›”์— ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ Tinder ํ”Œ๋žซํผ์€ ์„œ๋น„์Šค 15๊ฐœ, ๋…ธ๋“œ 000๊ฐœ, ํฌ๋“œ 48๊ฐœ, ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ 000๊ฐœ๋กœ ๊ตฌ์„ฑ๋œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ๋Š” ๋” ์ด์ƒ ์šด์˜ํŒ€๋งŒ์˜ ์˜์—ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์—”์ง€๋‹ˆ์–ด๋Š” ์ด๋Ÿฌํ•œ ์ฑ…์ž„์„ ๊ณต์œ ํ•˜๊ณ  ์ฝ”๋“œ๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋ฒˆ์—ญ๊ฐ€์˜ ์ถ”์‹ 

๋˜ํ•œ ๋‹น์‚ฌ ๋ธ”๋กœ๊ทธ์—์„œ ์ผ๋ จ์˜ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€