Cloud/k8s-CKA

[CKA] 25. Docker Network 구조

jinkwon.kim 2023. 7. 10. 05:59
728x90
반응형

개요

k8s의 container runtime 중 하나인 docker의 network 구성 방식을 알아보겠습니다.

Docker의 network 종류

None  Network

network 통신이 불가능한 container를 생성할 때 사용합니다. 

외부 통신 및 container 간 통신이 불가능한 구조입니다. 

명령어

$sudo docker run --network none ngnix

구조

Host  Network

Docker의 'host' 네트워크는 container가 host의 network statck을 직접 사용하도록 합니다.

이는 container가 host와 동일한 network namepsace를 공유하게 되므로, network 격리가 사실상 없어집니다.

 

단점으로는 container가 host의 network port를 사용함으로 동일한 port를 사용하는 다른 container를 실행할 수 없습니다.

명령

$sudo docker run --network host ngnix

구조

Bridge Network

docker가 기본적으로 지원하는 network입니다. 

host에 bridge를 만들어서 모든 container들이 해당 bridge를 통하여 통신하게 하는 network입니다. 

그리고 port forwaridng을 사용하여 외부 통신을 가능하게 해 줍니다.

명령

$sudo docker run nginx

구조

설명

docker의 bridge network는 이전 post에서 공부한 ip link의 bridge를 사용하여 vswith를 구현하고 ip link의 veth를 사용하여 interface를 생성합니다.

docker의 container network 구성

docker container의 network는 vSwitch(bridge)와 network namespace, veth를 사용하여 구성이 됩니다. 

지금부터 container를 하나 생성 후 vSwtich, network namespace, veth를 찾는 방법을 알아보겠습니다.

container 생성

$sudo docker run -itd --rm --name busybox  busybox

 

이렇게 container를 만들게 되면  docker는 container를 위한 network namespace를 생성하고 docker0와 연결된 veth를 생성합니다. 아래 그림처럼 network가 구성되게 됩니다. 

vSwitch 확인

docker를 설치하게 되면 기본적으로 docker0라는 이름으로 vSwitch가 생성이 됩니다.

위그림에서는 BRIDE가 vSwitch입니다.

 

아래 명령을 통해서 vswitch를 확인합니다.

 

$sudo ip link

결론적으로 docker가 생성한 container들은 이 docker0를 통하여 외부와 통신을 하게 됩니다.

network namespace 확인

우리가 생성한 container에 할당된 network namespace를 찾아보겠습니다. 

container의 network namespace를 찾으려면 3단계가 필요합니다.

 

1. container pid 찾기

2. container의 network namespace의 inode 찾기

container pid 찾기

docker 명령을 사용해서 찾습니다. 

 

$sudo docker inspect -f '{{.State.Pid}}' container_name_or_id

Ex) sudo docker inspect -f '{{.State.Pid}}' busybox

namespace 찾기

Docker와 ip netns 명령은 네임스페이스를 추적하는 방식이 다르기 때문에, ip netns list에서 Docker container의 network namespace를  볼 수 없습니다. 그래서 "ip netns list" 명령으로도 못 찾습니다.

 

상세 이유

더보기

Docker와 ip netns 명령은 네임스페이스를 추적하는 방식이 다르기 때문에, ip netns list에서 Docker 컨테이너의 네트워크 네임스페이스를 볼 수 없습니다.

ip netns 명령은 /var/run/netns에 있는 네임스페이스를 보여줍니다. 이 위치에 있는 각 파일은 네임스페이스를 나타내는 심볼릭 링크입니다. ip netns add <name> 명령을 사용해 만들어진 네임스페이스만이 이 위치에 표시되며, 네임스페이스를 만드는 다른 방법으로 생성된 네임스페이스는 표시되지 않습니다.

반면에 Docker는 네임스페이스를 직접 생성하고 관리합니다. Docker 컨테이너의 네트워크 네임스페이스는 각 컨테이너의 /proc/[pid]/ns/net 위치에 있습니다. 여기서 [pid]는 컨테이너의 주 프로세스 ID입니다.

따라서 Docker 컨테이너의 네트워크 네임스페이스를 ip netns 명령으로 볼 수 있게 하려면, 해당 네임스페이스에 대한 심볼릭 링크를 /var/run/netns에 수동으로 만들어야 합니다. 이렇게 하면 ip netns 도구를 사용해 Docker 컨테이너의 네트워크 네임스페이스를 조작할 수 있습니다. 하지만 이 방법은 일반적으로 권장되지 않으며, 주로 디버깅이나 특수한 상황에서만 사용됩니다.

docker의 network namespace는 아래의 경로에 link 되어있습니다. 

 

$sudo ls -alh /proc/<pid>/ns/net

lrwxrwxrwx 1 root root 0  7월 12 04:49 /proc/5664/ns/net -> 'net:[4026532957]'

 

그럼 해당 network namespace를 mount 시켜서 한번 봐보겠습니다. 

 

$touch /var/run/netns/busybox

$sudo mount --bind /proc/30198/ns/net /var/run/netns/busybox

$ip netns ls

*추가 

mount를 unmout 하시려면 아래 명령어를 사용하면 됩니다.

$sudo umount /var/run/netns/busybox

veth 찾기

2가지 방식으로 찾을 수 있습니다. 

namespace를 이용한 버전

위 network namespace를 mount 시키는 과정을 하였으면 아래 명령만 실행하면 아래 명령어를 통해서 container에 할당된 veth를 바로 확인이 가능합니다.

 

$sudo ip netns exec busybox ip link

pid를 이용한 버전 

$sudo nsenter --target <pid> --net ip link

Ex)sudo nsenter --target 30198 --net ip link

docker의 container 외부 통신

docker netowk는 이전 post에서 알아본 구조 대로 통신을 하는지 확인해 보겠습니다. 

우선 외부로 8.8.8.8로 ping이 되는지 확인해 보겠습니다. 

 

$sudo ip netns exec blue ping 8.8.8.8

아주 잘됩니다. 그러면 다음으로 routing table을 확인해 보겠습니다 

 

$sudo ip netns exec busybox route 

defatul gateway가 172.21.0.1입니다. 이게 어디인지 확인해 보겠습니다. 


$sudo ifconfig

docker0의 ip입니다. 

 

이번에는 MASQUERADE 설정도 확인해 보겠습니다. 

 

$sudo iptables -t nat -L POSTROUTING -v -n

설정이 아주 잘되어있습니다. 

정리

docker의 network 종류에는 3가지가 있다. 

none : 네트워크 통신 없음

host : Host에 Application을 올리는 것처럼 사용

bridge : Host에 가상 네트워크를 구성하여 사용

그리고 docker의 network는 vSwtich, network namespace, veth를 사용하여 구성이 되고, MASQUERADE를 통하여 외부와 통신을 한다.

Next Post

[CKA] 26. Domain과 DNS Sever기초

 

728x90
반응형

'Cloud > k8s-CKA' 카테고리의 다른 글

[CKA] 27. CNI란?  (0) 2023.07.16
[CKA] 26. Domain과 DNS Sever기초  (0) 2023.07.15
[CKA] 24. k8s network를 위한 기초  (0) 2023.06.29
[CKA] 23. k8s cluster 관리  (0) 2023.05.07
[CKA] 22. k8s cluster backup 방법  (0) 2023.05.07