๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Book Review/๐Ÿ“˜ Kubernetes Best Practice

[Kubernetes Best Practice] 9. ๋„คํŠธ์›Œํ‚น, ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ, ์„œ๋น„์Šค ๋ฉ”์‹œ

by Seongpyo Hong 2021. 3. 5.

์ด ๊ธ€์€ Kubernetes Best Practice๋ฅผ ์ฝ๊ณ ๊ฐœ์ธ์ ์œผ๋กœ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์ž˜ ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.๋ชจ๋“  ๋‚ด์šฉ์€ ์ฑ…์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์œผ๋ฉฐ ์ž์„ธํ•œ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ์ฑ…์„ ๊ตฌ๋งคํ•ด์„œ ์ฝ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ตœ๊ทผ ์„œ๋น„์Šค ๋ฉ”์‹œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฑฐ๋‚˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์—ˆ๋˜ ์ƒ๊ฐ์€ ์ด ๋ฐฉ๋ฒ•์ด ์ตœ์„ ์ธ๊ฐ€? ๋ผ๋Š” ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ฆ์„ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋„์›€์ด ๋ ๋งŒํ•œ ์ฑ…์„ ๋ฐœ๊ฒฌํ•ด์„œ ์ฝ์–ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ ๊ทœ์น™

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

๋งŒ์•ฝ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„์€ ์ปคํ”ผ ๊ณ ๋ž˜๋‹˜์˜ ๊ธ€์—์„œ ๋ณด๋‹ค ์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋™์ผํ•œ Pod์— ์†ํ•ด์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ 

๋™์ผํ•œ Pod์— ์†ํ•ด์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” localhost๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ์ด๋กœ ์ธํ•ด ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค๋ฅธ ํฌํŠธ๋ฅผ ์—ด์–ด๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” Pod์˜ ๋‚ด๋ถ€์—์„œ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” pause ์ปจํ…Œ์ด๋„ˆ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค. pause ์ปจํ…Œ์ด๋„ˆ๋Š” ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋™์ผํ•œ Pod์— ์กด์žฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์—๊ฒŒ ๊ณต์œ ํ•˜๊ณ  ์ด๋กœ ์ธํ•ด ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

pause ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ alice_k106๋‹˜์˜ ๊ธ€์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฝ์–ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.


Pod ๊ฐ„์˜ ํ†ต์‹ 

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ Pod์€ NAT์—†์ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ์†ํ•ด์žˆ๋Š” Pod์€ ๊ฐ์ž ๊ฐ€์ง€๊ณ  ์žˆ๋Š” IP ๊ทธ๋Œ€๋กœ (Node IP๊ฐ€ ์•„๋‹Œ Pod IP) ๋‹ค๋ฅธ Pod๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Service์™€ Pod ๊ฐ„์˜ ํ†ต์‹ 

Kubernetes๋Š” Pod์˜ IP๋Š” ์ž„์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Service๋ฅผ ํ†ตํ•ด ๊ณ ์ •๋œ IP ๋ฐ ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ผ๊ด€๋œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Service๋Š” selector๋ฅผ ํ†ตํ•ด ๋งค์นญ๋˜๋Š” Endpoint์—๊ฒŒ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‚ด๋ถ€ ๊ธฐ์ˆ ์€ user-space mode์—์„œ 1.2 ์ดํ›„๋ถ€ํ„ฐ iptable์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด user-space mode๋Š” kube-proxy๊ฐ€ ์ง์ ‘ ํ”„๋ก์‹œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ iptable mode๋Š” kube-proxy๋Š” netfilter์—๊ฒŒ proxy์˜ ์—ญํ• ์„ ์œ„์ž„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ

Kubernetes๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ณ๋ฅผ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ํ‘œ์ค€์„ ์ œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” 2๊ฐœ์˜ ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Kubenet

Kubenet์€ Kubernetes๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. kubenet์€ cbr0๋ผ๋Š” ๋ฆฌ๋ˆ…์Šค ๋ธŒ๋ฆฟ์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ ์Œ์˜ ํ˜ธ์ŠคํŠธ ๋์ด cbr0์— ์—ฐ๊ฒฐ๋œ Pod์— ๋Œ€ํ•œ veth ์Œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์Œ์˜ Pod ๋์—๋Š” CIDR ๋ฒ”์œ„ ๋‚ด์˜ IP๋ฅผ ํ• ๋‹น๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
(
๋ฌธ์„œ ์ฐธ๊ณ )

