Switching Routing


ip link

์„œ๋กœ ๋‹ค๋ฅธ Host ๊ฐ€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‘ Host ๋ฅผ ์ด์–ด์ฃผ๋Š” Switch ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Host ๋ฅผ Switch ์— ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด Network Interface ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Host ์˜ Network Interface ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. Linux ์˜ ๊ฒฝ์šฐ eth0 ๋ผ๋Š” Network Interface ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ip addr
ip addr add 192.168.1.10/24 dev eth0

Host ๋“ค์ด Switch ์— ์—ฐ๊ฒฐ๋œ ์ดํ›„ ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Host ์— IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

ip route
ip route add 192.168.2.0/24 via 192.168.1.1
ip route add default via 192.168.2.1
ip route add 0.0.0.0 via 192.168.2.1

์„œ๋กœ ๋‹ค๋ฅธ Switch ๊ฐ€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‘ Switch ๋ฅผ ์ด์–ด์ฃผ๋Š” Router ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 192.168.2.0/24 ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” Switch ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  Router ์˜ 192.168.1.1 ์ฃผ์†Œ๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด ๋œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. default ๋˜๋Š” 0.0.0.0 ๋Š” ์ด์™ธ ๋ชจ๋“  ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ์ฆ‰, ์ธํ„ฐ๋„ท์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  192.168.2.1 ์ฃผ์†Œ๋ฅผ ๊ฑฐ์ณ๊ฐ€์•ผ ๋œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

cat /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_forward

Router ๊ฐ€ 192.168.1.1 ์™€ 192.168.2.1 ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ eth0 ๊ณผ eth1 ์ด ํ• ๋‹น๋๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋กœ ๋‹ค๋ฅธ Network Interface ๊ฐ„์— Packet ์ „๋‹ฌ์€ ๋ง‰ํ˜€์žˆ๋‹ค. ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ip_forward ๊ฐ’์„ 1 ๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด Router ๋‚ด๋ถ€์—์„œ Packet ๋ฅผ Network Interface ๊ฐ„์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์žฌ๋ถ€ํŒ…ํ•  ๊ฒฝ์šฐ ์„ค์ •๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ๋•Œ๋ฌธ์— /etc/sysctl.conf ์—์„œ net.ipv4.ip_forward ๊ฐ’์„ 1 ๋กœ ์„ค์ •ํ•ด์ฃผ๋ฉด ์˜๊ตฌ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

DNS


cat /etc/hosts

IP ์ฃผ์†Œ ๋Œ€์‹  Name ์œผ๋กœ Host ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์œ„ ๊ฒฝ๋กœ์— IP ์ฃผ์†Œ์— ํ•ด๋‹นํ•˜๋Š” Host Name ์„ ์ง€์ •ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์‹  ๋ชจ๋“  Host ์— ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง„๋‹ค. ๋•Œ๋ฌธ์— DNS ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•ด ํ•˜๋‚˜์˜ ๊ด€๋ฆฌํฌ์ธํŠธ๋กœ ํ†ตํ•ฉํ•œ๋‹ค.

cat /etc/resolv.conf

DNS ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋Š” ์œ„ ๊ฒฝ๋กœ์— ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 8.8.8.8 ์€ Google ์ด ์ œ๊ณตํ•˜๋Š” DNS ์„œ๋ฒ„๋‹ค.

cat /etc/nsswitch.conf

...
hosts: files dns
...

๊ธฐ๋ณธ์ ์œผ๋กœ /etc/hosts ์—์„œ ์ฃผ์†Œ๋ฅผ ์ฐพ๊ณ  ์—†์œผ๋ฉด /etc/resolv.conf ์—์„œ ์ฃผ์†Œ๋ฅผ ์ฐพ๋Š”๋ฐ, ์œ„ ์„ค์ •ํŒŒ์ผ์—์„œ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

CoreDNS


wget https://github.com/coredns/coredns/releases/download/v1.7.0/coredns_1.7.0_linux_amd64.tgz

cat > /etc/hosts
192.168.1.10    web
192.168.1.11    db
192.168.1.15    web-1
192.168.1.16    db-1
192.168.1.21    web-2
192.168.1.22    db-2

DNS ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋ฉด DNS ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ค์น˜๋œ Host ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. CoreDNS ๋ผ๋Š” DNS ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜์—ฌ DNS ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

Network Namespaces


ip netns add red
ip netns add blue

Container ๊ฐ€ namespace ๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋“ฏ Network ์—ญ์‹œ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ๋ช…๋ น์–ด๋Š” red ์™€ blue ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ Network Namespace ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

ip netns exec red ip link
ip -n red link

