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 তৈরি করা [ পর্ব - ১ ]

Create a multi-container host networking using VxLAN overlay networks.

ওকে... তো আজ তারিখ হচ্ছে ৩ আগস্ট ২০২৩। 

কাহিনী হচ্ছে গত ৩ সপ্তাহ ধরে চেষ্টায় আছি এই এসাইনমেন্ট টা করার। কমপক্ষে ২০-২৫ বার চেষ্টা করেছি লোকাল VM এবং AWS Cloud পিসি তে। যাদের কাছে রিচ করেছি তারা সাহায্য করার চেষ্টা করেও ভুল খুঁজে পায় নি। এতবার চেষ্টার পরে বিভিন্ন জায়গায় ডিবাগ করে শেষ পর্যন্ত লোকাল VM এ এই কাজটা করতে পেরেছি। এখনো AWS Cloud এ করতে পারি নি। এই এসাইনমেন্ট করতে গিয়ে বিভিন্ন সময়ের বিভিন্ন লার্নিং + ট্রাবলশ্যুট নিয়ে মূলত এই লিখা শুরু করা। উদ্দেশ্য ২টা - (১) নিজের জন্য একটা নোট তৈরি করে রাখা, (২) যারা করতে গিয়ে আটকাচ্ছে হয়তো কোনভাবে তাদের সাহায্য করা। শুরু করা যাক ... ... ... 

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

এই কাজ করতে গিয়ে প্রথম যেই শিক্ষা/সিদ্ধান্ত আমি পেয়েছি ... ... আপনি সবকিছু একদম নিয়ম মেনে ঠিকঠাক করে এগোনোর পরেও এইটা যে সঠিকভাবে কাজ করবে এর কোন গ্যারান্টি নেই। আর তার পেছনে সমস্যা হচ্ছে ... ... সমস্যা টা খুঁজে বের করতে আপনার যথেষ্ট সময় লাগবে। 

এই কাজ করার আগে থিওরিটিকাল কিছু কন্সেপ্ট এর প্রয়োজন আছে। এটার জন্য আপনি আপাতত এই README টা পড়ে ফেলতে পারেন (আমার এক্সারসাইজ টা এই প্রসেস অনুসারে করা)। পরবর্তীতে কন্সেপ্ট নিয়ে একটা লিখা পোস্ট করার ইচ্ছা আছে। এই লিখাতে প্র্যাক্টিকালি কাজের ব্যাপার টা তে ফোকাস করছি।

কাজ টা করতে গিয়ে বেশ কিছু সমস্যার সম্মুখীন হয়েছিলাম। সেগুলোর যেভাবে সমাধান করেছি তা এই FAQ and Troubleshoot পেজ এ লিখেছি। হয়তো আপনার কাজে লাগতে পারে।

192.168.1.11 / 192.168.1.12 / 192.168. 2.11/ 192.168. 2.12 => Container IP

192.168.1.1/192.168.2.1 => Container Bridge IP/Gateway IP

192.168.33.10 => VM1 IP

192.168.33.11 => VM2 IP

4789 => UDP Port for VxLAN

1000 / 2000 => VNI Key to identify VxLAN Traffic


** যেহেতু  পুরো ব্যাপারটাই ভার্চুয়াল তাই লোকাল VM এ কম্পিউটার বন্ধ করার সাথে সাথে সব রিসেট হয়ে যাবে। ভার্চুয়াল মেশিনের State সেভ করে রেখে দিতে পারেন পরবর্তীতে চেক করার জন্য।

So, এখানে - 


VM01 / VM02 - দুইটা ভার্চুয়াল মেশিন


Container / docker 1/ docker2 / docker3 / docker4 - Docker Container / এদের নাম (এইজন্যেই multi-container)


