hi, let Avik connect you.

** You can give your thought about this content and request modifications if needed from Ask For Modifications page. Thank You.

** You can check all the posts on the Posts page.

** More about me in the About Me section.

VxLAN overlay network ব্যবহার করে multi-container host networking তৈরি করা [ পর্ব - ]

এই লিখা প্রথম পর্বের ধারাবাহিকতা। প্রথম পর্ব  না পড়ে থাকলে পড়ে আসার অনুরোধ রইলো।

অনুরোধ - এই লিখা পড়ে যদি মনে হয় কোন জিনিস যুক্ত করে দিলে ভালো হয় যেটা আমি করি নি ... কাইন্ডলি কমেন্টে জানাবেন অথবা ssavi.ict@gmail.com এ একটা মেইল লিখে দেবেন। আমি ক্রেডিট দিয়ে যুক্ত করে দেবো। কাজ টা করতে গিয়ে বেশ কিছু সমস্যার সম্মুখীন হয়েছিলাম। সেগুলোর যেভাবে সমাধান করেছি তা এই FAQ and Troubleshoot পেজ এ লিখেছি। হয়তো আপনার কাজে লাগতে পারে।

-------------------------------- VM1 এবং VM2 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo ip address add 192.168.1.1/24 dev veth0

vagrant@ubuntu-bionic:~$ sudo ip address add 192.168.2.1/24 dev veth1

vagrant@ubuntu-bionic:~$ sudo ip a

8: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    link/ether 5e:68:e0:15:60:07 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.1/24 scope global veth0

       valid_lft forever preferred_lft forever

9: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000

    link/ether fa:c3:cf:33:02:52 brd ff:ff:ff:ff:ff:ff

    inet 192.168.2.1/24 scope global veth1

       valid_lft forever preferred_lft forever

প্রশ্ন আসতে পারে... অন্য IP Address কি সেট করা যায়। উত্তর হলো ... হ্যা করা যায়। আমি নিজেও করেছি ... তবে সফলভাবে এক পাশের VM Docker Container থেকে অন্য পাশের VM Docker Container কে PING করাতে পারি নি। হয়তো রাউটিং এর কোথাও ভুল হয়েছিলো। আপনি যদি করতে পারেন তাহলে আমার সাথে শেয়ার করবেন। 

-------------------------------- VM1 এবং VM2 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo ip link set dev veth0 up mtu 1450

vagrant@ubuntu-bionic:~$ sudo ip link set dev veth1 up mtu 1450

vagrant@ubuntu-bionic:~$ sudo ip a

8: veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000

    link/ether 5e:68:e0:15:60:07 brd ff:ff:ff:ff:ff:ff

    inet 192.168.1.1/24 scope global veth0

       valid_lft forever preferred_lft forever

    inet6 fe80::5c68:e0ff:fe15:6007/64 scope link

       valid_lft forever preferred_lft forever

9: veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default qlen 1000

    link/ether fa:c3:cf:33:02:52 brd ff:ff:ff:ff:ff:ff

    inet 192.168.2.1/24 scope global veth1

       valid_lft forever preferred_lft forever

    inet6 fe80::f8c3:cfff:fe33:252/64 scope link

       valid_lft forever preferred_lft forever

এখন থেকে পরবর্তী স্টেপ গুলো খুবই সতর্কতার সাথে করতে হবে। এই স্টেপ গুলো তে খুব বেশি ভুল হয়। এবং ফলাফল ঠিকঠাক PING হয় না। মাথার চুল ছেড়া লাগে।

FROM ubuntu


RUN apt update

RUN apt install -y net-tools

RUN apt install -y iproute2

RUN apt install -y iputils-ping


CMD ["sleep", "7200"]

এই কোড টি VM1 এবং VM2 তে পুশ করতে হবে। বা VM এ একটি Dockerfile তৈরি করে সেখানে পেস্ট করতে হবে। আমি (২) নাম্বার মানে ফাইল তৈরি করে পেস্ট করেছি স্নিপেট টি। সেজন্য টার্মিনাল নিচের কমান্ড গুলো লিখবো - 