ip link ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Network Interface ๋ฅผ ํ™•์ธํ–ˆ๋“ฏ Network Namespace ์˜ Network Interface ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„  ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ip -n red arp
ip -n red route

arp ์™€ route ์—ญ์‹œ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Virtual Cable

ip link add veth-red type veth peer name veth-blue

์œ„ ๋ช…๋ น์–ด๋กœ ๊ฐ€์ƒ ์ผ€์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ ,

ip link set veth-red netns red
ip link set veth-blue netns blue

ip -n red addr add 192.168.15.1/24 dev veth-red
ip -n blue addr add 192.168.15.2/24 dev veth-blue

ip -n red link set veth-red up
ip -n blue link set veth-blue up

์œ„ ๋ช…๋ น์–ด๋กœ Network Namespace ๋ผ๋ฆฌ ์—ฐ๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

Linux Bridge

ip link add v-net-0 type bridge
ip link set dev v-net-0 up

Network Namespace ๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ Switch ์—ญํ• ์„ ํ•˜๋Š” Linux Bridge ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ip link add veth-red type veth peer name veth-red-br
ip link set veth-red netns red
ip link set veth-red-br master v-net-0

ip -n red addr add 192.168.15.1 dev veth-red
ip -n red link set veth-red up

์ดํ›„ Network Namespace ์™€ Bridge ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ Virtual Cable ์„ ์ƒ์„ฑ ๋ฐ ํ• ๋‹นํ•ด์ฃผ๊ณ , IP ์ฃผ์†Œ ๋„ ํ• ๋‹นํ•ด ์ค€ ๋’ค ํ™œ์„ฑํ™” ํ•ด์ฃผ์ž.

ip addr add 192.168.15.5/24 dev v-net-0

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด Host ์™€ Bridge ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์ž.

ip netns exec blue ip route add 192.168.1.0/24 via 192.168.15.5

Namespace ๊ฐ€ ์™ธ๋ถ€ Host ์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์™ธ๋ถ€์— 192.168.1.0/24 ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” Switch ์™€ routing ์„ค์ •์„ ํ•ด์ค˜์•ผํ•œ๋‹ค. ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 192.168.15.5 ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋Š” v-net-0 ์„ ํ†ตํ•ด ํ˜ธ์ŠคํŠธ์˜ eth0 ๋ฅผ ๊ฑฐ์ณ ์™ธ๋ถ€๋กœ ํ–ฅํ•˜๊ฒŒ ๋œ๋‹ค.

iptables -t nat -A PREROUTING --dport 80 --to-destination 192.168.15.2:80 -j DNAT

์™ธ๋ถ€ Host ๊ฐ€ ๋‹ค๋ฅธ Host ์˜ Network Namespace ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  ์œ„ ๋ช…๋ น์–ด๋กœ ํฌํŠธํฌ์›Œ๋”ฉ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

Docker Networking


ip link

08. Docker Networking ์—์„œ ๋ฐฐ์šด bridge ๊ฐ€ ๋ฐ”๋กœ Linux Bridge ๋‹ค. ip link ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด docker0 ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ Network Interface ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ip netns

Docker Container ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Network Namespace ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

iptables -nvL -t nat

ํฌํŠธํฌ์›Œ๋”ฉ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€. Docker Container ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ iptable ์„ค์ •๊นŒ์ง€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

์ฆ‰, Docker Container ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋„คํŠธ์›Œํฌ ์ธก๋ฉด์—์„  ๋‚ด๋ถ€์ ์œผ๋ก  ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ์ž‘์—…๋“ค์ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋˜ ๊ฒƒ์ด๋‹คโ€ฆ

CNI


ls /opt/cni/bin/

CNI ๋ฅผ ๊ธฐ์ค€์œผ๋กœ Networking ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์—ฌ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ฑ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Docker ์˜ ๊ฒฝ์šฐ ๋”ฐ๋กœ CNM ์ด๋ผ๋Š” ๊ธฐ์ค€์œผ๋กœ CNI ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— K8s ๋Š” Docker Container ๋ฅผ None ์œผ๋กœ ์ƒ์„ฑํ•œ ๋’ค ์ง์ ‘ Bridge ์— ํ• ๋‹นํ•˜๋Š” ์ž‘์—…์„ ๋”ฐ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Cluster Networking


K8s ๋„ ๊ฒฐ๊ตญ Master ์™€ Worker Node ๊ฐ„์˜ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ์œผ๋กœ ๊ฐ Component ๋งˆ๋‹ค ์œ„์™€ ๊ฐ™์€ Port ๋“ค์„ ์—ด์–ด์ค˜์•ผ ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

Pod Networking


์„œ๋กœ ๋‹ค๋ฅธ Node ์— ์œ„์น˜ํ•œ Pod ๊ฐ„ ํ†ต์‹ ์„ ํ™œ์„ฑํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

