آشنایی با مفهوم Node affinity در کوبرنتیس

اختصاص منابع و استفاده بهینه از منابع، چالشی است که همیشه در دنیای سیستم‌های توزیع شده وجود داشته است. در دنیای کوبرنتیس، هر لحظه ممکن است سرویس‌هایی که تیم‌های مربوطه روی آن‌ها کار می‌کنند، ریستارت شوند. با شناختی که از سرویس فوق داریم، برنامه‌ریزی می‌کنیم که روی ماشین‌هایی با خصوصیت خاصی قرار گیرند. به عنوان مثال، ممکن است سرویسی داشته باشیم که نیاز دارد روی ماشین‌هایی با مقدار RAM بسیار بالا اجرا شود. یا ممکن است نیاز داشته باشیم که روی سروری اجرا شود که GPU داشته باشد. در اینجاست که باید با مفهومی به نام node affinity آشنا شویم.در ادامه به صورت دقیق‌تر این مفهوم را در کوبرنتیس بررسی خواهیم کردابتدا با چند تعریف اولیه شروع می‌کنیم: تعریف node affinity: در دنیای کوبرنتیس، node affinity مکانیزمی است که مشخص می‌کند Pod مربوط به سرویسی که داریم، در کدام ماشین(node) در داخل کلاستر schedule شود . تعریف Pod: در کوبرنتیس، Pod کوچکترین کامپوننتی است که وظیفه اجرای سرویس ما در Container را دارد. کوبرنتیس نیز وظیفه مدیریت Pods را بر عهده دارد.در ادامه node affinity را با جزییات بیشتری بررسی می‌کنیم:ممکن است نیاز داشته باشیم سرویسی را در node pool خاصی در کلاستر کوبرنتیس مستقر کنیم. این مکانیزم به ما امکان می‌دهد اطمینان حاصل کنیم که Pod مورد نظر ما در محیط مناسب از نظر region یا data center و روی ماشین های خاصی مستقر شود.مزایایی استفاده از node affinity:استفاده بهینه از منابع: به کمک این مکانیزم میتوان با شناخت مولفه های سرویسی خود، Node یا node pool خاصی را برای مستقر سرویس مورد نظر انتخاب کنیم.در دسترس بودن سرویس: به کمک node affinity میتوان تضمین نمود سرویس مورد نظر در node pool های خاصی مستقر شده اند.معایب استفاده از node affinity:کند بودن scalability: با توجه به این که نیاز است pod ها روی node pool های خاصی schedule شوند. پس برای افزایش منابع و یا تعداد pod ها نیاز است node جدیدی به کلاستر اضافه شود و فرایند اضافه کردن node ممکن است زمانبر و پیچیدگی خاص خود را داشته باشد.افزودن پیچیدگی: با اضافه کردن مکانیزم فوق به کلاستر ممکن است اشخاصی maintenance کلاستر را در اختیار بگیرد. و درصورتی با این مفهوم آشنایی نداشته باشند. کار دشواری در پیش خواهند داشت.برای مشخص کردن پارامتر node affinity تنها معیاری که باید به آن توجه کنیم label مربوط به node pool ها هستند.با دستور زیر به راحتی میتونیم label مربوط به node ها چک کنیم.kubectl get node <node-name> --show-labels=trueدر ادامه قصد داریم انواع node affinity را بررسی کنیم:روش RequiredDuringSchedulingIgnoredDuringExecution :این type از node affinity که به hard affinity هم معروف هست. نشان میدهد.درصورتی label مربوط به node pool وجود نداشته باشد. Pod های که با این label مشخص شده schedule نمی شوند.در manifest زیر pod ها روی node های schedule می شوند که label آن disktype=ssd باشد.affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd روش PreferredDuringSchedulingIgnoredDuringExecution:این type از node affinity که به soft affinity هم معروف هست. نشان میدهد.درصورتی label مربوط به node pool در کلاستر وجود نداشته باشد. Pod های که با این label مشخص شده روی سایر node ها schedule می شود.در manifest زیر pod ها روی node های schedule می شوند که label آن disktype=ssd باشد.درصورتی که node pool ای با این label وجود نداشته باشد. روی سایر node ها schedule می شوند.affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: disktype operator: In values: - ssdو در انتها سرویسی رو کوبرنتیس نصب خواهیم کرد و با اعمال node affinity، مشخص خواهیم کرد در کدام node pool ای schedule شود.در پایان، خواهشمندیم اگر نظری برای بهبود این مقاله دارید، با من در میان بگذارید.