-------------------------------- VM1 এবং VM2 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ touch Dockerfile

vagrant@ubuntu-bionic:~$ vi Dockerfile

এটা করলে টার্মিনাল এর VIM ইডিটরে টেক্সট ইডিট করার ফ্যাসিলিটি ওপেন হবে। সেখানে উপরের স্নিপেট টি Copy করে Paste করবো। এরপর ESC বাটন চাপবো। এরপর, ইডিটরের উপরেই :wq! এই কোড দিলে স্নিপেট টি Dockerfile ফাইলে সেভ হয়ে টার্মিনাল ইডিটর থেকে বেরিয়ে আসবে। এর পর নিচের কমান্ড দিয়ে ঠিকঠাক ফাইল টি লিখা হলো কিনা চেক করবো। 

vagrant@ubuntu-bionic:~$ cat Dockerfile

FROM ubuntu


RUN apt update

RUN apt install -y net-tools

RUN apt install -y iproute2

RUN apt install -y iputils-ping


CMD ["sleep", "7200"]

touch <filename> দিয়ে নতুন ফাইল তৈরি করা হয় এবং cat <filename> দিয়ে ফাইলের কন্টেন্ট গুলো টার্মিনাল এ দেখা হয়।

-------------------------------- VM1 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo docker build . -t ubuntu-docker

Sending build context to Docker daemon  15.36kB

Step 1/6 : FROM ubuntu

......... 

Step 6/6 : CMD ["sleep", "7200"]

.........

Successfully built 9ae522bebcb9

Successfully tagged ubuntu-docker:latest

vagrant@ubuntu-bionic:~$ sudo docker run -d --net=none --name docker1 ubuntu-docker

087db9e04b10630f56c0b69ab5233bd181c1e3f48c654346f6be90c0d151fcfd

vagrant@ubuntu-bionic:~$ sudo docker run -d --net=none --name docker2 ubuntu-docker

cfeec0152a1236e2dd005ae0e09f55f9862a23cbdc06fd7f4ce64b2a1113a641

vagrant@ubuntu-bionic:~$ sudo docker ps

CONTAINER ID   IMAGE           COMMAND        CREATED          STATUS          PORTS     NAMES

cfeec0152a12   ubuntu-docker   "sleep 7200"   5 seconds ago    Up 5 seconds              docker2

087db9e04b10   ubuntu-docker   "sleep 7200"   16 seconds ago   Up 15 seconds             docker1


-------------------------------- VM2 এর জন্য --------------------------------

vagrant@ubuntu-bionic:~$ sudo docker build . -t ubuntu-docker

Sending build context to Docker daemon  15.36kB

Step 1/6 : FROM ubuntu

......... 

Successfully built 7eee4ac80c41

Successfully tagged ubuntu-docker:latest

vagrant@ubuntu-bionic:~$ sudo docker run -d --net=none --name docker3 ubuntu-docker

34713eb4d4d871a153c83ad52493616e319b44f8063d66b0d6e02eb2009cb17b

vagrant@ubuntu-bionic:~$ sudo docker run -d --net=none --name docker4 ubuntu-docker

9deea2671c303a115ceae0ffd3149318f683ba4f47adc90a96c998b75e302dfe

vagrant@ubuntu-bionic:~$ sudo docker ps

CONTAINER ID   IMAGE           COMMAND        CREATED          STATUS          PORTS     NAMES

9deea2671c30   ubuntu-docker   "sleep 7200"   5 seconds ago    Up 5 seconds              docker4

34713eb4d4d8   ubuntu-docker   "sleep 7200"   19 seconds ago   Up 18 seconds             docker3

-------------------------------- VM1 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo ovs-docker add-port ovs-br0 eth0 docker1 --ipaddress=192.168.1.11/24 --gateway=192.168.1.1

vagrant@ubuntu-bionic:~$ sudo docker exec docker1 ip a

....

18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether aa:61:11:24:f9:c6 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 192.168.1.11/24 scope global eth0

       valid_lft forever preferred_lft forever