OVS Bridge - ভার্চুয়াল ব্রিজ। (Overlay Network এর জন্য ভার্চুয়াল এন্ডপয়েন্ট লাগে। OVS (OpenVSwitch) দিয়ে সেই এন্ডপয়েন্ট গুলো ক্রিয়েট করা যায়। ব্রিজ এর একদিকে থাকে কন্টেনার আর  একদিকে থাকে VxLAN Tunnel এর একটা এন্ডপয়েন্ট।)


eth0 - কম্পোনেন্ট যেমন Docker Container / NIC ইত্যাদি এর ইন্টারফেস। 


veth0 - একই রকম ইন্টারফেস কিন্তু ভার্চুয়াল।


ovs-br0/ovs-br1 - ভার্চুয়াল ব্রিজ এর নাম


VNI - VxLAN এর নেটওয়ার্ক আইডেন্টিফায়ার। VxLAN এ কন্টেনার থেকে কন্টেনার নেটওয়ার্কিং এর সময়ে আইডি বেসিস প্যাকেট এক্সেপ্ট বা রিজেক্ট করা হয়।


স্পিড এবং এক্সিকিউশান মেশিন টু মেশিন ভ্যারি করতে পারে। OS ওয়াইস আশা রাখি সমস্যা হবে না। আমার ল্যাপ্টপের কনফিগারেশান - 

Processor: Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz   2.21 GHz

RAM: 16.0 GB (15.7 GB usable)

OS: Windows 10 Pro

সম্পূর্ণ টিউটোরিয়াল টি লোকাল VM হিসেবে লিখা। পুরো প্রসিডিউর টা কে কিছু স্টেপ হিসেবে আমরা দেখবো। 

 vagrant init ubuntu/bionic64 

লিখে Enter চাপলে দুইটি ফোল্ডারেই একটা Vagrantfile নামে একটা করে Virtual Machine এর কনফিগারেশান ফাইল জেনারেট হবে।

Bringing machine 'default' up with 'virtualbox' provider...

==> default: Checking if box 'ubuntu/bionic64' version '20230607.0.0' is up to date...

==> default: Clearing any previously set forwarded ports...

==> default: Clearing any previously set network interfaces...

==> default: Preparing network interfaces based on configuration...

    default: Adapter 1: nat

    default: Adapter 2: hostonly

==> default: Forwarding ports...

    default: 22 (guest) => 2222 (host) (adapter 1)

(১) গিট ব্যাশ

(২) VM Folder

(৩) IP Setting

(৪) VM Instances

user@SSAVI MINGW64 ~/Documents/Vagrant/assignment1-host1

$ vagrant ssh

Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 4.15.0-212-generic x86_64)


 * Documentation:  https://help.ubuntu.com

 * Management:     https://landscape.canonical.com

 * Support:        https://ubuntu.com/advantage


  System information as of Tue Aug  1 01:53:05 UTC 2023


  System load:  0.49              Users logged in:        0

  Usage of /:   4.2% of 38.70GB   IP address for enp0s3:  10.0.2.15

  Memory usage: 17%               IP address for enp0s8:  192.168.33.10

  Swap usage:   0%                IP address for docker0: 172.17.0.1

  Processes:    104

vagrant@ubuntu-bionic:~$ sudo -i

root@ubuntu-bionic:~#

এই sudo -i কমান্ড দিয়ে মেশিনের Root Mode এ ঢুকে যাবার একটা সুবিধা আছে। বার বার আপনাকে প্রতিটা কমান্ডের আগে sudo কথা টা না লিখলেও চলবে (লিখলেও সমস্যা নেই ...কাজ করবে ঠিকঠাক)। নরমালি কমান্ড গুলো লিখলেই হবে।

--------------------------------  VM1 থেকে VM2 তে PING করা হলো --------------------------------  

root@ubuntu-bionic:~# ping 192.168.33.11

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

64 bytes from 192.168.33.11: icmp_seq=1 ttl=64 time=0.662 ms


64 bytes from 192.168.33.11: icmp_seq=2 ttl=64 time=1.19 ms

