개요
k8s의 network는 어떻게 구현이 되어있는지 알아보겠습니다.
k8s의 network를 무엇을 구현하였는가?
실제 물리적인 network 구성을 Host 내부에 구현한 것이 k8s의 network의 기본입니다.
그리고 k8s에서 Host 간의 network 구성은 CNI plugin을 통하여 확장할 수 있습니다.
아래 그림 2개는 각각 실제 무리적인 network의 구성과 k8s의 Host 간의 network 구성을 표현한 것입니다.
물리적인 Network 구성도
K8S Network 구성도
물리적인 network 구성도의 초록색 box 부분이 Host로 들어와서 구현된 것이 k8s의 network 구현입니다.
위 그림에서 Host는 Container로 대체가 되어서 구성이 되고 gateway는 host의 eth0으로 대체가 됩니다.
k8s에서 단일 Host내부에서 network 구현 원리
container 구현
docker, cri-o, containerd를 사용하여 container를 구현합니다.
network namespace의 구현
network namespace는 container에 할당되는 독립적인 network namespace입니다.
아래 명령을 사용하여 독립적인 network namespace를 만듭니다.
#ip netns add red
virtual NIC의 구현
아래의 명령어를 사용하여 network namespace에 할당할 nic를 만듭니다.
ip link add veth-red type veth peer name veth-blue
container 간 1:1 통신 network 구현
network 공간 만들기
network namespace 생성 명령
#ip netns add red
#ip netns add blue
network namespace에 할당된 nic 확인
#ip netns exec red ip link
또는
#ip -n red link
network namespace 특징
아래 그림은 host에 생성한 network namespace입니다.
namespace는 별도의 routing table과 arp table 갖습니다.
veth(virtual Ethernet) 구현
container에 할당할 network interface입니다.
container 간 network 통신을 위해서는 virtual nic pair를 만들어서 통신하고 싶은 network namespace에 할당을 하면 됩니다.
virtual nic pair 만들기
이 명령어는 양쪽에 virtual nic가 연결된 LAN Cable을 만드는 작업이라고 보시면 됩니다.
#ip link add veth-red type veth peer name veth-blue
virtual nic를 network namespace 할당
ip link add 명령어로 생성한 각각의 nic를 network namespace에 할당을 합니다.
#ip link set veth-red netns red
#ip link set veth-blue netns blue
virtual nic에 ip할당
#ip -n red addr add 192.168.15.2/24 dev veth-red
#ip -n blue addr add 192.168.15.3/24 dev veth-blue
virtual nic up
#ip -n red link set veth-red up
#ip -n blue link set veth-blue up
network namespace 간 ping test
#ip netns exec red ping 192.168.15.3
#ip netns exec blue ping 192.168.15.2
최종 그림
network namespace의 vnic 삭제
아래 명령을 사용하여 pair로 생성된 veth가 자동으로 함께 삭제가 됩니다.
#ip -n red link delete veth-red
vSwitch를 통한 container 통신 network구현
virtual switch(vSwitch)의 구현
지금까지는 container 간에 direct로 통신하는 것을 구현하였다면 이번에는 virtual switch를 구현하여 통신하는 방법을 알아보겠습니다. switch를 통해 통신하는 이유는 container가 외부 통신도해야 하기 때문입니다.
virtual switch의 종류
- Open vSwitch: Open vSwitch는 오픈 소스 가상 스위치로서 Linux 커널에서 동작하며, 가상 머신과 물리적 네트워크 간의 트래픽을 관리합니다. Open vSwitch는 VLAN, VXLAN, GRE 등 다양한 네트워크 가상화 기술을 지원하며, 강력한 관리 기능을 제공합니다.
- Linux Bridge: Linux Bridge는 Linux 커널에 기본적으로 내장된 네트워크 브리지 기능입니다. 이를 사용하여 가상 머신과 호스트 시스템 간의 네트워크 트래픽을 전달하고 관리할 수 있습니다. Linux Bridge는 단순한 네트워크 브리지로서 가상 스위치의 일부 기능을 제공하지만, 간단하고 경량화된 구성을 제공합니다.
우리는 여기서 Linux Bridge를 사용하여 virtual swtich를 구현하겠습니다.
virtual switch 생성
#ip link add v-net-0 type bridge
virtual switch up
#ip link set dev v-net-0 up
network 공간 만들기
순차적으로 따라 했다면 이미 만들어져 있습니다. 다시 만들고 싶다면 삭제 후 다시 만들면 됩니다.
network namespace 삭제 방법은 아래 명령어를 사용하면 됩니다.
#ip netns delete red
#ip netns delete blue
network namespace 생성 명령
#ip netns add red
#ip netns add blue
새로운 veth 생성
#ip link add veth-red type veth peer name veth-red-br
#ip link add veth-blue type veth peer name veth-blue-br
namespace에 veth 할당
#ip link set veth-red netns red
#ip link set veth-blue netns blue
virtual switch에 veth 할당
#ip link set veth-red-br master v-net-0
#ip link set veth-blue-br master v-net-0
virtual nic에 ip할당
#ip -n red addr add 192.168.15.2/24 dev veth-red
#ip -n blue addr add 192.168.15.3/24 dev veth-blue
virtual nic up
#ip -n red link set veth-red up
#ip link set veth-red-br up
#ip -n blue link set veth-blue up
#ip link set veth-blue-br up
virtual switch에 ip 할당(필수)
이걸 해주어야 해당 ip 대역으로 host에서 ping을 보낼 수가 있습니다.
이유 : 브리지 인터페이스에 IP 주소를 할당하면 브리지를 가상 스위치로 사용할 수 있습니다. IP 주소를 할당하면 브리지 인터페이스가 라우팅 기능을 수행하고 호스트 시스템과 가상 머신 간에 네트워크 통신이 가능해집니다. 이를 통해 가상 머신이 외부 네트워크와 통신하거나 인터넷에 액세스 할 수 있게 됩니다.
원리: routing table에 해당 대역이 추가됩니다.
#ip addr add 192.168.15.1/24 dev v-net-0
최종 그림
network namespace 간 ping test
#ip netns exec red ping 192.168.15.3
#ip netns exec blue ping 192.168.15.2
vSwitch를 통한 container의 외부 Host와 통신
container가 Host외부에 존재하는 다른 Host와 통신하려면 어떻게 해야 하는가?
container routting table 추가
container에서 통신할 외부 대역을 routing table에 추가해주어야 합니다.
그래야 패킷을 어디로 보낼지 알기 때문입니다.
추가
#ip netns exec red ip route add 192.168.0.0/24 via 192.168.15.1
#ip netns exec blue ip route add 192.168.0.0/24 via 192.168.15.1
확인
#ip netns exec red ip route
#ip netns exec blue ip route
host의 iptable에 MASQUERADE 설정 추가
추가
$sudo iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
* 추가 설명 : "Masquerade"는 외부 네트워크에서는 내부 네트워크의 컴퓨터들이 모두 하나의 공용 IP 주소로 보이게 해주는 설정입니다.
확인
$sudo iptables -t nat -L POSTROUTING -v -n
최종 그림
ping test
외부 호스트가 192.168.0.26으로 되어있어서 192.168.0.26으로 테스트합니다.
vSwitch를 통한 container의 internet 통신
default gw를 virtual switch ip로 설정 및 ip table에 masquerade를 추가하면 됩니다
default gw설정
#ip netns exec red ip route add default via 192.168.15.1
#ip netns exec blue ip route add default via 192.168.15.1
host의 iptable에 MASQUERADE 설정 추가
#iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
ping test
#ip netns exec blue ping 8.8.8.8
외부에서 container로 접속하는 방법
iptable에서 특정 port로 들어온 패킷을 container의 특정 port로 전달하게 설정해 주어야 합니다.
#iptables -t nat -A PREROUTING --dport 80 --to-destination 192.168.15.2:80 -j DNAT
정리
k8s의 container의 인터넷 통신을 위환 network 구현 절차
1. linux의 network namespacer기술을 이용하여 network namespace 생성
2. ip link를 사용하여 virtual switch를 생성
3. ip link를 사용하여 virtual nic를 생성
4. ip link를 사용하여 virtual nic를 virtual switch와 network namespace에 할당
5. network namespace에서 routing table에 외부로 나갈 수 있게 routing 추가
6. host의 iptable에서 network namespace에 할당된 virtual nic의 ip대역에 대하여 MASQUERADE를 설정
Next Post
'Cloud > k8s-CKA' 카테고리의 다른 글
[CKA] 26. Domain과 DNS Sever기초 (0) | 2023.07.15 |
---|---|
[CKA] 25. Docker Network 구조 (0) | 2023.07.10 |
[CKA] 23. k8s cluster 관리 (0) | 2023.05.07 |
[CKA] 22. k8s cluster backup 방법 (0) | 2023.05.07 |
[CKA] 21. k8s cluster upgrade (0) | 2023.05.05 |