اگر شما هم مثل من علاقه زیادی به مباحث کلود داشته باشید احتمالا به این فکر کردید که بتونید سرورهای فیزیکی خودتون رو به صورت یکپارچه مدیریت کنید. اصلا کلود برای همینه که شما بتونید منابعی مثل پردازنده، رم و فضای ذخیرهسازی رو تبدیل به نیازمندیهای پردازشی و شبکهای کنید.
در کلود اصولا دیگه برای هر امکانی نمیرن یه دستگاه بخرن! شما میایی یک تعداد سرور با هارد میخری و فقط با یه سوئیچ این سرورها رو به هم وصل میکنی و بعدش دیگه همه چی با نرم افزار هست.
یکی از این نرم افزارها که خیلی هم قدرتمند و قوی هست و الان دیگه زیرساخت شبکه اوپن استک رو داره پشتیبانی میکنه OVN یا Open Virtual Network هست.
در واقع به طور ساده بخوام بگم ovn میاد برای شما گروههای مختلف ایجاد میکنه و میتونید سرورهای مجازی رو توی اون گروهها قرار بدید. در واقع توی لایه ۲ و۳ برای شما گروه بندی انجام میده بدون اینکه بخواید ویلن داشته باشید یا کار خاصی انجام بدید یا دستگاهی مثل سوئیچ داشته باشید. البته اینم بگم که همه این کارها رو میتونید با کامندلاین یا کدنویسی انجام بدید که میشه گفت این مزیت قابل توجهیه.
یه مثال بزنم و برم سراغ آموزش نصب:
من اومدم دو تا سرور مجازی با قابلیت nested virtualization ساختم و در هر کدوم یک سرور مجازی راه اندازی کردم. یک سوئیچ مجازی درست کردم و اومدم دو تا پورت براش تعریف کردم و هر کدوم از سرورها رو به یک پورت اون سوئیچ زدم. الان میتونم از هرکدوم از این دو سرور اون یکی رو با آی پی داخلی پینگ بگیرم و ترافیک از طریق ovn و تانلی که براساس پروتکل GENEVE ساخته بین نودها جابجا میشه.
برای نصب در محیط تستی پیشنهادم استفاده از LXD ورژن ۴ به بالا هست که بتونید توش علاوه بر کانتینر، سرور مجازی هم بسازید.
پیش نیاز نصب:
با دستورات زیر میام ۳ تا سرور کانتینری و ۲ تا سرور مجازی درست میکنم:
lxc launch images:ubuntu/focal node1 lxc launch images:ubuntu/focal node2 lxc launch images:ubuntu/focal node3 lxc launch images:ubuntu/focal node4 --vm lxc launch images:ubuntu/focal node5 --vm
روی node1, node2, node3 دستورات زیر رو بزنید:
sudo apt install ovn-central ovn-host systemctl stop ovn-central nano /etc/default/ovn-central
و سپس محتوای زیر رو در هر نود به شکل زیر تغییر بدید:
OVN_CTL_OPTS=" \ --db-nb-addr=<node1-ip> \ --db-nb-create-insecure-remote=yes \ --db-sb-addr=<node1-ip> \ --db-sb-create-insecure-remote=yes \ --db-nb-cluster-local-addr=<local> \ --db-sb-cluster-local-addr=<local> \ --ovn-northd-nb-db=tcp:<node1-ip>:6641,tcp:<node2-ip>:6641,tcp:<node3-ip>:6641 \ --ovn-northd-sb-db=tcp:<node1-ip>:6642,tcp:<node2-ip>:6642,tcp:<node3-ip>:6642"
به جای <local> آی پی سروری که داخلش دارید فایل گفته شده رو ویرایش میکنید رو میذارید.
حالا دستور زیر رو در node1, node2, node3 بزنید:
systemctl start ovn-central
خب الان ما یک کلاستر ovn داریم که شواهد نشون میده همه چی درسته.
دستور زیر رو توی نودهای یک تا ۳ بزنید و خروجی رو بررسی کنید:
ovn-sbctl show
خب حالا چه کنیم؟ باید بیاییم سرورهای node4 , node5 رو بعنوان ورکر که قراره میزبان سرورهای ابری ما باشند رو به ovn وصل کنیم.
sudo apt install ovn-host systemctl enable ovn-host
روی تمام نودهای ۱ تا ۵ دستور زیر رو بزنید تا Open vSwitch راه اندازی بشه:
sudo ovs-vsctl set open_vswitch . external_ids:ovn-remote=tcp:<node1-ip>:6642,tcp:<node2-ip>:6642,tcp:<node3-ip>:6642 external_ids:ovn-encap-type=geneve external_ids:ovn-encap-ip=<local>
به جای <local> آی پی سروری که داخلش دارید دستور رو میزنید بذارید.
الان شما تونستید کار بزرگی کنید. یک کلاستر شبکه دارید که توش میتونید هرچی سوئیچ و روتر دلتون خواست ایجاد کنید.
بریم یه تست بزنیم. سناریو:
۱- یک سوئیچ مجازی درست میکنم بنام network1
۲- دو تا پورت براش تعریف میکنم
۳- هر پورت رو توی نودهای ۴ و ۵ ست میکنم ببینم پینگ هم رو دارن یا نه!
گام اول: یک سوئیچ مجازی درست میکنم بنام network1
ovn-nbctl ls-add network1
این دستور رو توی یکی از نودهای یک تا ۳ باید بزنیم اگرم میخواین روی نودهای ورکر بزنید باید آدرس دیتابیس ovn رو بدید اینطوری:
ovn-nbctl ls-add network1 --db=tcp:<node1-ip>:6641
گام دوم: دو تا پورت تعریف میکنم
ovn-nbctl lsp-add network1 vm1 ovn-nbctl lsp-add network1 vm2 ovn-nbctl lsp-set-addresses vm1 "40:44:00:00:00:01 192.168.0.11" ovn-nbctl lsp-set-addresses vm2 "40:44:00:00:00:02 192.168.0.12"
گام سوم: هر پورت رو توی نودهای ۴ و ۵ ست میکنم ببینم پینگ هم رو دارن یا نه!
روی node4:
ovs-vsctl add-port br-int vm1 -- set Interface vm1 type=internal -- set Interface vm1 external_ids:iface-id=vm1 ip netns add vm1 ip link set vm1 netns vm1 ip netns exec vm1 ip link set vm1 address 40:44:00:00:00:01 ip netns exec vm1 ip addr add 192.168.0.11/24 dev vm1 ip netns exec vm1 ip link set vm1 up
روی node5:
ovs-vsctl add-port br-int vm2 -- set Interface vm2 type=internal -- set Interface vm2 external_ids:iface-id=vm2 ip netns add vm2 ip link set vm2 netns vm2 ip netns exec vm2 ip link set vm2 address 40:44:00:00:00:02 ip netns exec vm2 ip addr add 192.168.0.12/24 dev vm2 ip netns exec vm2 ip link set vm2 up
شاید براتون سوال شده باشه یعنی چی این کار؟؟ اومدم بجای ساخت سرور، یه لینوکس نیم اسپیس ساختم که یعنی سرور مجازیه و توش یه اینترفیس ساختم و به ovn گفتم اینو وصل میکنم به پورت تو. مثلا توی نود۴ وصلش کردم به پورت vm1 و نود۵ به پورت vm2
حالا بریم تست پینگ:
روی نود ۴:
ip netns exec vm1 ping 192.168.0.12 -c2
و روی نود ۵:
ip netns exec vm2 ping 192.168.0.11 -c2
در کمال ناباوری پینگ هم رو دارن :)