اختصاص منابع و استفاده بهینه از منابع، چالشی است که همیشه در دنیای سیستمهای توزیع شده وجود داشته است. در دنیای کوبرنتیس، هر لحظه ممکن است سرویسهایی که تیمهای مربوطه روی آنها کار میکنند، ریستارت شوند. با شناختی که از سرویس فوق داریم، برنامهریزی میکنیم که روی ماشینهایی با خصوصیت خاصی قرار گیرند. به عنوان مثال، ممکن است سرویسی داشته باشیم که نیاز دارد روی ماشینهایی با مقدار 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 affinity:
برای مشخص کردن پارامتر node affinity تنها معیاری که باید به آن توجه کنیم label مربوط به node pool ها هستند.
با دستور زیر به راحتی میتونیم label مربوط به node ها چک کنیم.
kubectl get node <node-name> --show-labels=true
در ادامه قصد داریم انواع node affinity را بررسی کنیم:
این 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
این 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 شود.
در پایان، خواهشمندیم اگر نظری برای بهبود این مقاله دارید، با من در میان بگذارید.