← شروع آموزش

WIUNIX ACADEMY

پاد Evicted در Kubernetes؛ فشار نود رو از OOM و زمان‌بندی جدا کن

صفحهٔ 3 از 3؛ قبل از ادامه، مراحل قبلی و چیزهایی رو که لازم داری مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخهٔ سرورت رو انتخاب کن تا مراحل، دستورها و راه‌حل‌های همون محیط رو ببینی.

Arch Linux rollingبررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه رو با مشخصات سرورت عوض کن تا متن و دستورها با هم تغییر کنن. رمز، کلید خصوصی و توکن اینجا وارد نکن. مقدارها فقط توی همین زبانه می‌مونن و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شن. قبل از اجرا، DNS، گواهی‌ها و تنظیمات دسترسی شبکه رو روی سرورت بررسی کن.

اگر آی‌پی، دامنه یا پورت‌های نمونه با سرورت فرق دارن، بخش تنظیمات پایین رو باز کن. مقدارها رو عوض کن و «اعمال در آموزش» رو بزن؛ بعد دستورهای تازه رو کپی کن.

تنظیم مقادیر برای محیط من3 مقدار قابل‌تغییر
11

قدم بعدی

اختیاری: عدد جاری CPU و حافظه رو با محدودیتش بخون

این شاخه فقط وقتی است که API metrics موجود و مجاز باشه. پاد انتخاب‌شده باید هنوز وجود داشته باشه و برای نمونهٔ جاری به‌اندازهٔ کافی فعال باشه. برای شیء Evicted، آگاهانه هویت جایگزین واقعی رو انتخاب کن یا از پایش تاریخی موجود کمک بگیر. نبود metric یعنی مصرف صفر نیست.

kubectl top نمای اخیر CPU و حافظه از مسیر metrics است، نه کل محاسبهٔ eviction در kubelet. بایت دیسک، inode و PID آزاد و نقشهٔ کامل فایل‌سیستم رو نمی‌ده؛ نمونهٔ بعد از رفع مشکل هم ممکنه اوج مصرف رو نبینه. از روی همین یک نما آستانهٔ eviction رو تنظیم نکن.

bash

همان شل Bash مجاز روی میزبان مدیریت

date -u +%FT%TZ
k top node 'worker-a'
k top pod 'example-app' -n 'apps' --containers
از کجا بفهمم درست انجام شده؟

نمونهٔ جاری با هویت و محدودیتش شناخته شده و از اوج تاریخی و سیگنال دیسک/inode/PID جداست.

برای همان منبع، شاهد مناسب بخواه

در حافظه، محاسبهٔ memory.available توسط kubelet با یک عدد دلخواه free یا limit کانتینر قابل‌جایگزینی نیست. برای دیسک، اول بدونیم هر نام به چه چیزی اشاره می‌کنه: nodefs فایل‌سیستم اصلی نود برای کارهایی مثل دادهٔ محلی، emptyDir دیسکی و لاگ است؛ imagefs فضای اختیاری imageهاست و اگر containerfs جدا نباشه، لایهٔ نوشتنی کانتینر رو هم نگه می‌داره. containerfs در چیدمان جداشدهٔ پشتیبانی‌شده برای لایه‌های نوشتنی به کار می‌ره. آستانهٔ بایت و inode رو جدا بخون و وجود این چیدمان رو از runtime، قابلیت نسخه و mount واقعی تأیید کن؛ دو یا سه نام می‌تونن به همان فایل‌سیستم زیرین اشاره کنن و الزاماً دیسک فیزیکی جدا نیستن.

لایهٔ نوشتنی کانتینر، لاگ و emptyDir دیسکی می‌تونن در ذخیره‌سازی محلی موقت نقش داشته باشن؛ emptyDir حافظه‌ای به‌جاش حافظه مصرف می‌کنه. PIDPressure از شناسهٔ پردازشِ در دسترس می‌گه، نه مصرف CPU. از مسئول نود، آستانهٔ مؤثر همان نسخهٔ kubelet، مهلت حالت soft، روش آزادسازی، رزرو منبع و اندازه‌گیری تاریخی متناظر رو با runbook موجود بخواه.