์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ํ‰์†Œ ํด๋ผ์šฐ๋“œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๊ณ  ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•ด๋ณธ์ ์ด ์—†์–ด ์•Œ์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, Pod์˜ CIDR ๋ฒ”์œ„๋‚˜ ๋ผ์šฐํŒ… ๊ทœ์น™๊ณผ ๊ฐ™์€ ๊ฒฌ๊ณ ํ•œ ๋„คํŠธ์›Œํฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


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

CNI๋Š” CNI์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค, API ๋™์ž‘, CRI์™€์˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๋ช…์„ธ์ž…๋‹ˆ๋‹ค. CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฐœ๋ฐœ ๋ฐ ์„ ํƒํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์ถ•ํ•œ ์ธํ”„๋ผ์˜ ๋„คํŠธ์›Œํ‚น ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ex) ๊ณ ๊ฐ€์šฉ์„ฑ, ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ์—ฐ๊ฒฐ etc.

  • ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ/๊ด€๋ฆฌ ๋“ฑ์— ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ์™€ CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ˜ธํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค

์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ Pod์€ ์ž„์‹œ์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— Pod์— ์ผ๊ด€๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด Kubernetes๋Š” Service๋ผ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์„œ๋น„์Šค์— ํ• ๋‹น๋œ IP์™€ Port๋ฅผ ์‹ค์ œ Pod(Endpoint)์— ๋งคํ•‘ํ•˜๋Š” ์—ญํ• ์„ kube-proxy๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋Š” 4๊ฐ€์ง€์˜ ๊ธฐ๋ณธ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ClusterIP

์„œ๋น„์Šค ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์„ ๋•Œ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ธฐ๋ณธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ClusterIP๋Š” ์„œ๋น„์Šค์˜ ์ง€์ •๋œ CIDR ๋ฒ”์œ„ ๋‚ด์—์„œ IP๊ฐ€ ํ• ๋‹น๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ *my-svc.my-namespace.svc.cluster-domain.example *์˜ DNS ์ด๋ฆ„์ด ์ƒ์„ฑ๋˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์„œ๋น„์Šค ๋ฐ ์˜ค๋ธŒ์ ํŠธ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋Š” Selector๋ฅผ ํ†ตํ•ด Endpoint๋ฅผ ๋งคํ•‘ํ•˜๋Š”๋ฐ ๋งŒ์•ฝ Selector๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํŠน์ • Endpoint์™€ Port๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” Endpoint API๋ฅผ ์‚ฌ์šฉํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ํ…Œ์ŠคํŠธ ์‹œ์ ์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ์—†๋Š” DB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ฐฐํฌ ์ดํ›„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋˜๋Š” DB๋กœ ์„œ๋น„์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ๋“ฑ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Nodeport

Nodeport ํƒ€์ž…์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์˜ ๊ณ ์ˆ˜์ค€ ํฌํŠธ(30000 ~ 32767)๋ฅผ ๊ฐ ๋…ธ๋“œ์˜ ์„œ๋น„์Šค IP์™€ ํฌํŠธ์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์„œ๋น„์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” NodeIP:NodePort๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ExternalName

ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€์—์„œ์˜ DNS ์ด๋ฆ„์„ ์™ธ๋ถ€ DNS ์„œ๋น„์Šค์— ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ˜„์—…์—์„œ๋Š” ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ œํ•œ์ ์ด๋ผ๊ณ  ํ•˜๋ฉฐ ํด๋ผ์šฐ๋“œ ํ”„๋กœ๋ฐ”์ด๋”์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ณ ์œ  DNS๋ฅผ ๊ฐ€์ง€๋Š” ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


LoadBalancer

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๊ณต๊ธ‰์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ LoadBalancer ํƒ€์ž…์ž…๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ํ†ตํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ํด๋ผ์šฐ๋“œ์— ์กด์žฌํ•˜๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด ์กด์žฌํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Ingress

