WIUNIX ACADEMY
عیبیابی CrashLoopBackOff و OOMKilled در Kubernetes؛ از شواهد تا رفع علت
صفحهٔ 2 از 3؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من7 مقدار قابلتغییر
قدم بعدی
بررسی کنید پروب واقعاً شکست خورده یا زمان کافی نداشته است
شکست پروب liveness یا startup میتواند به اجرای دوبارهٔ کانتینر منجر شود. شکست readiness معمولاً فقط اعلام آمادگی را تغییر میدهد و بهخودیخود فرایند را متوقف نمیکند. اگر شروع برنامه واقعاً زمانبر است، startup probe فرصت لازم را پیش از فعالشدن liveness فراهم میکند. مسیر درخواست، پورت، پروتکل و مهلت پاسخ را با رفتار واقعی برنامه زیر بار بسنجید. حذف پروب یا ساختن پاسخ موفقِ صوری، علت خرابی را برطرف نمیکند.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
kubectl --context='lab' -n 'academy-lab' get deployment 'api' -o jsonpath='{range .spec.template.spec.containers[*]}{.name}{"\nresources="}{.resources}{"\nliveness="}{.livenessProbe}{"\nreadiness="}{.readinessProbe}{"\nstartup="}{.startupProbe}{"\n\n"}{end}'تنظیمات پروب و رویدادهای شکست با مدت شروع و سلامت واقعی برنامه مقایسه شده باشند؛ فرضیهٔ نامعتبر را کنار بگذارید.
قدم بعدی
کمبود حافظهٔ کانتینر را از فشار روی نود جدا کنید
مصرف فعلی حافظه الزاماً همان اوجی نیست که باعث توقف شده است. ممکن است Metrics Server نصب نباشد یا جهش کوتاه میان دو نمونهبرداری رخ داده باشد. درخواست و سقف حافظه، پیشفرضهای فضای نام، سهمیهها و شرایط نود را همراه نمودارهای تاریخی بررسی کنید. افزایش request روی زمانبندی اثر میگذارد؛ افزایش limit فقط فضای بیشتری میدهد و نشت حافظه را درمان نمیکند. اگر نود تحت فشار است یا Pod تخلیه شده، بررسی ظرفیت و جانمایی بار را با مسئول کلاستر ادامه دهید. نام نود را از خروجی واقعی بگیرید و در فرم وارد کنید.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
kubectl --context='lab' -n 'academy-lab' top pod 'api-example' --containers
kubectl --context='lab' -n 'academy-lab' get limitrange,resourcequota
kubectl --context='lab' get nodes
kubectl --context='lab' -n 'academy-lab' get events --field-selector involvedObject.name='api-example' --sort-by=.metadata.creationTimestamp
kubectl --context='lab' get pod 'api-example' -n 'academy-lab' -o jsonpath='{.spec.nodeName}{"\n"}'
# Replace the node name below with the observed .spec.nodeName.
kubectl --context='lab' describe node 'worker1'شواهد توقف ناشی از سقف حافظه، تخلیهٔ Pod از نود یا نبود اطلاعات کافی از هم جدا شده باشند. نبود متریک را صریحاً «نامشخص» ثبت کنید.
قدم بعدی
مشخص کنید Pod را کدام منبع و کدام نسخه ایجاد کرده است
رابطهٔ Pod با ReplicaSet و Deployment را از ownerReferences دنبال کنید. StatefulSet، Job، Pod ایستا و منابع تحت مدیریت اپراتورها شیوهٔ بازیابی دیگری دارند؛ فرمان بازگشت این راهنما برای آنها نیست. شناسهٔ ایمیج، تغییر تنظیمات و تاریخچهٔ انتشار را مقایسه کنید. محتوای Secret یا مقادیر محرمانهٔ محیط اجرا را وارد گزارش نکنید.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
kubectl --context='lab' -n 'academy-lab' get pod 'api-example' -o jsonpath='{.metadata.ownerReferences}'
kubectl --context='lab' -n 'academy-lab' rollout history deployment/'api'
kubectl --context='lab' -n 'academy-lab' get deployment 'api' -o jsonpath='{range .spec.template.spec.containers[*]}{.name}{" "}{.image}{"\n"}{end}'Deployment مسئول و تغییر نسخهٔ مرتبط با شروع مشکل مشخص شده باشند.
اصلاح را به علت اثباتشده محدود کنید
اگر برنامه با خطا خارج میشود، تنظیم نامعتبر، در دسترس نبودن یکی از سرویسهای وابسته یا ایمیج ناسازگار را در منبع اصلی پیکربندی اصلاح کنید. در کمبود حافظه، نگهداری نامحدود داده و همزمانی را بررسی کنید و اندازهٔ حافظه را بر اساس اندازهگیری تعیین کنید. در شکست پروب فقط تنظیمی را تغییر دهید که نادرستی آن روشن شده است. فشار روی نود به تصمیم مسئول کلاستر دربارهٔ ظرفیت و توزیع بار نیاز دارد.
هر بار یک فرضیه را آزمایش کنید. تفاوت مانیفست را بازبینی کنید و تغییر را از مسیر انتشار معمول سرویس پیش ببرید. ویرایش زندهای که GitOps بلافاصله برمیگرداند، مبنای مناسبی برای نتیجهگیری نیست. یک عدد ثابت برای حافظه یا تأخیر شروع، پاسخ همهٔ برنامهها نیست.
قدم بعدی
رفع مشکل را در یک بازهٔ معنیدار زیر بار تأیید کنید
پس از انتشار تغییر تأییدشده، تکمیل rollout و وضعیت Podهای جایگزین را بررسی کنید. از کلاینت مجاز، یک کار واقعی برنامه را هم انجام دهید. شمارندهٔ restart از Pod قدیمی به Pod تازه منتقل نمیشود؛ UID و مقدار اولیهٔ شمارندهٔ Pod تازه را ثبت کنید و پس از مدت مناسب دوباره بسنجید. Ready بودن بهتنهایی درستکارکردن برنامه یا متوقفشدن رشد حافظه را ثابت نمیکند.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
kubectl --context='lab' -n 'academy-lab' rollout status deployment/'api' --timeout=180s
kubectl --context='lab' -n 'academy-lab' get pods -o wide
kubectl --context='lab' -n 'academy-lab' get deployment 'api' -o jsonpath='{.status.availableReplicas}{" available / "}{.spec.replicas}{" desired\n"}'تعداد نمونههای دردسترس به مقدار مطلوب رسیده باشد، کار واقعی برنامه موفق شود و توقف یا رشد نامعمول حافظه در بازهٔ مشاهده تکرار نشود.
قدم بعدی
تنها به نسخهای برگردید که سازگاری آن روشن است
بازگشت نسخه اقدامی اختیاری است و خود یک انتشار تازه ایجاد میکند. فقط با تأیید مسئول سرویس و پس از بررسی سازگاری نسخهٔ قبلی با داده و ساختار فعلی، شمارهٔ نسخهٔ سالم را انتخاب کنید. تاریخچهٔ Deployment نسخهٔ پشتیبان پایگاه داده، دیسک پایدار یا تنظیمات بیرونی نیست. اگر سازگاری روشن نیست، طبق برنامهٔ مهار حادثه عمل کنید.
خط فرمان؛ فقط در محیطی که مجوز بررسی آن را دارید
kubectl --context='lab' -n 'academy-lab' rollout undo deployment/'api' --to-revision='2'
kubectl --context='lab' -n 'academy-lab' rollout status deployment/'api' --timeout=180sنسخهٔ انتخابشده منتشر شده باشد؛ سپس بررسی عملکرد برنامه، شمارندهٔ توقف و مصرف منابع را دوباره انجام دهید.