64 bytes from 192.168.33.11: icmp_seq=3 ttl=64 time=0.555 ms

64 bytes from 192.168.33.11: icmp_seq=4 ttl=64 time=0.554 ms

64 bytes from 192.168.33.11: icmp_seq=5 ttl=64 time=1.07 ms

^C

-------------------------------- VM2 থেকে VM1 PING করা হলো -------------------------------- 

vagrant@ubuntu-bionic:~$ ping 192.168.33.10 -c 5

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

64 bytes from 192.168.33.10: icmp_seq=1 ttl=64 time=0.416 ms

64 bytes from 192.168.33.10: icmp_seq=2 ttl=64 time=0.857 ms

64 bytes from 192.168.33.10: icmp_seq=3 ttl=64 time=0.865 ms

64 bytes from 192.168.33.10: icmp_seq=4 ttl=64 time=1.11 ms

64 bytes from 192.168.33.10: icmp_seq=5 ttl=64 time=2.05 ms

যেহেতু Overlay Networking টা Underlay Networking এর কানেক্টিভিটির উপরে নির্ভর করে সেহেতু VM দুটোর মধ্যে কানেক্টিভিটি ঠিকঠাক আছে কিনা সেটা চেক করা জরুরী। আমরা এখন Overlay Network তৈরির জন্য রেডি। 

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

root@ubuntu-bionic:~# apt update

.....

Fetched 261 kB in 7s (35.3 kB/s)

Reading package lists... Done

Building dependency tree

Reading state information... Done

root@ubuntu-bionic:~# apt -y install net-tools docker.io openvswitch-switch

Reading package lists... Done

Building dependency tree

Reading state information... Done

......

docker.io is already the newest version (20.10.21-0ubuntu1~18.04.3).

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

root@ubuntu-bionic:~# sudo ovs-vsctl add-br ovs-br0

root@ubuntu-bionic:~# sudo ovs-vsctl add-br ovs-br1

root@ubuntu-bionic:~# ovs-vsctl show

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

    Bridge "ovs-br1"

        Port "ovs-br1"

            Interface "ovs-br1"

                type: internal

    Bridge "ovs-br0"

        Port "ovs-br0"

            Interface "ovs-br0"

                type: internal

    ovs_version: "2.9.8"

এর পরের কমান্ড গুলো আমি root user মুড থেকে বের হয়ে দিয়েছি। কনফিউজ হবার প্রয়োজন নেই। root mode থেকে করলেও হবে। এই কাজটা অভ্যাসবশত হয়েছে। root থেকে বের হতে চাইলে exit কমান্ড টি লিখলেই হবে । 

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

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl add-port ovs-br0 veth0 -- set interface veth0 type=internal

vagrant@ubuntu-bionic:~$ sudo ovs-vsctl add-port ovs-br1 veth1 -- set interface veth1 type=internal

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

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

    Bridge "ovs-br1"

        Port "veth1"

            Interface "veth1"

                type: internal

        Port "ovs-br1"

            Interface "ovs-br1"

                type: internal

    Bridge "ovs-br0"

        Port "veth0"

            Interface "veth0"

                type: internal

        Port "ovs-br0"

            Interface "ovs-br0"

                type: internal

    ovs_version: "2.9.8"

এই ফাঁকে জানিয়ে রাখি কোন VM এ vagrant suspend কমান্ডটি দিলে VM যেই সিচুয়েশানে আছে সেই সিচুয়েশানে স্টেট সেভ করে রাখবে। পরে যখন আবার VM চালু করবেন তখন যেভাবে রেখে গেছেন ঠিক সেভাবেই পাবেন। ভেতরের সেট আপ গুলো চেঞ্জ হবে না। পরবর্তীতে VM কে Up করার জন্য vagrant up কমান্ড টি দিলেই হবে। বাই দ্যা ওয়ে, vagrant রিলেটেড সকল কমান্ড VM এর বাইরে থেকে দিতে হবে।