Search

[CKA] 60. The Why and What of CNI

Date
2026/02/01
Category
Devops
Tag
Kubernetes
CKA
Network
๋ชฉ์ฐจ

ย Container Network Interface

์ง€๋‚œ ๊ธ€์„ ํ†ตํ•ด Linux ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ฒฉ๋ฆฌ๋œ ๋„คํŠธ์›Œํฌ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ , veth pair๋กœ ๊ฐ€์ƒ ์ผ€์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜๊ณ , Linux Bridege๋กœ ๊ฐ€์ƒ ์Šค์œ„์น˜๋ฅผ ๋งŒ๋“ค์–ด ํ•„์š”ํ•˜๋ฉด iptables๋กœ NAT(MASQUERADE)๊นŒ์ง€ ์ผœ์„œ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ธธ์„ ๋งŒ๋“œ๋Š” ํ๋ฆ„์„ ๊ณต๋ถ€ํ–ˆ๋‹ค.
๋ฌธ์ œ๋Š”
โ€ข
Docker๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ค๊ณ (veth + bridge)
โ€ข
Rocket, Mesos, Kubernetes ๊ฐ™์€ ๋Ÿฐํƒ€์ž„๋„ ๊ฒฐ๊ตญ โ€œ๋น„์Šทํ•œ ๋ฌธ์ œโ€๋ฅผ ํ’€๊ณ  ์žˆ๊ณ 
โ€ข
๋‹ค๋“ค ๋น„์Šทํ•œ ์ ‘๊ทผ์„ ํ•˜๋ฉด์„œ๋„ ๊ฐ์ž ๊ตฌํ˜„์ด ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค
โ€œ๋˜‘๊ฐ™์€ ๋„คํŠธ์›Œํ‚น ๋ฌธ์ œ๋ฅผ ์™œ ๋Ÿฐํƒ€์ž„๋งˆ๋‹ค ๋ฐ˜๋ณตํ•ด์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ?โ€์—์„œ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ ๊ฒƒ์ด CNI์ด๋‹ค.

๋„คํŠธ์›Œํ‚น ๋ถ€๋ถ„๋งŒ ํ‘œ์ค€ํ™”

์ปจํ…Œ์ด๋„ˆ Runtime์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ํ•ด์•ผ ํ•˜๋Š” ๋„คํŠธ์›Œํ‚น ์ž‘์—…์€ ๊ฝค ์ •ํ˜•ํ™”๋˜์–ด ์žˆ๋‹ค.
1.
Network Namespace ์ƒ์„ฑ
2.
bridge network/interface ์ƒ์„ฑ
3.
veth pairs(pipe, virtual cable) ์ƒ์„ฑ
4.
veth๋ฅผ namespace์— ๋ถ™์ด๊ธฐ
5.
๋‹ค๋ฅธ veth๋ฅผ bridge์— ๋ถ™์ด๊ธฐ
6.
IP ์ฃผ์†Œ ํ• ๋‹น
7.
์ธํ„ฐํŽ˜์ด์Šค ์‹คํ–‰
8.
ํ•„์š”ํ•˜๋ฉด NAT/ํฌํŠธํฌ์›Œ๋”ฉ
๋„คํŠธ์›Œํ‚น ๋ถ€๋ถ„์ธ 2~8๋ฒˆ ๊ณผ์ •์„ bridge๋ผ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๋ช…ํ™•ํ•ด์ง„๋‹ค.
โ€ข
Runtime(Kubernetes/Rocket ๋“ฑ)์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ 
โ€ข
bridge ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ปจํ…Œ์ด๋„ˆ ID + ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋„˜๊ฒจ
โ€ข
๋„คํŠธ์›Œํ‚น ๊ตฌ์„ฑ์„ ์™ธ์ฃผํ•œ๋‹ค
๋Ÿฐํƒ€์ž„์€ ๋„คํŠธ์›Œํฌ ๊ตฌํ˜„์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์งˆ๋ฌธ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค:
โ€ข
โ€œ์ด bridge ํ”„๋กœ๊ทธ๋žจ์€ ์–ด๋–ค ์ธ์ž๋ฅผ ๋ฐ›์•„์•ผ ํ•˜์ง€?โ€
โ€ข
โ€œ๋Ÿฐํƒ€์ž„์€ ์–ธ์ œ/์–ด๋–ป๊ฒŒ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•˜์ง€?โ€
โ€ข
โ€œ์ถœ๋ ฅ์€ ์–ด๋–ค ํ˜•์‹์ด์–ด์•ผ ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€?โ€
์ฆ‰, ํ”„๋กœ๊ทธ๋žจ(ํ”Œ๋Ÿฌ๊ทธ์ธ)์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ CNI์ด๋‹ค.

CNI = โ€œํ”Œ๋Ÿฌ๊ทธ์ธ ๊ทœ๊ฒฉโ€

CNI๋Š” ํ•œ๋งˆ๋””๋กœ ์ •์˜ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ(ํ”Œ๋Ÿฌ๊ทธ์ธ)์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊ณ , ๋Ÿฐํƒ€์ž„์ด ๊ทธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”์ง€ ์ •์˜ํ•œ ํ‘œ์ค€
์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ CNI๋Š” ๋„คํŠธ์›Œํฌ ๊ตฌํ˜„์ด ์•„๋‹ˆ๋ผ โ€œ๊ทœ๊ฒฉโ€์ด๋ผ๋Š” ์ ์ด๋‹ค
ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ๊ณ , ๋Ÿฐํƒ€์ž„ ๋˜ํ•œ ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘˜์ด ๋ถ™๋Š” ์ ‘์ ์„ ํ‘œ์ค€ํ™”ํ•˜์—ฌ โ€˜์–ด๋А ๋Ÿฐํƒ€์ž„์ด๋“  ์–ด๋А ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋“ โ€™ ๋ถ™๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.