vagrant@ubuntu-bionic:~$ sudo ovs-docker add-port ovs-br1 eth0 docker2 --ipaddress=192.168.2.11/24 --gateway=192.168.2.1

vagrant@ubuntu-bionic:~$ sudo docker exec docker2 ip a

......

20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether 96:39:0e:ef:bb:55 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 192.168.2.11/24 scope global eth0

       valid_lft forever preferred_lft forever

vagrant@ubuntu-bionic:~$ sudo docker exec docker1 ping 192.168.1.1 -c 2

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.

64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.305 ms

64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.099 ms

--- 192.168.1.1 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4208ms

rtt min/avg/max/mdev = 0.037/0.107/0.305/0.101 ms

vagrant@ubuntu-bionic:~$ sudo docker exec docker2 ping 192.168.2.1 -c 2

PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.

64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.245 ms

64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=0.066 ms

--- 192.168.2.1 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4271ms

rtt min/avg/max/mdev = 0.062/0.118/0.245/0.067 ms


-------------------------------- VM2 এর জন্য --------------------------------

vagrant@ubuntu-bionic:~$ sudo ovs-docker add-port ovs-br0 eth0 docker3 --ipaddress=192.168.1.12/24 --gateway=192.168.1.1

vagrant@ubuntu-bionic:~$ sudo docker exec docker3 ip a

....

18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether 4e:db:39:49:ad:e5 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 192.168.1.12/24 scope global eth0

       valid_lft forever preferred_lft forever

vagrant@ubuntu-bionic:~$ sudo ovs-docker add-port ovs-br1 eth0 docker4 --ipaddress=192.168.2.12/24 --gateway=192.168.2.1

vagrant@ubuntu-bionic:~$ sudo docker exec docker4 ip a

.....

20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

    link/ether 4a:11:6d:6a:e4:a9 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet 192.168.2.12/24 scope global eth0

       valid_lft forever preferred_lft forever

vagrant@ubuntu-bionic:~$ sudo docker exec docker3 ping 192.168.1.1 -c 2

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.

64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.238 ms

64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.045 ms


--- 192.168.1.1 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4084ms

rtt min/avg/max/mdev = 0.037/0.079/0.238/0.079 ms

vagrant@ubuntu-bionic:~$ sudo docker exec docker4 ping 192.168.2.1 -c 2

PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.

64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=0.320 ms

64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=0.093 ms


--- 192.168.2.1 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4209ms

rtt min/avg/max/mdev = 0.076/0.133/0.320/0.093 ms

দারুণ ... আমরা সঠিক ভাবে IP Setup করতে পেরেছি। এর প্রমাণ হচ্ছে ... ঠিক ঠাক Container থেকে Gateway তে PING পাচ্ছি।

-------------------------------- VM1 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl add-port ovs-br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.33.11 options:key=1000

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl add-port ovs-br1 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=192.168.33.11 options:key=2000


-------------------------------- VM2 এর জন্য --------------------------------

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl add-port ovs-br0 vxlan0 -- set interface vxlan0 type=vxlan options:remote_ip=192.168.33.10 options:key=1000

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl add-port ovs-br1 vxlan1 -- set interface vxlan1 type=vxlan options:remote_ip=192.168.33.10 options:key=2000

উপরের Command এ ... যখন VM1 এর টার্মিনাল এ আছি তখন remote_ip এর ভ্যালু হবে VM2 এর IP Address যেটা হলো 192.168.33.11। এবং VM2 এর টার্মিনাল এ যখন আছি তখন remote_ip এর Value হবে  VM1 এর IP Address যেটা হলো 192.168.33.10। উভয় VM এই vxlan0 এর VNI Key হবে 1000 এবং vxlan1 এর VNI Key হবে 2000। 

-------------------------------- VM1 এবং VM2 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ netstat -ntulp

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

...... 

udp        0      0 0.0.0.0:4789            0.0.0.0:*                           -

udp6       0      0 :::4789                 :::*                                -

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl show

