مقدمه
فراتر از شبکهسازی ساده تکهاست، داکر روشهایی برای یکپارچهسازی مستقیم کانتینرها با شبکههای فیزیکی موجود، تفکیک خودکار نام سرویسها و توزیع ترافیک در سراسر یک کلاستر ارائه میدهد. این مقاله درایور macvlan، service discovery داخلی و ingress load balancing در Swarm را بررسی میکند.
اتصال به VLANهای موجود با Macvlan
درایور macvlan به هر کانتینر آدرس IP و MAC اختصاصی خودش را مستقیماً روی شبکه فیزیکی خارجی میدهد، بهطوری که مانند یک دستگاه واقعی به نظر میرسد، نه چیزی پنهانشده پشت نگاشت پورت. این ویژگی بهویژه برای اپلیکیشنهای نیمهکانتینری که نیاز به ارتباط با سیستمهای غیرکانتینری دارند مفید است.
macvlan عملکرد قویای ارائه میدهد زیرا از bridge یا نگاشت پورت اضافی اجتناب میکند، اما نیازمند این است که رابط شبکه هاست در حالت promiscuous اجرا شود — چیزی که اغلب در شبکههای سازمانی مجاز نیست و تقریباً همیشه در ابرهای عمومی مسدود است.
یک شبکه macvlan متصل به یک VLAN مشخص را میتوان اینگونه ساخت:
docker network create -d macvlan \
--subnet=10.0.0.0/24 \
--ip-range=10.0.0.0/25 \
--gateway=10.0.0.1 \
-o parent=eth0.100 \
macvlan100این کار یک sub-interface تگگذاریشده روی هاست ایجاد میکند و یک محدوده IP را منحصراً برای داکر رزرو میکند، زیرا macvlan هیچ مکانیزم داخلی برای تشخیص تداخل آدرس ندارد. یک کانتینر متصل به این شبکه به یک شرکتکننده کاملاً قابلمشاهده در VLAN 100 تبدیل میشود:
docker run -d --name mactainer1 --network macvlan100 alpine sleep 1dدرایور macvlan همچنین از VLAN trunking پشتیبانی میکند، که امکان میدهد چندین شبکه macvlan روی یک هاست، کانتینرها را بهطور همزمان به VLANهای مختلف متصل کنند.
عیبیابی مشکلات اتصال
هنگام بروز مشکلات شبکه، هم لاگهای daemon و هم لاگهای کانتینر ارزشمند هستند. سطح جزئیات لاگ daemon را میتوان در /etc/docker/daemon.json با تنظیم debug و log-level تنظیم کرد. لاگهای کانتینر معمولاً با دستور زیر مشاهده میشوند:
docker logs یا docker service logs برای سرویسهای Swarm، با فرض اینکه برنامه کانتینر لاگها را به STDOUT و STDERR بهعنوان فرآیند اصلی خود ارسال میکند.
Service Discovery
داکر service discovery داخلی را از طریق یک سرور DNS تعبیهشده ارائه میدهد که به کانتینرهای روی یک شبکه مشترک امکان میدهد یکدیگر را با نام شناسایی کنند. وقتی یک کانتینر درخواستی مانند ping c2 صادر میکند، resolver محلی آن از سرور DNS داخلی داکر پرسش میکند، که نگاشت نام به IP هر کانتینری که با فلگ --name یا --net-alias راهاندازی شده را نگهداری میکند. این تفکیک فقط بین کانتینرهایی که شبکه مشترک دارند کار میکند.
سرورهای DNS سفارشی و دامنههای جستجو را میتوان بهازای هر کانتینر پیکربندی کرد:
docker run -it --name custom-dns \
--dns=8.8.8.8 \
--dns-search=nigelpoulton.com \
alpine shIngress Load Balancing در Swarm
Swarm از دو روش برای publish کردن سرویسها به بیرون پشتیبانی میکند: حالت ingress (پیشفرض) و حالت host. حالت ingress امکان دسترسی به یک سرویس از طریق هر نودی در کلاستر را فراهم میکند، حتی نودهایی که replica اجرا نمیکنند، به لطف یک مکانیزم مسیریابی لایه ۴ داخلی. در مقابل، حالت host فقط از طریق نودهایی که واقعاً یک replica اجرا میکنند دسترسی میدهد:
docker service create -d --name svc1 \
--publish published=5005,target=80,mode=host \
nginxدر حالت ingress، داکر بهطور خودکار یک شبکه ویژه به نام ingress ایجاد میکند که هر نود swarm را به هم متصل میکند و هر ترافیکی که به پورت publishشده روی هر نودی برسد را به یک replica در دسترس مسیریابی میکند — و در صورت وجود چند replica، درخواستها را بهطور خودکار متعادل میکند.
نتیجهگیری
شبکهسازی macvlan، service discovery داخلی و مکانیزم مسیریابی ingress در Swarm، قابلیتهای شبکهسازی داکر را فراتر از تنظیمات ساده تکهاست تکمیل میکنند. اینها در کنار هم امکان یکپارچهسازی کانتینرها با زیرساخت فیزیکی، شناسایی قابلاعتماد سرویسها با نام یکدیگر، و توزیع یکپارچه ترافیک در سراسر یک کلاستر را فراهم میکنند.