مقدمه
شبکههای overlay امکان میدهند کانتینرهای در حال اجرا روی هاستهای کاملاً متفاوت، مستقیماً از طریق یک شبکه مسطح، امن و لایه ۲ با یکدیگر ارتباط برقرار کنند، صرفنظر از توپولوژی فیزیکی شبکه زیرین. داکر این قابلیت را بر پایه libnetwork و درایور داخلی overlay آن میسازد، که پیکربندی آن ساده و بهطور پیشفرض امن است.
ساخت یک Swarm
شبکههای overlay به فروشگاه کلید-مقدار و ویژگیهای امنیتی swarm متکی هستند، بنابراین به یک کلاستر Swarm نیاز است. یک swarm دونودی را میتوان با راهاندازی نود اول و پیوستن نود دوم با توکن تولیدشده ساخت:
docker swarm init
docker swarm join --token SWMTKN-1-... 172.31.1.5:2377ارتباط بین نودها نیازمند باز بودن چند پورت است: 2377/tcp برای ترافیک مدیریتی، 7946/tcp و 7946/udp برای gossip در control plane، و 4789/udp برای ترافیک data plane مبتنی بر VXLAN.
ساخت یک شبکه Overlay
یک شبکه overlay رمزنگاریشده که کل swarm را در بر میگیرد، با یک دستور واحد قابل ساخت است:
docker network create -d overlay -o encrypted uber-netفلگ -o encrypted تضمین میکند هم ترافیک control plane و هم data plane با استفاده از AES در حالت GCM رمزنگاری شوند، و کلیدهای رمزنگاری هر ۱۲ ساعت بهطور خودکار چرخانده شوند. بدون این فلگ، بهطور پیشفرض فقط ترافیک control plane رمزنگاری میشود، زیرا رمزنگاری data plane میتواند عملکرد را حدود ۱۰٪ کاهش دهد.
جالب اینجاست که یک شبکه overlay تازهساختهشده فقط روی نود manager قابلمشاهده است تا زمانی که یک نود worker واقعاً کانتینری اجرا کند که به آن نیاز دارد — داکر شبکههای overlay را بهصورت تنبل (lazy) گسترش میدهد تا gossip غیرضروری شبکه در سراسر کلاستر کاهش یابد.
اتصال کانتینرها و تست اتصال
بهطور پیشفرض، فقط کانتینرهایی که متعلق به سرویسهای swarm هستند میتوانند به شبکههای overlay بپیوندند، مگر اینکه شبکه با فلگ --attachable ساخته شده باشد. استقرار یک سرویس با replicaهای پخششده بین نودها این موضوع را عملاً نشان میدهد:
docker service create --name test \
--network uber-net \
--replicas 2 \
ubuntu sleep infinityپس از استقرار، کانتینرها روی نودهای فیزیکی مختلف میتوانند مستقیماً با استفاده از IP شبکه overlay خود یکدیگر را ping کنند، و ردیابی مسیر یک hop واحد را تأیید میکند — اثباتی بر اینکه کانتینرها مستقیماً از طریق overlay ارتباط برقرار میکنند، کاملاً بیاطلاع از توپولوژی شبکه زیرینی که واقعاً از آن عبور میکنند.
شبکههای Overlay چگونه کار میکنند: VXLAN
در پشت صحنه، داکر شبکههای overlay را با استفاده از تونلهای VXLAN (Virtual Extensible LAN) میسازد، که یک شبکه مجازی لایه ۲ روی زیرساخت لایه ۳ موجود ایجاد میکنند. از آنجا که VXLAN یک فناوری کپسولهسازی است، کاملاً برای روترها و سوییچهای شبکه زیرین (Underlay Network) شفاف است — آنها فقط ترافیک معمولی IP/UDP را میبینند.
هر انتهای تونل به یک VXLAN Tunnel Endpoint (VTEP) ختم میشود که مسئول کپسولهسازی و رمزگشایی ترافیک هنگام ورود و خروج از تونل است. روی هر هاست، داکر یک sandbox شبکه با یک سوییچ مجازی ایجاد میکند، یک VTEP را به آن متصل میکند و سمت رو-به-هاست VTEP را به پورت UDP 4789 متصل میکند. سپس دو VTEP تونل VXLAN را تشکیل میدهند که تمام ترافیک overlay بین هاستها را حمل میکند.
ردیابی مسیر یک بسته
وقتی یک کانتینر دیگری را از طریق overlay ping میکند، bridge محلی آن از طریق پروتکل gossip داکر که اطلاعات کانتینرها را در سراسر swarm منتشر میکند، یاد میگیرد چگونه از طریق VTEP به مقصد برسد. VTEP بسته را با یک هدر VXLAN که شامل VXLAN Network ID (VNID) صحیح است کپسوله میکند، آن را در یک بسته UDP آدرسدهیشده به VTEP راهدور میپیچد، و آن را در سراسر شبکه زیرین ارسال میکند. هنگام رسیدن، VTEP هاست دریافتکننده بسته را رمزگشایی کرده و به کانتینر مقصد صحیح ارسال میکند — همه اینها برای شبکه فیزیکی زیرین نامرئی است.
درایور overlay داکر همچنین از مسیریابی لایه ۳ بین چند subnet روی یک شبکه overlay واحد پشتیبانی میکند که بهطور خودکار و بدون پیکربندی اضافی مدیریت میشود.
نتیجهگیری
چیزی که شبیه یک دستور ساده به نظر میرسد — docker network create -d overlay — سیستمی واقعاً پیچیده از سوییچهای مجازی، endpointهای تونل و کپسولهسازی را پنهان میکند که در کنار هم امکان ارتباط یکپارچه کانتینرها در سراسر هر شبکه زیرینی را فراهم میکنند. درک این مکانیزم هم برای عیبیابی استقرارهای تولیدی Swarm و هم برای گفتگوهای آگاهانه با تیمهای شبکه ارزشمند است.