티스토리 뷰

Docker 에서 제공되는 macvlan은 리눅스의 SubInterface와 가상화에서 제공되는 Guest OS VLAN Tagging을 조합하여 사용하는 방식을 사용하여 구성한다.
아래와 같은 4단계의 구성을 진행하여 macvlan을 구성할 수 있다.
프로덕션에서 절차만 표준화되고 잘 사용된다면 도커 네트워크를 잘 사용할 수 있는 방법 가운데 하나이다.

1.가상화 일 경우 - VST (Virtual Switch Tagging) 구성
2.가상화 NIC Promiscuous mode 설정
3. Linux Subinterface설정
4. Docker macvlan설정
기타. 도커가 설치되어 있는 서버와 연결되는 네트워크 장비에서 Trunk VLAN 및 기타 네트워크 설정

Docker MacVlan 구성은 아래와 같다.
아래 구성은 VMware EXS 가상화를 기반으로 설계 된 아키텍쳐이다.
네트워크 구성에서 Trunk Allow Vlan만 설정되어 있다면, 설정에는 큰 어려움이 없다.





1.가상화 일 경우 - VST (Virtual Switch Tagging) 구성

먼저 가상화 환경에서 OS의 VLAN Tagging을 허용하기 위해 , VMware ESX vSwtich에서 VGT(Vlan Guest Tagging)을 설정한다.


2.리눅스 SubInterface 하단의 Promiscuous Mode 설정

리눅스에서는 하나의 NIC에서 하나의 MAC을 학습하도록 구성되어 있다.
NIC에서 Sub Interface를 만들수는 있지만 서브 인터페이스 하단에 2개의 컨테이너 MAC을 학습해야 하므로, ARP 학습에 이슈가 있다.
이러한 이슈를 해결하기 위해 Promiscuous Mode를 리눅스에서 설정하면, 서브 인터페이스 하단의 MAC을 다중으로 ARP Table에서 학습 할 수 있다.
아래 내용은 Promiscuous Mode를 설정하지 않았을때, ARP Table을 CentOS VM에서 확인한 내용이다.

[root@cent151 ~]# arp -a
zabbix.cisko-dc.com (10.72.78.249) at 00:50:56:8f:49:4e [ether] on ens192
ns2.cisko-dc.com (10.72.78.253) at 00:50:56:8f:b4:8c [ether] on ens192
centos152.cisko-dc.com (10.72.78.152) at 00:50:56:07:81:52 [ether] on ens192
gateway (172.16.151.1) at 00:22:bd:f8:19:ff [ether] on ens224.151
? (10.72.78.254) at 00:d0:02:4d:18:00 [ether] on ens192
78gw.cisko-dc.com (10.72.78.129) at 58:f3:9c:a3:de:b1 [ether] on ens192
gateway (172.16.152.1) at 00:22:bd:f8:19:ff [ether] on ens224.152
? (172.16.151.2) at <incomplete> on ens224.151

Interface Promiscuous mode 설정

CentOS7 에서 부터 새롭게 Promiscuous 모드 설정 방법 변경이 되었다. 아래와 같이 새로운 파일을 생성하고, Promiscuous Mode를 설정한다.

새로운 파일 생성
# vi /etc/systemd/system/promisc.service

Single Interface

# cat /etc/systemd/system/promisc.service
[Unit]
Description=Bring up an interface in promiscuous mode during boot
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev ens224 promisc on
TimeoutStartSec=0
RemainAfterExit=yes

[Install]
WantedBy=default.target

Multi Interface

# cat /etc/systemd/system/promisc.service
[Unit]
Description=Bring up an interface in promiscuous mode during boot
After=network.target


[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev ens192 promisc on
ExecStart=/usr/sbin/ip link set dev ens224 promisc on
TimeoutStartSec=0
RemainAfterExit=yes


[Install]
WantedBy=default.target

Daemon Reload

# systemctl daemon-reload

# ip a
3: ens224: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:8f:df:e4 brd ff:ff:ff:ff:ff:ff


3. Linux Subinterface설정

Linux VLAN Tagging을 위해서 , Linux Subinterface를 구성한다.

root@cent151 ~]# more /etc/sysconfig/network-scripts/ifcfg-ens224.151
DEVICE=ens224.151
VLAN=yes
TYPE=Vlan
PHYSDEV=ens224
VLAN_ID=151
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens224.151
ONBOOT=yes
DNS1=10.72.86.7
NM_CONTROLLED=yes
IPADDR=172.16.151.11
NETMASK=255.255.255.0
GATEWAY=172.16.151.1