ip link add v-net-0 type bridge
ip link set dev v-net-0 up
ip addr add 10.244.1.1/24 dev v-net-0

๋จผ์ € ๊ฐ Node ๋งˆ๋‹ค Bridge ๋ฅผ ์ƒ์„ฑํ•ด์ค€ ๋’ค,

ip route add 10.244.2.2 via 192.168.1.12

๋‹ค๋ฅธ Node ์˜ Bridge ๋กœ ํ–ฅํ•˜๋Š” Route ๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค. ํ˜น์€ ๋ผ์šฐํ„ฐ๋ฅผ ํ™œ์šฉํ•ด Routing ์„ค์ •์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ๋‹ค.

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

# net-script.sh
ADD)
  # Create veth pair
  # Attach veth pair
  # Assign IP Address
  # Bring Up Interface
DEL)
  # Delete veth pair

์œ„์™€ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•ด Container ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰ํ•ด์ฃผ๋ฉด Pod ๊ฐ„ ๋„คํŠธ์›Œํ‚น์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ๊ธฐ์ค€์„ CNI ๊ฐ€ ์ œ๊ณตํ•˜๊ณ  ๋‹ค์–‘ํ•œ CNI Plugin ๋“ค์ด ๊ตฌํ˜„๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

CNI in K8s


K8s ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Pod ๊ฐ„์˜ ํ†ต์‹ ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์— Pod ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋ ค๋ฉด CNI Plugin ์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์„ค์น˜ํ•ด ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

ExecStart=/usr/local/bin/kubelet \
  ...
  --network-plugin=cni \
  --cni-bin-dir=/opt/cni/bin \
  --cni-conf-dir=/etc/cni/net.d \
  ...

CNI ๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„  kubelet ์„ ์‹คํ–‰ํ•  ๋•Œ ์˜ต์…˜์œผ๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด๋œ๋‹ค.

ls /opt/cni/bin

์œ„ ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  CNI Plugin ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ls /etc/cni/net.d

์œ„ ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ์„ ๋ฐ”ํƒ•์œผ๋กœ CNI Plugin ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cbr0",
  "cniVersion": "0.3.1",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

CNI weave


kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

Weave ๋Š” CNI Plugin ์ค‘ ํ•˜๋‚˜์ธ ์†”๋ฃจ์…˜์œผ๋กœ ์œ„์™€ ๊ฐ™์ด Pod ๋กœ ์ƒ์„ฑํ•ด์„œ ์šด์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

IP Address Management - Weave


cat /etc/cni/net.d/net-script.conflist
{
  "cniVersion": "0.2.0",
  "name": "mynet",
  "type": "net-script",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
      "type": "host-local",
      "subnet": "10.244.0.0/16",
      "routes": [
          {
              "dst": "0.0.0.0/0"
          }
	  ]
  }
}

Pod ๊ฐ„ ํ• ๋‹น๋˜๋Š” IP ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด CNI ์—์„  DHCP ์™€ host-local ์ด๋ผ๋Š” ๋นŒํŠธ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•œ๋‹ค. ํ•ด๋‹น ์„ค์ • ์—ญ์‹œ ์œ„ ํŒŒ์ผ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Service Networking


K8s ์—์„  Pod ๋ผ๋ฆฌ ํ†ต์‹ ํ•˜๋Š” ๋Œ€์‹  Service Object ๋ฅผ ํ†ตํ•ด Cluster ๋‚ด Pod ๊ฐ„์˜ ํ†ต์‹  ๋˜๋Š” ์™ธ๋ถ€์™€์˜ ํ†ต์‹ ์„ ์ œ๊ณตํ•œ๋‹ค. Pod ์ด namespace ๋“ฑ์„ ํ• ๋‹น ๋ฐ›์•„ ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Service ๋Š” kube-proxy ์— ์˜ํ•ดCluster ์— ๊ฑธ์ณ Forwarding Rule ์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ๋˜๋Š” Virtual Object ๋‹ค.

kube-proxy --proxy-mode [ userspace | iptables | ipvs ]

kube-proxy ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ proxy-mode ์˜ต์…˜์„ ํ†ตํ•ด Forwarding Rule ์„ ๊ด€๋ฆฌํ•  ๋ฒ„์ „์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

kube-api-server --service-cluster-ip-range ipNet (Default: 10.0.0.0/24)

kube-api-server ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ Service ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” IP range ๋ฅผ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. Service IP range ์™€ Pod IP range ๋Š” ๊ฒน์น˜๋ฉด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ๋„ ์ฐธ๊ณ ํ•˜์ž.

iptables -L -t nat | grep db-service

