Kubernetes ํฌ๋“œ๋Š” ์–ด๋–ป๊ฒŒ IP ์ฃผ์†Œ๋ฅผ ์–ป๋‚˜์š”?

๋ฉ”๋ชจ. ๋ฒˆ์—ญ: LinkedIn์˜ SRE ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์ž‘์„ฑํ•œ ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋‹ค์Œ Pod์— IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” Kubernetes์˜ ๋‚ด๋ถ€ ๋งˆ๋ฒ•, ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” CRI, CNI ๋ฐ kube-apiserver์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜ Kubernetes ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ ๊ฐ ํฌ๋“œ์—๋Š” ์ž์ฒด IP ์ฃผ์†Œ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‹ค๋ฅธ ํฌ๋“œ๋Š” ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋งŽ์€ ๋„คํŠธ์›Œํฌ "๊ณต๊ธ‰์ž"(Flannel, Calico, Canal ๋“ฑ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ Kubernetes ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ ํฌ๋“œ๊ฐ€ IP ์ฃผ์†Œ๋ฅผ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์–ป๋Š”์ง€ ์™„์ „ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋”๋ผ๋„ ์ด๋“ค์ด ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•˜๊ธฐ๋Š” ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋ฌด์—‡์ธ์ง€๋Š” ์•Œ์•˜์ง€๋งŒ ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœ๋˜๋Š”์ง€๋Š” ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €๋Š” ๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์ง€์‹๊ณผ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ํฌ๋“œ๋Š” ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ์— ๋‹ค์–‘ํ•œ ๋Ÿฐํƒ€์ž„ ์˜ต์…˜์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Kubernetes์—์„œ ๋„คํŠธ์›Œํ‚น์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ„ํ–‰๋ฌผ์€ ํ”Œ๋ž€๋„ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์œผ๋กœ - ์ปจํ…Œ์ด๋„ˆ. ๋˜ํ•œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋„คํŠธ์›Œํ‚น์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋งฅ๋ฝ์— ๋งž๊ฒŒ ๊ฐ„๋‹จํžˆ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ฐœ๋…

์ปจํ…Œ์ด๋„ˆ์™€ ๋„คํŠธ์›Œํฌ: ๊ฐ„๋žตํ•œ ๊ฐœ์š”

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

ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ

๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— IP ์ฃผ์†Œ๋ฅผ ํ†ตํ•œ ํ†ต์‹ ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ Linux ๋ธŒ๋ฆฌ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด Kubernetes(๋ฐ Docker)์— ๊ฐ€์ƒ ์žฅ์น˜๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. veth (๊ฐ€์ƒ ์ด๋”๋„ท). veth ์žฅ์น˜์˜ ํ•œ์ชฝ ๋์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐ๋˜๊ณ  ๋‹ค๋ฅธ ์ชฝ ๋์€ ๋ฆฌ๋ˆ…์Šค ๋ธŒ๋ฆฌ์ง€ ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ์—์„œ.

๋™์ผํ•œ ํ˜ธ์ŠคํŠธ์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์—๋Š” veth์˜ ํ•œ์ชฝ ๋์ด ๋ธŒ๋ฆฌ์ง€์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด IP ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Linux ๋ธŒ๋ฆฌ์ง€์—๋Š” IP ์ฃผ์†Œ๋„ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ํ–ฅํ•˜๋Š” ํฌ๋“œ์˜ ์†ก์‹  ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•œ ๊ฒŒ์ดํŠธ์›จ์ด ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ํฌ๋“œ๋Š” ์–ด๋–ป๊ฒŒ IP ์ฃผ์†Œ๋ฅผ ์–ป๋‚˜์š”?

๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ

ํŒจํ‚ท ์บก์Šํ™”๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Flannel์—์„œ๋Š” ๊ธฐ์ˆ ์ด ์ด๋Ÿฌํ•œ ๊ธฐํšŒ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. vxlan, ์›๋ณธ ํŒจํ‚ท์„ UDP ํŒจํ‚ท์œผ๋กœ "ํŒจํ‚ค์ง€"ํ•œ ๋‹ค์Œ ๋Œ€์ƒ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Flannel์€ vxlan ์žฅ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๊ฐ ๋…ธ๋“œ์˜ ๊ฒฝ๋กœ ํ…Œ์ด๋ธ”์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ํ–ฅํ•˜๋Š” ๊ฐ ํŒจํ‚ท์€ vxlan ์žฅ์น˜๋ฅผ ํ†ต๊ณผํ•˜๊ณ  UDP ํŒจํ‚ท์— ์บก์Šํ™”๋ฉ๋‹ˆ๋‹ค. ๋ชฉ์ ์ง€์—์„œ๋Š” ์ค‘์ฒฉ๋œ ํŒจํ‚ท์ด ์ถ”์ถœ๋˜์–ด ์›ํ•˜๋Š” ํฌ๋“œ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

Kubernetes ํฌ๋“œ๋Š” ์–ด๋–ป๊ฒŒ IP ์ฃผ์†Œ๋ฅผ ์–ป๋‚˜์š”?
์ฐธ๊ณ : ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ตฌ์„ฑํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

CRI๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

CRI(์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ์ธํ„ฐํŽ˜์ด์Šค) kubelet์ด ๋‹ค์–‘ํ•œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. CRI API๋Š” ๋‹ค์–‘ํ•œ ๋Ÿฐํƒ€์ž„์— ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ๋Ÿฐํƒ€์ž„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CNI๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

ํ”„๋กœ์ ํŠธ CNI ~์ด๋‹ค. ์‚ฌ์–‘ Linux ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ ๋ฒ”์šฉ ๋„คํŠธ์›Œํฌ ์†”๋ฃจ์…˜์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ, Pod ๋„คํŠธ์›Œํฌ ์„ค์ • ์‹œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•˜๋Š” ์‹คํ–‰ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค(์•„๋ž˜์—์„œ ์ผ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค).

ํฌ๋“œ์— IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋“œ์— ์„œ๋ธŒ๋„ท ํ• ๋‹น

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

๋…ธ๋“œ IPAM ์ปจํŠธ๋กค๋Ÿฌ

์–ธ์ œ nodeipam ํ”Œ๋ž˜๊ทธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋จ --controllers kube-์ปจํŠธ๋กค๋Ÿฌ-๊ด€๋ฆฌ์ž, ํด๋Ÿฌ์Šคํ„ฐ CIDR(์ฆ‰, ํด๋Ÿฌ์Šคํ„ฐ ๋„คํŠธ์›Œํฌ์˜ IP ์ฃผ์†Œ ๋ฒ”์œ„)์˜ ๊ฐ ๋…ธ๋“œ์— ๋ณ„๋„์˜ ์„œ๋ธŒ๋„ท(podCIDR)์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ podCIDR์€ ๊ฒน์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ Pod์— ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes ๋…ธ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์ฒ˜์Œ ๋“ฑ๋ก๋  ๋•Œ podCIDR์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ podCIDR์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋…ธ๋“œ๋ฅผ ๋“ฑ๋ก ์ทจ์†Œํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋“ฑ๋กํ•˜๊ณ  ๊ทธ ์‚ฌ์ด์— Kubernetes ์ œ์–ด ๊ณ„์ธต ๊ตฌ์„ฑ์„ ์ ์ ˆํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ podCIDR์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

Kubelet, ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„ ๋ฐ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ: ๋ชจ๋“  ์ž‘๋™ ๋ฐฉ์‹

๋…ธ๋“œ๋‹น ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๋ ค๋ฉด ๋งŽ์€ ์ค€๋น„ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„น์…˜์—์„œ๋Š” ํฌ๋“œ ๋„คํŠธ์›Œํฌ ์„ค์ •๊ณผ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ ํ•ญ๋ชฉ์—๋งŒ ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ๋…ธ๋“œ์— ๋Œ€ํ•œ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ ์ฒด์ธ์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

Kubernetes ํฌ๋“œ๋Š” ์–ด๋–ป๊ฒŒ IP ์ฃผ์†Œ๋ฅผ ์–ป๋‚˜์š”?

FAQ : Containerd CRI ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜.

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„๊ณผ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ

๊ฐ ๋„คํŠธ์›Œํฌ ์ œ๊ณต์—…์ฒด์—๋Š” ์ž์ฒด CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ์˜ ๋Ÿฐํƒ€์ž„์€ ์ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํฌ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Containerd์˜ ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋“œ CRI.

๋˜ํ•œ ๊ฐ ๊ณต๊ธ‰์ž์—๋Š” ์ž์ฒด ์—์ด์ „ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  Kubernetes ๋…ธ๋“œ์— ์„ค์น˜๋˜๋ฉฐ Pod์˜ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ์—์ด์ „ํŠธ๋Š” CNI ๊ตฌ์„ฑ์— ํฌํ•จ๋˜๊ฑฐ๋‚˜ ๋…ธ๋“œ์— ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ CRI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ˜ธ์ถœํ•  CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

CNI ๊ตฌ์„ฑ์˜ ์œ„์น˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” /etc/cni/net.d/<config-file>. ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋Š” ์ผ๋„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์œ„์น˜๋„ ๋งž์ถค ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋””๋ ‰ํ† ๋ฆฌ - /opt/cni/bin.

Containerd๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์„ฑ ๋ฐ ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์„น์…˜์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [plugins.ยซio.containerd.grpc.v1.criยป.cni] ะฒ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ ํŒŒ์ผ.

Flannel์„ ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ Flannel ์„ค์ •์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Flanneld(Flannel์˜ ๋ฐ๋ชฌ)๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์— DaemonSet์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. install-cni ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™”.
  • Install-cni ์ฐฝ์กฐ CNI ๊ตฌ์„ฑ ํŒŒ์ผ (/etc/cni/net.d/10-flannel.conflist) ๊ฐ ๋…ธ๋“œ์—.
  • Flanneld๋Š” vxlan ์žฅ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , API ์„œ๋ฒ„์—์„œ ๋„คํŠธ์›Œํฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , Pod ์—…๋ฐ์ดํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์˜ ๋ชจ๋“  ํฌ๋“œ์— ๊ฒฝ๋กœ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ํฌ๋“œ๋Š” IP ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Flannel ์ž‘์—…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ๊ธฐ์‚ฌ ๋ ๋ถ€๋ถ„์— ์žˆ๋Š” ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ Containerd CRI ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

Kubernetes ํฌ๋“œ๋Š” ์–ด๋–ป๊ฒŒ IP ์ฃผ์†Œ๋ฅผ ์–ป๋‚˜์š”?

์œ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด kubelet์€ Containerd CRI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜์—ฌ ํฌ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜์—ฌ ํฌ๋“œ์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž์˜ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค๋ฅธ ํ•ต์‹ฌ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜์—ฌ ๋„คํŠธ์›Œํฌ์˜ ๋‹ค์–‘ํ•œ ์ธก๋ฉด์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ

ํ˜ธ์ŠคํŠธ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋Š” ๋‹ค์–‘ํ•œ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๊ทธ ์ค‘ ์„ธ ๊ฐ€์ง€๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”Œ๋ž€๋„ฌ

Flannel์„ ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Containerd CRI ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”Œ๋ž€๋„ฌCNI ๊ตฌ์„ฑ ํŒŒ์ผ ์‚ฌ์šฉ /etc/cni/net.d/10-flannel.conflist.

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cni0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
         "ipMasq": false,
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }
  ]
}

