Cloud/k8s-CKA

[CKA] 24. k8s network를 위한 기초

jinkwon.kim 2023. 6. 29. 23:37
728x90
반응형

개요

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의 종류

  1. Open vSwitch: Open vSwitch는 오픈 소스 가상 스위치로서 Linux 커널에서 동작하며, 가상 머신과 물리적 네트워크 간의 트래픽을 관리합니다. Open vSwitch는 VLAN, VXLAN, GRE 등 다양한 네트워크 가상화 기술을 지원하며, 강력한 관리 기능을 제공합니다.
  2. 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 설정 추가

[linux] netfilter 소개 및 동작 방식

추가

$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

[CKA] 25. Docker Network 구조

728x90
반응형

'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