๋ชฉ์ฐจ
ย 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 ์ปจํ
์ด๋ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํ๋ ์์ผ๋ก ์ฌ์ฉํด์๋ค
์ด์ ๊ฒ์๋ฌผ
๋ค์ ๊ฒ์๋ฌผ