[root@cent151 ~]# more /etc/sysconfig/network-scripts/ifcfg-ens224.152
DEVICE=ens224.152
VLAN=yes
TYPE=Vlan
PHYSDEV=ens224
VLAN_ID=152
BOOTPROTO=static
IPADDR=172.16.152.11
NETMASK=255.255.255.0
GATEWAY=172.16.152.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens224.152
ONBOOT=yes
DNS1=10.72.86.7
NM_CONTROLLED=yes


4. Docker macvlan설정

이제 Linux SubInterface에 Docker macvlan을 연결하면 완료가 된다.

[root@cent151 ~]# docker network create -d macvlan --subnet 172.16.151.0/24 --gateway 172.16.151.1 -o parent=ens224.151 macvlan151
513d95b30cc2d0d284aaf6ab76ad2cc42ff0393f5bd197333fe35a9202ce0247
[root@cent151 ~]# docker network create -d macvlan --subnet 172.16.152.0/24 --gateway 172.16.152.1 -o parent=ens224.152 macvlan152
348d84ca928d79a36428dd2210fcec68f0211effd3e3ea9a1a31f5b7824c3309

# docker 네트워크를 생성하고, 생성된 서브 인터페이스에 할당한다.
# 신규 macvlan을 선언한다.

[root@cent151 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cf32745571a6        bridge              bridge              local
c25c81b6be34        host                host                local
513d95b30cc2        macvlan151          macvlan             local
348d84ca928d        macvlan152          macvlan             local
3b48379378aa        none                null                loca

# 2개의 새로운 macvlan이 생성된 것을 확인할 수 있다.


docker network connect macvlan151 alnx01
docker network connect macvlan152 alnx02
docker network connect macvlan151 alnx03
docker network connect macvlan152 alnx04

# 생성된 macvlan에 컨테이너를 할당한다.

[root@cent151 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
d9ee27525656        whchoi_alpine:v1    "/bin/sh"           3 weeks ago         Up 2 weeks                                     alnx04
c7fb1e852bc6        whchoi_alpine:v1    "/bin/sh"           3 weeks ago         Up 2 weeks                                     alnx03
7ffb5526b9c6        whchoi_alpine:v1    "/bin/sh"           3 weeks ago         Up 2 weeks                                     alnx02
8a7c2fdf5ce8        whchoi_alpine:v1    "/bin/sh"           3 weeks ago         Up 2 weeks                                     alnx01
85525e6ff34b        ubuntu              "/bin/bash"         3 weeks ago         Exited (1) 2 weeks ago                         whchoi_ubuntu
0c46a5c50427        centos              "/bin/bash"         3 weeks ago         Exited (137) 3 weeks ago                       whchoi_centos

[root@cent151 ~]# docker attach alnx01
/ # ping alnx02
^C
/ # ping alnx03
PING alnx03 (172.16.151.3): 56 data bytes
64 bytes from 172.16.151.3: seq=0 ttl=64 time=0.160 ms
64 bytes from 172.16.151.3: seq=1 ttl=64 time=0.095 ms
64 bytes from 172.16.151.3: seq=2 ttl=64 time=0.092 ms
64 bytes from 172.16.151.3: seq=3 ttl=64 time=0.118 ms
64 bytes from 172.16.151.3: seq=4 ttl=64 time=0.094 ms
64 bytes from 172.16.151.3: seq=5 ttl=64 time=0.094 ms
^C
--- alnx03 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.092/0.108/0.160 ms

[root@cent151 ~]# docker attach alnx02
/ # ping alnx03
^C
/ # ping alnx04
PING alnx04 (172.16.152.3): 56 data bytes
64 bytes from 172.16.152.3: seq=0 ttl=64 time=0.185 ms
64 bytes from 172.16.152.3: seq=1 ttl=64 time=0.163 ms
64 bytes from 172.16.152.3: seq=2 ttl=64 time=0.129 ms
^C
--- alnx04 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.129/0.159/0.185 ms

# 정상적으로 macvlan기반의 네트워킹이 실행되는 것을 볼 수 있다.


공지사항