์œ„์˜ 4๊ฐ€์ง€ ํƒ€์ž…์ฒ˜๋Ÿผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์„œ๋น„์Šค ํƒ€์ž…์€ ์•„๋‹ˆ์ง€๋งŒ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด Ingress์— ๋Œ€ํ•ด ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Kubernetes Service๋Š” L4 ์ˆ˜์ค€์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์˜ํ•˜๋ฉฐ ์ด๋ณด๋‹ค ์„ธ๋ฐ€ํ•œ ์ฆ‰, L7 ์ˆ˜์ค€์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋ถ„๋ช… ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Ingress๋Š” L7 ์ˆ˜์ค€์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ํ˜ธ์ŠคํŠธ ๋ฐ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ์„œ๋น„์Šค์—๊ฒŒ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด /login ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์€ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Pod๊ณผ ๋งคํ•‘๋˜์–ด ์žˆ๋Š” Service๋กœ, /buy ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์€ ๊ตฌ๋งค ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Pod๊ณผ ๋งคํ•‘๋œ Service๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ TLS์™€ ๊ฐ™์€ ๋ณด์•ˆ ๊ด€๋ จ ์„ค์ •๋“ค๋„ Ingress์—์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Ingress๋Š” ํŠธ๋ž˜ํ”ฝ ๊ทœ์น™์„ ์ •์˜ํ•œ ์˜ค๋ธŒ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ์— ํ•ด๋‹น ๊ทœ์น™์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Ingress Controller๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Ingress Controller๋กœ๋Š” NGINX๋‚˜ HAProxy์™€ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ์†”๋ฃจ์…˜์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋„คํŠธ์›Œํฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ์„œ๋น„์Šค ๋ฐ ์ธ๊ทธ๋ ˆ์Šค ๊ด€๋ จ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

  • ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ HTTP/HTTPS ๊ธฐ๋ฐ˜์ด๋ผ๋ฉด Ingress๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Ingress๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํŠธ๋ž˜ํ”ฝ๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ Ingress์—๊ฒŒ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ HA๊ฐ€ ๊ณ ๋ ค๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•ด ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ™•์žฅํ•˜๊ณ  ํ™•์žฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ์ •์ฑ…

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” NetworkPolicy API๋ฅผ ํ†ตํ•ด Ingress/Egress ์ ‘๊ทผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Network Policy API์˜ ๋ช…์„ธ์—๋Š” podSelector, ingress, egress, policyType ํ•„๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ podSelector๋ฅผ ํ†ตํ•ด Pod์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ Pod์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  Pod์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„ ํƒ๋œ Pod์€ ์ •์˜๋œ Ingress, Egress ๊ทœ์น™์— ํ—ˆ์šฉ๋˜๋Š” Whitelist๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น Pod์— ๋Œ€ํ•œ ์š”์ฒญ์€ ์˜ค์ง Whitelist๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ Ingress์™€ Egress๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ / ์•„์›ƒ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ์ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๋กœ Frontend => Backend => DB Layer๋กœ ์ด๋ฃจ์–ด์ง„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. Frontend ์„œ๋น„์Šค๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•˜๋ฉฐ, Backend๋Š” ์˜ค์ง Frontend ์„œ๋น„์Šค์—์„œ๋งŒ, DB๋Š” ์˜ค์ง Backend ์„œ๋น„์Šค์—์„œ๋งŒ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•œ NetworkPolicy ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋ชจ๋“  ์ธ๋ฐ”์šด๋“œ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•œ ์ดํ›„, ๊ฐ ๋ชฉ์ ์— ๋งž๋Š” ์ธ๋ฐ”์šด๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•œ Ingress๋ฅผ ์ •์˜ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ์ธ๋ฐ”์šด๋“œ์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•˜๋Š” ์ด์œ ๋Š” ์‹ค์ˆ˜๋กœ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์‚ญ์ œํ•˜๋”๋ผ๋„ ์™ธ๋ถ€๋กœ ์„œ๋น„์Šค๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

apiVersion: networking.k82.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
spec:
  podSelector: {}
  policyTypes:
  - Ingress
---
apiVersion: networking.k82.io/v1
kind: NetworkPolicy
metadata:
  name: frontend-policy
spec:
  podSelector:
    matchLabels:
      app: "frontend"
  policyTypes:
  - Ingress
  ingress:
  - {}
---
apiVersion: networking.k82.io/v1
kind: NetworkPolicy
metadata:
  name: backend-policy
spec:
  podSelector:
    matchLabels:
      app: "backend"
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: "frontend"

---
apiVersion: networking.k82.io/v1
kind: NetworkPolicy
metadata:
  name: db-policy
spec:
  podSelector:
    matchLabels:
      app: "db"
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: "backend"  

์ฑ…์—์„œ ์ œ์‹œํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์„ค์ • ๋ฐ ๊ด€๋ฆฌํ•  ๋•Œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ชจ๋“  ์ธ๋ฐ”์šด๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ๋ณธ ํŠธ๋ž˜ํ”ฝ์„ ์ •์˜ํ•˜๋ฉด ์‹ค์ˆ˜๋กœ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์‚ญ์ œํ•˜๋”๋ผ๋„ ๋…ธ์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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


์„œ๋น„์Šค ๋ฉ”์‹œ

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

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

์ฑ…์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์„œ๋น„์Šค ๋ฉ”์‹œ๋Š” ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•˜๊ณ  ํ™˜๊ฒฝ์ด ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด์ƒ์—…์  ์ง€์›์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋„์ž… ์ „ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€