Flannel CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Flanneld์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ Flanneld๋Š” API ์„œ๋ฒ„์—์„œ podCIDR ๋ฐ ๊ธฐํƒ€ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. /run/flannel/subnet.env.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

Flannel CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. /run/flannel/subnet.env CNI ๋ธŒ๋ฆฌ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์„ฑํ•˜๊ณ  ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ธŒ๋ฆฌ์ง€

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์Œ ๊ตฌ์„ฑ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

์ฒ˜์Œ ํ˜ธ์ถœ๋˜๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ Linux ๋ธŒ๋ฆฌ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ยซnameยป: ยซcni0ยป, ์ด๋Š” ๊ตฌ์„ฑ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ํฌ๋“œ์— ๋Œ€ํ•ด veth ์Œ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ•œ์ชฝ ๋์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐ๋˜๊ณ  ๋‹ค๋ฅธ ์ชฝ ๋์€ ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ์˜ Linux ๋ธŒ๋ฆฌ์ง€์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ธŒ๋ฆฌ์ง€ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ์˜ Linux ๋ธŒ๋ฆฌ์ง€์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

veth ์Œ ์„ค์ •์„ ๋งˆ์นœ ํ›„ Bridge ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ˜ธ์ŠคํŠธ-๋กœ์ปฌ IPAM CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. IPAM ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ ํ˜•์€ CRI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด Flannel CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” CNI ๊ตฌ์„ฑ์—์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ-๋กœ์ปฌ IPAM CNI ํ”Œ๋Ÿฌ๊ทธ์ธ