ย CNI์—์„œ ์—ญํ•  ๋ถ„๋ฆฌ

์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์˜ ์ฑ…์ž„

CNI๋Š” ๋Ÿฐํƒ€์ž„์—๊ฒŒ ๋‹ค์Œ์„ ์š”๊ตฌํ•œ๋‹ค:
1.
์ปจํ…Œ์ด๋„ˆ๋งˆ๋‹ค ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค (Container Runtime must create network namespace)
2.
์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ถ™์„ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค (Identify the network the container must attach to)
3.
์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ADD๋กœ ํ˜ธ์ถœํ•œ๋‹ค (Container Runtime to invoke Network Plugin (bridge) when container is ADDed)
4.
์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ DEL๋กœ ํ˜ธ์ถœํ•œ๋‹ค (Container Runtime to invoke Network Plugin (bridge) when container is DELeted)
5.
ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ •์€ JSON ํŒŒ์ผ๋กœ ์ „๋‹ฌํ•œ๋‹ค (JSON format of the Network Configuration)
์ฆ‰, ๋Ÿฐํƒ€์ž„์€ ์ปจํ…Œ์ด๋„ˆ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ํ˜ธ์ถœ ํƒ€์ด๋ฐ์„ ์ฑ…์ž„์ง€๊ณ , ๋„คํŠธ์›Œํฌ ์„ธํŒ… ์ž์ฒด๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์—๊ฒŒ ๋งก๊ธด๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ฑ…์ž„

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค:
1.
ADD, DEL, CHECK ๊ฐ™์€ ํ‘œ์ค€ ์ปค๋งจ๋“œ(์ธ์ž)๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค
2.
์ปจํ…Œ์ด๋„ˆ id/๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•œ๋‹ค
3.
ํŒŒ๋“œ์— IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋„คํŠธ์›Œํฌ์˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ๋„๋‹ฌํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ด€๋ จ ๊ฒฝ๋กœ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค
4.
๊ฒฐ๊ณผ๋ฅผ ์ •ํ•ด์ง„ ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค

ย CNI ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„

CNI ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‹ค์–‘ํ•˜๊ฒŒ ์กด์žฌํ•œ๋‹ค:
โ€ข
๊ธฐ๋ณธ ์ œ๊ณต/๋Œ€ํ‘œ ํ”Œ๋Ÿฌ๊ทธ์ธ: bridge, vlan, macvlan, host-local, dhcp ๋“ฑ
โ€ข
์„œ๋“œํŒŒํ‹ฐ/๋ฒค๋” ํ”Œ๋Ÿฌ๊ทธ์ธ: weave, flannel, cilium, calico, VMware NSX, Infoblox ๋“ฑ

Docker๋Š” ์˜ˆ์™ธ

Docker๋Š” CNI๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค. Docker๋Š” Docker๋งŒ์˜ ๋„คํŠธ์›Œํ‚น ํ‘œ์ค€์ธ CNM(Container Network Model)์ด๋ผ๋Š” ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ๋Š” CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋„คํŠธ์›Œํ‚นํ•˜์ง€ ๋ชปํ•˜๋ฉฐ ์ง์ ‘ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.
docker run --network=cni-bridge nginx # ๋„ค์ดํ‹ฐ๋ธŒ ๋ถˆ๊ฐ€๋Šฅ # ๊ฐ€๋Šฅ docker run --network=none nginx bridge add 2e34dcf34 /var/run/netns/2e34dcf34
Bash
๋ณต์‚ฌ
์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์—†์ด Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ Bridge ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด CNI๋ฅผ Docker์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด ๋ฐฉ์‹์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.(Docker๋ฅผ Runtime์œผ๋กœ ์‚ฌ์šฉํ•˜๋˜ ์‹œ์ ˆ ๊ธฐ์ค€)

์ •๋ฆฌ

โ€ข
์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํ‚น์€ ๊ฒฐ๊ตญ ๋‹ค ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ํ‘ผ๋‹ค: netns + veth + bridge + ip/route (+ NAT)
โ€ข
๋Ÿฐํƒ€์ž„๋งˆ๋‹ค ์ด๊ฑธ ๋ฐ˜๋ณต ๊ตฌํ˜„ํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด๋‹ค
โ€ข
๊ทธ๋ž˜์„œ โ€œ๋„คํŠธ์›Œํ‚น ๊ตฌ์„ฑโ€์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์ด์˜ ํ˜ธ์ถœ ๊ทœ์น™์„ ํ‘œ์ค€ํ™”ํ•œ ๊ฒŒ CNI
โ€ข
CNI๋ฅผ ๋”ฐ๋ฅด๋ฉด โ€œ์–ด๋–ค ๋Ÿฐํƒ€์ž„์ด๋“  ์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋“ โ€ ํ˜ธํ™˜ ๊ฐ€๋Šฅ
โ€ข
Docker๋Š” ๊ธฐ๋ณธ์ด CNI๊ฐ€ ์•„๋‹ˆ๋ผ CNM์ด์ง€๋งŒ, Kubernetes๋Š” CNI ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ˜ธ์ถœํ•ด์„œ Docker ์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์™”๋‹ค
๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