iptables ๋ชจ๋“œ๋กœ ์ƒ์„ฑํ•œ Service ์˜ Forwarding Rule ์„ ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

DNS in K8s


<POD-IP-ADDRESS>.<namespace-name>.pod.cluster.local
<service-name>.<namespace-name>.svc.cluster.local

K8s ์—์„œ Pod ๊ณผ Service ๋Š” ์œ„ ๊ทœ์น™์— ๋”ฐ๋ผ Domain Name ์„ ํ• ๋‹น ๋ฐ›๋Š”๋‹ค.

CoreDNS in K8s


Pod ๊ณผ Service ๋“ค์ด ์„œ๋กœ Domain Name ์œผ๋กœ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด DNS ๋ฅผ ํ™œ์šฉํ•˜๋Š”๋ฐ, K8s ์—์„  CoreDNS ์†”๋ฃจ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Deployment ํ˜•ํƒœ๋กœ ๋ฐฐํฌ๋˜๋ฉฐ Service ์—ญ์‹œ ์ œ๊ณตํ•ด Pod ๊ณผ Service ๋“ค์ด kube-dns Service ๋ฅผ ํ–ฅํ•ด nslookup ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get configmap -n kube-system
kubectl describe cm -n kube-system

CoreDNS ์˜ ์„ค์ •์€ ConfigMap ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.

cat /var/lib/kubelet/config.yaml | grep -A2  clusterDNS
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local

CoreDNS ๋Š” kubelet ์œผ๋กœ ๋ถ€ํ„ฐ ๋ฐฐํฌ๋˜๊ธฐ์— kubelet ์˜ ์„ค์ •ํŒŒ์ผ์—์„œ CoreDNS ์˜ IP ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl run -it --rm --restart=Never test-pod --image=busybox -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
pod "test-pod" deleted

Pod ๋‚ด๋ถ€์— ์žˆ๋Š” resolv.conf ํŒŒ์ผ์—์„œ CoreDNS IP ๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Ingress


Ingress ๋Š” ๋‹ค์–‘ํ•œ Service ๋กœ์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ๋ถ„์‚ฐํ•˜๋Š” ์ผ์ข…์˜ Load Balancer ์—ญํ• ์„ ํ•œ๋‹ค. Ingress ๋Š” Ingress Controller ์™€ Ingress Resoucres ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

Ingress Controller

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ingress-controller
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx-ingress
  template:
    metadata:
      labels:
        name: nginx-ingress
    spec:
      serviceAccountName: ingress-serviceaccount
      containers:
      - name: nginx-ingress-controller
        image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.21.0
        args:
        - /nginx-ingress-controller
        - --configmap=$(POD_NAMESPACE)/nginx-configuration
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        ports:
          - name: http
            containerPort: 80
          - name: https
            containerPort: 443
apiVersion: v1
kind: Service
metadata:
  name: ingress
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  - port: 443
    targetPort: 443
    protocol: TCP
    name: https
  selector:
    name: nginx-ingress

GCP Load Balancer, Nginx, Istio ๋“ฑ์ด ์ด์— ํ•ด๋‹นํ•˜๋ฉฐ Deployment, Service, ConfigMap, Auth ๋“ฑ ๋‹ค์–‘ํ•œ K8s Object ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

Ingress Resource

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-wear-watch
spec:
  rules:
  - host: wear.my-online-store.com
    http:
      paths:
      - backend:
          serviceName: wear-service
          servicePort: 80
  - host: watch.my-online-store.com
    http:
      paths:
      - backend:
          serviceName: watch-service
          servicePort: 80

ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋ฃฐ์„ ์„ค์ •ํ•˜๋Š” ๊ณณ์œผ๋กœ Ingress Object ๊ฐ€ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋œ๋‹ค.

Gateway API


apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: example-class
spec:
  controllerName: example.com/gateway-controller
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-class
  listeners:
  - name: http
    protocol: HTTP
    port: 80
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: example-httproute
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "www.example.com"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /login
    backendRefs:
    - name: example-svc
      port: 8080

Ingress ์˜ ๊ฒฝ์šฐ Ingress Controller ๊ฐ€ Nginx ์ธ์ง€, Traefik ์ธ์ง€์— ๋”ฐ๋ผ annotation ์—์„œ ํ•ด์ฃผ๋Š” ์„ค์ •์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. K8s ์—์„  ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Gateway API ๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ–ˆ๊ณ , ์ œ๊ณต๋˜๋Š” GatewayClass, Gateway, HTTPRoute ๋“ฑ ์ƒˆ๋กœ์šด Object ๋ฅผ ํ†ตํ•ด Controller ์— ์ข…์†๋˜์ง€ ์•Š๋Š” ์„ค์ •์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

References