81ef0a57-43f0-426a-b8c8-2541d9ef2e42

    Bridge "ovs-br1"

      ......

        Port "vxlan1"

            Interface "vxlan1"

                type: vxlan

                options: {key="2000", remote_ip="192.168.33.11"} #এই IP Address VM2 থেকে 192.168.33.10 দেখাবে

    Bridge "ovs-br0"

        Port "vxlan0"

            Interface "vxlan0"

                type: vxlan

                options: {key="1000", remote_ip="192.168.33.11"} #এই IP Address VM2 থেকে 192.168.33.10 দেখাবে

    ovs_version: "2.9.8"

vagrant@ubuntu-bionic:~$ sudo ip a

.....

19: 836260d20c054_l@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP group default qlen 1000

    link/ether ae:b4:aa:41:c1:91 brd ff:ff:ff:ff:ff:ff link-netnsid 0

    inet6 fe80::acb4:aaff:fe41:c191/64 scope link

       valid_lft forever preferred_lft forever

21: 08b889f5f85d4_l@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master ovs-system state UP group default qlen 1000

    link/ether e2:d3:e3:28:72:f5 brd ff:ff:ff:ff:ff:ff link-netnsid 1

    inet6 fe80::e0d3:e3ff:fe28:72f5/64 scope link

       valid_lft forever preferred_lft forever

22: vxlan_sys_4789: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65000 qdisc noqueue master ovs-system state UNKNOWN group default qlen 1000

    link/ether a2:3a:26:bb:81:71 brd ff:ff:ff:ff:ff:ff

    inet6 fe80::a03a:26ff:febb:8171/64 scope link

       valid_lft forever preferred_lft forever

sudo ovs-vstl show এই কমান্ড দেবার পর remote ip address টা VM1 থেকে দিলে VM2 এর IP Adress, 192.168.33.11 দেখাবে এবং VM2 থেকে দিলে VM1 এর IP Address, 192.168.33.10 দেখাবে। আউটপুট Log এর কমেন্ট টা চেক করুন। 

-------------------------------- VM1 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo docker exec docker1 ping 192.168.1.11  # docker1 থেকে docker1 এর IP তে PING

PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.             # ঠিকঠাক PING পাবে ... 

64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.015 ms

64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.060 ms

....

vagrant@ubuntu-bionic:~$ sudo docker exec docker1 ping 192.168.2.11   # docker1 থেকে docker2 এর IP তে PING

^C     # ঠিকঠাক PING পাবে না ... 

vagrant@ubuntu-bionic:~$ sudo docker exec docker1 ping 192.168.1.12   # docker1 থেকে docker3 এর IP তে PING

PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.     # ঠিকঠাক PING পাবে ... 

64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=1.35 ms

64 bytes from 192.168.1.12: icmp_seq=2 ttl=64 time=1.23 ms

....

vagrant@ubuntu-bionic:~$ sudo docker exec docker1 ping 192.168.2.12    # docker1 থেকে docker4 এর IP তে PING

^C     # ঠিকঠাক PING পাবে না ... 

vagrant@ubuntu-bionic:~$ sudo docker exec docker2 ping 192.168.2.11     # docker2 থেকে docker2 এর IP তে PING

PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.                # ঠিকঠাক PING পাবে ... 

64 bytes from 192.168.2.11: icmp_seq=1 ttl=64 time=0.014 ms

64 bytes from 192.168.2.11: icmp_seq=2 ttl=64 time=0.045 ms

......

vagrant@ubuntu-bionic:~$ sudo docker exec docker2 ping 192.168.2.12     # docker2 থেকে docker4 এর IP তে PING

PING 192.168.2.12 (192.168.2.12) 56(84) bytes of data.                # ঠিকঠাক PING পাবে ... 

64 bytes from 192.168.2.12: icmp_seq=1 ttl=64 time=1.51 ms

64 bytes from 192.168.2.12: icmp_seq=2 ttl=64 time=1.06 ms

.....

vagrant@ubuntu-bionic:~$ sudo docker exec docker2 ping 192.168.1.11     # docker2 থেকে docker1 এর IP তে PING