پیش‌فرض upstream رو برای همه فرض نکن و از OS میزبان مدیریت هم این تنظیم‌ها رو نتیجه نگیر. اینجا فرمان شل نود، دریافت proxy/config، پاک‌کردن cache یا پوشهٔ runtime و تعمیر فایل‌سیستم نمی‌دیم. حذف فایل یا image پشت سر runtime ممکنه برنامهٔ فعال رو خراب کنه و علت رو هم بپوشونه.

بدونیم کدام تضمینِ اختلال اینجا برقرار است

eviction ناشی از فشار نود تصمیم kubelet است و با Eviction API در کار مدیریتی فرق داره. PodDisruptionBudget جلوی کمبود منبع از پاد محافظت نمی‌کنه. آستانهٔ hard می‌تونه با مهلت صفر فوری متوقف کنه؛ رسیدگی به آستانهٔ soft هم به سیاست مهلت تنظیم‌شدهٔ eviction محدود می‌شه، نه قول همیشگیِ رعایت مهلت معمول خود پاد.

scheduler با شرط و taint می‌تونه از نود پرفشار دوری کنه، ولی kubelet هنوز ممکنه بعد از تخصیص نود پاد رو نپذیره. toleration فقط اجازهٔ بررسی جای‌گیری می‌ده؛ حافظه رزرو نمی‌کنه و فشار رو رفع نمی‌کنه. اولویت و preemption در scheduler برای جا بازکردن به پاد تازه است؛ انتخاب پاد برای eviction هنگام فشار نود، تصمیم جداگانهٔ kubelet است. برای جابه‌جاکردن هشدار، taint رو پاک نکن، toleration گسترده نده، اولویت رو بالا نبر و نود رو کورکورانه drain نکن.

با مسئول واقعی، یک اقدام قابل‌برگشت برای بار انتخاب کن

در رشد پایدار بار، مسئول برنامه ممکنه هم‌زمانی batch قابل‌شروع‌مجدد رو کم کنه یا request/limit رو از منبع استقرار خودش اصلاح کنه؛ اثر روی سرعت و صف عقب‌افتاده و مقدار قبلی باید معلوم باشه. برای ظرفیت نود یا فشار runtime/فایل‌سیستم، مسئول نود و ذخیره‌ساز بر اساس اندازه‌گیری واقعی برنامهٔ پشتیبانی‌شدهٔ ظرفیت یا آزادسازی رو انتخاب می‌کنه. برچسب Evicted به‌تنهایی فرمان عمومی برای هیچ‌کدام نمی‌ده.

فرایند مهمی که داده تغییر می‌ده، قبل از جابه‌جایی یا قطع‌شدن به روش سازگاری داده، quorum، fencing و شروع/بازیابی خودش نیاز داره. اول ظرفیت جایگزین رو هماهنگ کن. حذف، drain یا eviction کور، detach اجباری، پاک‌کردن پوشهٔ runtime، بالابردن آستانهٔ eviction یا خاموش‌کردن حفاظت می‌تونه فشار قابل‌حل رو به از دست‌رفتن داده یا قطعی گسترده تبدیل کنه.

اگر اقدام مصوب خطا رو بیشتر کرد یا مشکل رو به نودهای دیگر برد، تنظیم قبلیِ ثبت‌شده رو از همان مسیر مالک برگردون و کارهای در صف یا تکرارشده رو رسیدگی کن. برگشت request یا تنظیم scheduler، پاد متوقف‌شده رو زنده نمی‌کنه و اثر بیرونی برنامه رو هم معکوس نمی‌کنه.

نبود مدرک رو نتیجهٔ منفی حساب نکن

هر پنل فقط وضعیت رو می‌خونه. زمان، UID و پیام شکست اولیه رو نگه دار و دید نود یا عرضه‌کنندهٔ غایب رو به مسئولش بسپار؛ برای ساخت شاهد تازه، مجوز رو کلی باز نکن و شکست تولید نکن.

پاد Pending است ولی Evicted نشده

شرط زمان‌بندی و نود تخصیص‌یافته رو ببین. کمبود ظرفیت درخواستی، affinity، اتصال ذخیره‌ساز و admission یک مرحله نیستن. اگر گیر کار در زمان‌بندی ذخیره‌ساز است، راهنمای PVC رو دنبال کن و حافظه رو حدس نزن.