๋ธŒ๋ฆฌ์ง€ CNI ํ†ตํ™” ํ˜ธ์ŠคํŠธ-๋กœ์ปฌ IPAM ํ”Œ๋Ÿฌ๊ทธ์ธ CNI ๋‹ค์Œ ๊ตฌ์„ฑ์œผ๋กœ:

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

ํ˜ธ์ŠคํŠธ-๋กœ์ปฌ IPAM ํ”Œ๋Ÿฌ๊ทธ์ธ (IP A์˜ ddress M๊ด€๋ฆฌ - IP ์ฃผ์†Œ ๊ด€๋ฆฌ) ์„œ๋ธŒ๋„ท์—์„œ ์ปจํ…Œ์ด๋„ˆ์˜ IP ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์„น์…˜์— ์ง€์ •๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ํ˜ธ์ŠคํŠธ์— ํ• ๋‹น๋œ IP๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>. ์ด ํŒŒ์ผ์—๋Š” ์ด IP ์ฃผ์†Œ๊ฐ€ ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ID๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ-๋กœ์ปฌ IPAM ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

๊ฐœ์š”

Kube-controller-manager๋Š” ๊ฐ ๋…ธ๋“œ์— podCIDR์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ์˜ Pod๋Š” ํ• ๋‹น๋œ PodCIDR ๋ฒ”์œ„์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ IP ์ฃผ์†Œ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ podCIDR์€ ๊ฒน์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“  Pod๋Š” ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” kubelet, ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„, ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž ์—์ด์ „ํŠธ๋ฅผ ๊ตฌ์„ฑ ๋ฐ ์„ค์น˜ํ•˜๊ณ  CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐ ๋…ธ๋“œ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ ๊ณต๊ธ‰์ž ์—์ด์ „ํŠธ๋Š” CNI ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ๊ฐ€ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋˜๋ฉด kubelet์€ CRI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜์—ฌ ํฌ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, Containerd๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Containerd CRI ํ”Œ๋Ÿฌ๊ทธ์ธ์€ CNI ๊ตฌ์„ฑ์— ์ง€์ •๋œ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•˜์—ฌ ํฌ๋“œ์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ํฌ๋“œ๋Š” IP ์ฃผ์†Œ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ƒํ˜ธ ์ž‘์šฉ์˜ ๋ชจ๋“  ๋ฏธ๋ฌ˜ํ•จ๊ณผ ๋‰˜์•™์Šค๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝํ—˜์ด Kubernetes์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๋” ์ž˜ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ €์—๊ฒŒ ์—ฐ๋ฝ์ฃผ์„ธ์š”. ํŠธ์œ„ํ„ฐ ์•„๋‹ˆ๋ฉด ๊ทธ ์ฃผ์†Œ์—์„œ [์ด๋ฉ”์ผ ๋ณดํ˜ธ]. ์ด ๊ธฐ์‚ฌ์˜ ๋‚ด์šฉ์ด๋‚˜ ๋‹ค๋ฅธ ๋‚ด์šฉ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์—ฐ๋ฝํ•ด ์ฃผ์„ธ์š”. ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

์ฐธ์กฐ

์ปจํ…Œ์ด๋„ˆ ๋ฐ ๋„คํŠธ์›Œํฌ

ํ”Œ๋ž€๋„ฌ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

CRI ๋ฐ CNI

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

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

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