^C                                             # ঠিকঠাক PING পাবে না ...

vagrant@ubuntu-bionic:~$ sudo docker exec docker2 ping 192.168.1.12     # docker2 থেকে docker3 এর IP তে PING

^C                                              # ঠিকঠাক PING পাবে না ...

একই রকম ভাবে VM2 এর Container গুলো থেকে PING দিয়েও আমরা চেষ্টা করবো  - 

-------------------------------- VM2 এর জন্য -------------------------------- 

vagrant@ubuntu-bionic:~$ sudo docker exec docker3 ping 192.168.1.12 -c 5   # docker3 থেকে docker3 এর IP তে PING

PING 192.168.1.12 (192.168.1.12) 56(84) bytes of data.   # ঠিকঠাক PING পাবে ...  

64 bytes from 192.168.1.12: icmp_seq=1 ttl=64 time=0.013 ms

... ... ...

--- 192.168.1.12 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4420ms

rtt min/avg/max/mdev = 0.013/0.039/0.059/0.018 ms

vagrant@ubuntu-bionic:~$ sudo docker exec docker3 ping 192.168.1.11 -c 5  # docker3 থেকে docker1 এর IP তে PING

PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.   # ঠিকঠাক PING পাবে ...

64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.467 ms

... ... ...

--- 192.168.1.11 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4112ms

rtt min/avg/max/mdev = 0.467/1.103/1.876/0.475 ms

vagrant@ubuntu-bionic:~$ sudo docker exec docker3 ping 192.168.2.11 -c 5  # docker3 থেকে docker2 এর IP তে PING

^C   # ঠিকঠাক PING পাবে না ...

vagrant@ubuntu-bionic:~$ sudo docker exec docker3 ping 192.168.2.12 -c 5  # docker3 থেকে docker4 এর IP তে PING

^C           # ঠিকঠাক PING পাবে না ...

vagrant@ubuntu-bionic:~$ sudo docker exec docker4 ping 192.168.2.11 -c 5  # docker4 থেকে docker2 এর IP তে PING

PING 192.168.2.11 (192.168.2.11) 56(84) bytes of data.   # ঠিকঠাক PING পাবে ...

64 bytes from 192.168.2.11: icmp_seq=1 ttl=64 time=0.391 ms

... ... ...

--- 192.168.2.11 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4269ms

rtt min/avg/max/mdev = 0.391/0.684/1.323/0.332 ms

vagrant@ubuntu-bionic:~$ sudo docker exec docker4 ping 192.168.2.12 -c 5  # docker4 থেকে docker4 এর IP তে PING

PING 192.168.2.12 (192.168.2.12) 56(84) bytes of data.                    # ঠিকঠাক PING পাবে ...

64 bytes from 192.168.2.12: icmp_seq=1 ttl=64 time=0.015 ms

... ... ...

--- 192.168.2.12 ping statistics ---

5 packets transmitted, 5 received, 0% packet loss, time 4077ms

rtt min/avg/max/mdev = 0.015/0.035/0.059/0.018 ms

vagrant@ubuntu-bionic:~$ sudo docker exec docker4 ping 192.168.1.11 -c 5   # docker4 থেকে docker1 এর IP তে PING

^C   # ঠিকঠাক PING পাবে না ...

vagrant@ubuntu-bionic:~$ sudo docker exec docker4 ping 192.168.1.12 -c 5   # docker4 থেকে docker3 এর IP তে PING

^C   # ঠিকঠাক PING পাবে না ...

Bingoooo ... আমরা ঠিক ঠাক ভাবে VXLAN সেট আপ করতে পেরেছি। এবার নিজে নিজে চেষ্টা করুন। দেখুন পারেন কিনা ... 

যদি PING এর ছবি দেখতে চান তাহলে VM-HOST-1 এবং VM-HOST-2 এই দুটো লিংক এ গিয়ে দেখতে পারেন। জুম এ ক্লিক করলে সম্পুর্ন ইমেজ টি দেখা যাবে।