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 এ কন্টেনার থেকে কন্টেনার নেটওয়ার্কিং এর সময়ে আইডি বেসিস প্যাকেট এক্সেপ্ট বা রিজেক্ট করা হয়।
Image taken from - Faysal Mehedi bhai's github repo
স্পিড এবং এক্সিকিউশান মেশিন টু মেশিন ভ্যারি করতে পারে। 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 হিসেবে লিখা। পুরো প্রসিডিউর টা কে কিছু স্টেপ হিসেবে আমরা দেখবো।
স্টেপ - ০ঃ শুরুতেই Git এর প্যাকেজ ডাউনলোড করে নেবো। মেইক শিওর Git Bash [Image: (১) গিট ব্যাশ] যাতে ইন্সটল হয়। পুরো কাজের টার্মিনাল এক্সেসিবিলিটি এটা দিয়ে করা হবে। আপনি চাইলে উইন্ডোজের কমান্ড প্রম্পট (CMD) দিয়েও করতে পারেন। আমি এটা দিয়ে করেছি এবং এসব কাজে এটাতে কম্ফোর্টেবল।
স্টেপ - ১ঃ এরপর আমাদের প্রয়োজন হবে Vagrant এবং VirtualBOX। আশা করছি আপনার মেশিনে Vagrant এবং VirtualBOX সেট আপ করা আছে। না থাকলে হাসিন হায়দার ভাই এর এই প্লেলিস্ট এর প্রথম টিউটোরিয়াল টি দেখে নিতে পারেন (ইচ্ছা থাকলে বাকি গুলোও দেখে নিন)।
স্টেপ - ২ঃ আশা করছি Vagrant এবং Virtual Machine সেট আপ দিয়ে টুকটাক ধারণা হয়েছে। এখন পছন্দ মত জায়গায় একটা ফোল্ডার খুলে নিবো। ধরে নিলাম ফোল্ডারের নাম VagrantBoxes। এর মধ্যে চাইলে আপনি VagrantBox এর মাধ্যমে VM তৈরি করা সম্পর্কিত কাজগুলো করতে পারেন। এবার এর মধ্যে আরো দুটো ফোল্ডার খুলে নিবো (১) assignment1-host1 এবং (২) assignment1-host2 নামে। এই দুই ফোল্ডারের মধ্যে আমরা VM তৈরি করবো (Image : (২) VM Folder)।
স্টেপ - ৩ঃ দুই ফোল্ডারেই মাউস রাইট ক্লিক করে Git Bash Here ক্লিক [Image: (১) গিট ব্যাশ] করে দুইটা আলাদা আলাদা কমান্ড প্রম্পট ওপেন করবো। এই দুইটা কমান্ড প্রম্পট হবে আমাদের VM এর কমিউনিকেশান এন্ডপয়েন্ট। মানে আমরা VM কে কন্ট্রোল করবো সম্পূর্ণ টার্মিনাল দিয়ে।
স্টেপ - ৪ঃ এবার টার্মিনাল দুটোতেই আমরা নিচের Vagrant ইনিশিয়েট কমান্ড লিখবো।
vagrant init ubuntu/bionic64
লিখে Enter চাপলে দুইটি ফোল্ডারেই একটা Vagrantfile নামে একটা করে Virtual Machine এর কনফিগারেশান ফাইল জেনারেট হবে।
স্টেপ - ৫ঃ যেকোন একটি টেক্সট এডিটর যেমন Notepad++ এ উভয় Vagrantfile ওপেন করে সার্চ করবো config.vm.network "private_network"। উভয় Vagrantfile এ, এই লাইনটি আন কমেন্ট করতে হবে প্রথমেই (লাইনের শুরুর দিকের # টা মুছে দিলেই হবে) [Image : (৩) IP Setting]। assignment1-host1 এর আইপি আমরা সেট করবো 192.168.33.10। এবং assignment1-host2 এর আইপি টা সেট করবো 192.168.33.11। ফাইল দুটো সেভ করবো।
IP Address একই সিরিজের দেবেন। ভিন্ন সিরিজের দিলে এক VM থেকে আরেক VM এ PING করার জন্য আলাদা ভাবে রাউটিং সেট আপ করতে হবে যেটা সময় সাপেক্ষ এবং ঝামেলার।
স্টেপ - ৬ঃ Virtual Box টি ওপেন করে নিলাম। এখন উভয় টার্মিনালে লিখবো vagrant up কমান্ড টি লিখবো। এটা কিছুক্ষন সময় নিবে। এরপর দেখবো Virtual Box এ দুইটি Virtual Machine তৈরি হয়েছে। VM দুটোর নামের শুরু প্রিফিক্স শুরু হবে ফোল্ডার নাম অনুসারে। তার মানে ... assignment1-host1 এবং assignment1-host2 দিয়ে শুরু হবে। [Image:(৪) VM Instances] নিচের মতো লগ আসতে থাকবে -
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
স্টেপ - ৭ঃ পাশাপাশি দুটো টার্মিনাল ওপেন করে রাখলাম। আগেই বলেছি এই দুটো টার্মিনাল দুটো VM এ ঢোকার এন্ড পয়েন্ট। এখন আমরা VM দুটোতে ঢুকবো। এই দুটো এন্ড পয়েন্টে এসে আমরা vagrant ssh লিখলেই VM এ দুটো তে প্রবেশ করতে পারবো এবং টার্মিনাল দিয়ে এক্সেস করতে পারবো। যদি সাক্সেস্ফুলি VM এ প্রবেশ করতে পারেন তাহলে উভয় VM এ নিচের মতো লগ দেখাবে। শুধু IP Addres এবং টাইম এ চেঞ্জ (যেই IP আপনি সেট করেছেন সেটাই আসবে) আসতে পারে।
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
স্টেপ - ৮ঃ উভয় VM এর Root Access নিতে হবে sudo -i কমান্ড দিয়ে। এটা করলে নিচের মত লগ আসবে -
vagrant@ubuntu-bionic:~$ sudo -i
root@ubuntu-bionic:~#
এই sudo -i কমান্ড দিয়ে মেশিনের Root Mode এ ঢুকে যাবার একটা সুবিধা আছে। বার বার আপনাকে প্রতিটা কমান্ডের আগে sudo কথা টা না লিখলেও চলবে (লিখলেও সমস্যা নেই ...কাজ করবে ঠিকঠাক)। নরমালি কমান্ড গুলো লিখলেই হবে।
স্টেপ - ৯ঃ এখন উভয় VM থেকে PING করে দেখতে হবে এদের মধ্যে কানেক্টিভিটি ঠিক আছে কিনা? এর মাধ্যমে আমরা চেক করবো আমাদের Underlay Network মানে ফিজিকাল নেটওয়ার্ক কানেক্টিভিটি ঠিকঠাক আছে কিনা। PING করলে নিচের মত লগ আসবে -
-------------------------------- 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 তৈরির জন্য রেডি।
স্টেপ - ১০ঃ এখন উভয় VM এর টার্মিনাল এ ubuntu এর বেসিক প্যাকেজ আপডেট এর Command এবং প্রয়োজনীয় প্যাকেজ আপডেট এর Command গুলো দেবো। প্যাকেজ গুলো আপডেট করা বা ইনস্টল করা না থাকলে কিছুক্ষন সময় নেবে আপডেট বা ইন্সটল করার জন্য। কমান্ড গুলো দেবার পর নিচের মত logs আসার জন্য অপেক্ষা করবো -
-------------------------------- 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).
স্টেপ - ১১ঃ এখন উভয় VM এ দুটো করে Virtual Bridge তৈরি করবো আমরা। নিচের কমান্ড গুলো আমরা দুইটা টার্মিনাল এ দেবো। নিচের মতো লগ আসবে -
-------------------------------- 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 কমান্ড টি লিখলেই হবে ।
স্টেপ - ১২ঃ উভয় VM এর দুটো করে Virtual Bridge তৈরি করেছিলাম আগের স্টেপ। এখন সেগুলোতে যথাক্রমে veth0 এবং veth1 নামে দুটো Port তৈরি করবো। veth0 হচ্ছে ovs-br0 এর জন্য। এবং veth1 হচ্ছে ovs-br1 এর জন্য। সেজন্য নিচের কমান্ড গুলো দেবো এবং একই ধরনের Log আসে কিনা চেক করবো -
-------------------------------- 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 এর বাইরে থেকে দিতে হবে।
কাজ টা করতে গিয়ে বেশ কিছু সমস্যার সম্মুখীন হয়েছিলাম। সেগুলোর যেভাবে সমাধান করেছি তা এই FAQ and Troubleshoot পেজ এ লিখেছি। হয়তো আপনার কাজে লাগতে পারে।