توی داکر مدیریت کلاستر و ارکستریشن به صورت امبد شده توی انجین داکر با استفاده از SwarmKit انجام میشه. سوآرم پروژه مستقلی هست که به طور مستقیم توسط داکر توسعه داده میشه. یعنی به صورت کلی راهکار داکر برای ارکستریشن و مالتی هاست بودن swarm هستش. البته از زمانی که mirantis داکر رو خرید دیگه swarm رو تو نسخهی کامرشیال خودش ادامه نداد چون یکی از توسعهدهندههای اصلی kubernetes هست ولی با توجه به اینکه تو کامیونیتی داشت از swarm استفاده میشد تو نسخهی رایگان و کامینیوتی داره اون رو ادامه و توسعه میده. یک سوآرم از تعدادی داکر هاست که توی مود سوآرم هستن و در قالب نودهای منیجر و ورکر کار میکنند، تشکیل میشه. یک داکر هاست به عنوان نود توی سوآرم میتونه منیجر یا ورکر باشه. نودهای منیجر میتونند تسک انجام بدن و ما میتونیم یک کلاستر ۳ نوده داشته باشیم که تمام آنها منیجر باشند.
خب یه مروری کنیم پستهای قبلی رو:
توصیه میکنم که حتما این پستها رو هم مطالعه کنید. بریم که ادامه بدیم.
از فیچر های مهمی که سوآرم داره، میشه موارد زیر رو نام برد:
توی سوآرم به دیوایس فیزیکی یا دیوایس روی کلاد که انجین داکر داشته باشه و در کلاستر سوآرم شرکت کنه، میگیم یک نود سوآرم.
نودها توی سوآرم به دو دسته منیجر و ورکر تقسیم میشن.
نود ورکر به نودی میگیم که تسک هارو از نود منیجر میگیره و اجراشون میکنه و هیچ دیدی از وضعیت کلاستر نداره و نمیدونه که چی به چی هست. تنها کاری که میکنه اینه که تسکهایی که بهش میدن رو اجرا میکنه.
نودهای منیجر، نودهای هستن که برای مدیریت کلاستر فانکشنهای لازم رو اجرا میکنن تا به حالت مطلوب یا Desired State برسیم. نودهای منیجر بین خودشون نوعی فرآیند انتخاب لیدر رو انجام میدن و یک لیدر رو برای مشخص کردن تسکها و مدیریت کلاستر انتخاب میکنن. الگوریتمی که ازش استفاده میکنن الگوریتم raft هست و اصطلاحا کوآروم دارن. به صورت خلاصه داستان اینه که باید تعداد اعضا حتما بیشتر از نیمی از اعضای کلاستر باشه. یعنی اینکه اگر ما ۳ تا نود مستر داشته باشیم باید حتما ۲ تا از آنها در دسترس باشه تا کلاستر به درستی کار کنه به این میگن quorum که خیلی مهمه که بهش دقت کنیم. پس با توجه به این موضوع ما نیاز داریم که تعداد اعضا فرد باشه تا بتونیم failover بهتری داشته باشیم. عدد ۳ و ۵ خیلی خوبه و بیشتر از ۷ اصلا توصیه نمیشه چون هزینهی سینک مستر نودها باهم خیلی زیاد میشه.
به کانتینرهایی که توی سوآرم تعریف میکنیم تا روی نودهای مختلف اجرا بشن، service میگیم. ایجاد سرویس داخل swarm با خود داکر تفاوتی نداره و تنها چندین قابلیت بیشتر اینجا خواهیم داشت که در ادامه بهش میپردازیم. به صورت کلی هر سرویس داخل swarm به چندین task تبدیل میشه که با توجه به شرایط taskهای ما روی نودهای مختلف اجرا میشه که نتیجهی آن بالا آمدن کانتینرها داخل نودهای مختلف هست.
اگه بخوایم تعدادی کانتینر از روی سرویسمون بالا بیاریم یا اصطلاحا اون رو اسکیل کنیم، میتونیم توی desired state که برای سوآرم مشخص میکنیم تعداد replica رو دقیق بگیم تا به همون تعداد کانتینر برای ما بالا بیاره که به این حالت replicated service میگیم و اکثرا برای اپلیکیشن های stateless کاربرد داره. نوع دیگه ای از سرویس رو هم داریم به نام global service که توی این حالت سوآرم داخل هر نود در دسترسی که توی کلاستر داشته باشه یک کانتینر از سرویسی که داریم برامون بالا میاره مثل مواردی که نیاز داریم روی نودهای خودمون agent برای مانیتورینگ و لاگینگ داشته باشیم.
وقتی شما دارید از مالتی نود و اصطلاحا Orchestration صحبت میکنید دیگه نمیتونید برای کانفیگها و سکرتهای خودتون به یه جا اشاره کنید. به عبارتی دیگه وقتی شما نودهای خودتون رو توزیع کردید باید کانفیگها و سکرتهای خودتون رو هم توزیع کنید. برای این کار ما امکان سکرت و کانفیگ رو داریم که با استفاده از آن میتونیم کانفیگ فایلهای خودمون رو تعریف کنیم و همانند یه نتورک یا والیوم آنها رو بسازیم و بعدش تو سرویسهایی که بهش نیاز داره ازشون استفاده کنیم. شبیه هم هستن با این تفاوت که سکرتها encode میشن و هر جا که بهش نیاز داشت ارسال میشه ولی کانفیگها به صورت Plaintext هستند و در تمامی نودها کپی میشوند.
منیجر سوآرم از ingress load balancing برای اکسپوز کردن سرویس هایی که میخوایم دسترسی از بیرون به اونها داشته باشیم استفاده میکند همچنین میتواند به صورت خودکار پورت پابلیش از رنج ۳۰۰۰۰ تا ۳۲۷۶۷ را به سرویس ما اختصاص دهد اگر که خودمون پورت خاصی رو برای پابلیش انتخاب نکرده باشیم. سوآرم از همان DNSسرور داخلی بهره میگیره که برای سرویسهای ما رکورد تعریف میکند که بر اساس اون سوآرم با استفاده از internal load balancing درخواست هایی که سمت سرویس مون میاد رو بین کانتینر های مختلف توی کلاستر پخش میکنه. نکتهی مهم اینه که به جز پابلیش کردن پورت و استفاده از این قابلیت سرویس دیسکاوری که داره موارد دیگه رو نمی تونیم کانفیگ و استفاده کنیم و باید به همین موارد اکتفا کنیم.
یک نکتهی مهم اینکه وقتی ما یه پورت رو پابلیش میکنیم روی تمامی نودهای کلاستر swarm اون پورت publish میشه. حالا چه کانتینر داخل اون نود باشه و چه نباشه. در صورتی که درخواست ما به آن سرور برسه از طریق لودبالانسر داخلی swarm درخواست ما رو میگیره و به کانتینر مقصد میرسونه. تو تصویر بالا این موضوع به خوبی نمایش داده شده است.
برای ست آپ کلاستر ابتدا نیاز به هاستهایی داریم که روی آنها داکر انجین با نسخه ۱.۱۲ یا بالاتر باشه و بتونن توی شبکه با هم در ارتباط باشن. همچنین باید بین سرورها پورتهای زیر باز باشه و به هم دسترسی داشته باشند:
اگر هم میخواید که ترافیک شبکه overlay شما به صورت رمز شده یا encrypted باشه، نیاز دارید که مطمئن شید ترافیک ip protocol 50 ESP توی شبکه شما مجاز هست.
با دستور docker swarm init میتونید داکر هاستی که دارید رو به مود سوآرم ببرید و با استفاده از دستورات راهنمایی که بهتون نشون میده و توکن هایی که میده نودهای منیجر یا ورکر بعدی رو به کلاسترسون اضافه کنید.
به صورت کلی ستاپ اولیه و کار با کلاستر swarm خیلی خیلی ساده و راحته و به همون اندازه که ساده و کار باهاش راحت هست قابلیتهای خیلی کمتری هم در اختیار شما میگذاره. یکی از دلایل سادگی swarm اینه که همه چیز رو خود داکر داره مدیریت میکنه و اجازه نمیده که شما خودتون آنها رو مدیریت کنید. این موضوع درسته باعث سادگی خیلی زیادی شده اما از اون سمت هم دست و پای ما رو بسته و اجازه نمیده که بیشتر موارد رو مدیریت کنیم و ورود کنیم. تقریبا میشه گفت معمولا این طوری هست که هر چی به سمت سادگی و راحتی کار بریم از اون سمت قدرتمون هم کم میشه و دیگه نمیتونیم تغییراتی که مد نظرمون هست رو انجام بدیم.
درین نود:
نودهای فعال توی سوآرم در حالت ACTIVE هستند و منیجر میتونه تسکهاش رو به هر نود ACTIVE که توی کلاستر داره بده اما گاهی پیش میاد که میخوایم روی یک نود تغییرات سیستمی بدیم یا آپدیتی انجام بدیم و موارد مشابه که بهش میگیم maintenance time توی این مواقع حالت نود رو به DRAIN تغییر میدیم که این حالت جلوگیری میکنه از اومدن تسک های جدید یعنی چیز جدیدی روش schedule نمیشه و هم به این معناست که منیجرها باید تسک های قبلی روی این نود رو استاپ کنند و اونها رو روی نودهای در دسترس دیگه ببرن تا زمانیکه کارمون رو انجام بدیم و دوباره نود رو به حالت ACTIVE برگردونیم.
ارتباط بین نودها داخل swarm به صورت کامل با استفاده از certificate که مستر نود اول ایجاد میکنه و بعد با بقیهی مستر نودها به اشتراک میگذاره کاملا encrypt شده است. هیچ ارتباطی اینجا به صورت Plaintext نیست و تمام ارتباطات رمزنگاری شده. شما میتونید این سرتیفیکیتها رو در مسیر زیر ببینید.
/var/lib/docker/swarm/certificates
نودهای مستر بین خودشون یه db رو هم سینک میکنند که توی آن مشخصات و مختصات taskها رو نوشتن و دارند و با استفاده از آن میدونند که چه تسکی روی کدوم نود در حال اجرا هست و با از دست رفتن آن نود میتونند taskهای آن رو روی نودهای دیگه اجرا کنند. این db در مسیر زیر قرار داره.
/var/lib/docker/swarm/worker/tasks.db
در ادامه کامندهایی که در زمان swarm در دسترس ما هستند رو یه مروری باهم میکنیم.
docker swarm mode commands: These commands works with the Swarm orchestrator
config: Manage Docker configs
service: Manage services
stack: Manage Docker stacks
swarm: Manage Swarm
secret: Manage secret
node: Manage nodes
docker swarm: Manage Swarm cluster
ca: Display and rotate the root CA
init: Initialize a swarm
join: Join a swarm as a node and/or manager
join-token: Manage join tokens
leave: Leave the swarm
unlock: Unlock swarm
unlock-key: Manage the unlock key
update: Update the swarm
docker node: Manage nodes
demote: Demote one or more nodes from manager in the swarm
inspect: Display detailed information on one or more nodes
ls: List nodes in the swarm
promote: Promote one or more nodes to manager in the swarm
ps: List tasks running on one or more nodes, defaults to current node
rm: Remove one or more nodes from the swarm
update: Update a node
docker secret: Manage secret
create: Create a secret from a file or STDIN as content
inspect: Display detailed information on one or more secrets
ls: List secrets
rm: Remove one or more secrets
docker config: Manage Docker configs
create: Create a config from a file or STDIN
inspect: Display detailed information on one or more configs
ls: List configs
rm: Remove one or more configs
docker service: Manage services
create: Create a new service
inspect: Display detailed information on one or more services
logs: Fetch the logs of a service or task
ls: List services
ps: List the tasks of one or more services
rm: Remove one or more services
rollback: Revert changes to a service's configuration
scale: Scale one or multiple replicated services
update: Update a service
docker stack: Manage Docker stacks
deploy: Deploy a new stack or update an existing stack
ls: List stacks
ps: List the tasks in the stack
rm: Remove one or more stacks
services: List the services in the stack
مراقب خودتون باشید. 🌹🐳🌹
خوبه که داکرمی رو تو جاهای مختلف فالو کنید. پذیرای نظرات شما هستیم.
🫀 Follow DockerMe 🫀
🔔 Follow YouTube 🔔
📣 Follow Instagram 📣
🖇 Follow LinkedIn DockerMe🖇
🔎 Follow Linkedin Ahmad Rafiee 🔎
🕊 Follow Twitter 🕊