bash
k get pod 'example-app' -n 'apps' -o jsonpath='{.spec.nodeName}{"\n"}{.status.phase}{"\t"}{.status.reason}{"\n"}{.status.conditions}{"\n"}'
k events -n 'apps' --for 'pod/example-app'
فشار الان false است

زمان شکست رو کنار زمان تغییر شرط فعلی نگه دار. ممکنه eviction یا آزادسازی قبل از این نمونه فشار رو رفع کرده باشه. بازهٔ رخداد رو از پایش موجود نود بگیر؛ false الان فشار قبلی رو رد نمی‌کنه.

bash
k get node 'worker-a' -o jsonpath='{range .status.conditions[*]}{.type}{"="}{.status}{"\t"}{.lastTransitionTime}{"\t"}{.reason}{"\n"}{end}'
metrics نیست یا مجوزش رد می‌شه

مجوز و فهرست API رو ببین. درخواست ناموفق، مصرف صفر نیست و اجازهٔ نصب سرویس metrics وسط رخداد هم نمی‌ده.

bash
k auth can-i get nodes.metrics.k8s.io
k api-resources --api-group=metrics.k8s.io
جایگزین ظاهراً سالم است

UID و مرجع مالک و نود واقعی رو مقایسه کن. پاد تازهٔ Running برای بازیابی مفیده، ولی علت فشار نود و سازگاری دادهٔ برنامه هنوز باید تأیید بشن.

bash
k get pod 'example-app' -n 'apps' -o jsonpath='{.metadata.uid}{"\n"}{.metadata.ownerReferences}{"\n"}{.spec.nodeName}{"\n"}{.status.phase}{"\t"}{.status.reason}{"\n"}{.status.conditions}{"\n"}'
k get node 'worker-a' -o jsonpath='{range .status.conditions[*]}{.type}{"="}{.status}{"\t"}{.lastTransitionTime}{"\n"}{end}'
12

قدم بعدی

هم جایگزین رو تأیید کن، هم روند منابع رو

بعد از اقدام جداگانهٔ مصوب، آگاهانه پاد نگه‌داشته‌شده یا جایگزین موردنظر و نود واقعی‌اش رو انتخاب کن. تغییر UID رو ثبت کن و شرط‌ها/رخدادها و بررسی سلامت و دادهٔ موجود برنامه رو دوباره ببین. ظرفیت replica یا quorum مورد انتظار رو با مسئول workload تأیید کن؛ پاد سبز به‌تنهایی بازیابی کل سرویس نیست.

با پایش موجود، بار قابل‌مقایسه رو در بازهٔ مناسب دنبال کن. فشار باید در بودجهٔ پذیرفته‌شدهٔ مسئول بمونه، بدون eviction تکراری، ردشدن admission یا آسیب تازه در جای دیگر. مصرف کمتر چون همهٔ کار قطع شده بازیابی نیست. پنل‌های تشخیصی تنظیمی عوض نکردن؛ شیء ناموفقِ نگه‌داشته‌شده رو هم فقط با روال معمول شواهد و نگهداری تیم جمع کن.

bash

همان شل Bash مجاز روی میزبان مدیریت

k get pod 'example-app' -n 'apps' -o jsonpath='{.metadata.uid}{"\n"}{.metadata.ownerReferences}{"\n"}{.spec.nodeName}{"\n"}{.status.phase}{"\t"}{.status.reason}{"\n"}{.status.conditions}{"\n"}'
k get node 'worker-a' -o jsonpath='{range .status.conditions[*]}{.type}{"="}{.status}{"\t"}{.lastTransitionTime}{"\n"}{end}'
از کجا بفهمم درست انجام شده؟

برنامه و داده با بار قابل‌مقایسه سالم‌اند و بازگشت فشار یا eviction با شواهد زمانی سنجیده شده.

منابع این آموزش

منابع رسمی

بالای صفحه می‌بینی که هر محیط چطور بررسی شده. بررسی مستندات به معنی اجرای عملی همهٔ نسخه‌ها نیست.

ادامهٔ مسیر

قدم بعدی تو

همهٔ آموزش‌های آکادمی ↗