Kubernetes Pods Stack in Terminating: A Resolution Guide
میدونی چرا الف غلاف زمان زیادی طول می کشد تا حذف شود یا حتی روی آن هنگ کند Terminating
حالت؟
این پست به شرح غلاف شرایط چرخه زندگی، دلایلی که چرا می توانند در آن معلق بمانند Terminating
وضعیت، و چند نکته برای خلاص شدن از شر آنها.
غلاف خاتمه دادن
دلایل متعددی وجود دارد که چرا Kubernetes Scheduler می تواند یک ظرف سالم را خارج کند. به عنوان مثال، اجرای غلاف با اولویت بالاتر، تخلیه یک گره در طول بهروزرسانی نسخه، یک فرآیند مقیاسبندی خودکار، یک بستهبندی بن منبع، یا یک برنامه ساده kubectl delete
فرمان
Kubernetes خاتمه برازنده ای را برای مواردی که مورد نیاز نیست فراهم می کند غلاف با قلاب چرخه حیات کانتینر. هنگامی که رویداد را دریافت می کند توسط kubelet روی کانتینرهای خاص اجرا می شوند.
وقتی کوبلت می داند که الف غلاف باید اخراج کند، آن را نشان می دهد غلاف حالت به عنوان Terminating
و ارسال ترافیک به آن را متوقف می کند. سپس، آن را اجرا می کند preStop
قلاب چرخه عمر (در صورت موجود بودن). را می فرستد SIGTERM
به فرآیند اصلی (pid 1) در هر ظرف و منتظر پایان آنها می شود. اگر برنامه های داخل کانتینرها به درستی آماده شوند، خاموشی دلپذیری را آغاز می کنند. مدت زمان نباید بیشتر از مدت مشخص شده در spec.terminationGracePeriodSeconds باشد که به طور پیش فرض 30 ثانیه است.
اگر برنامه به درستی خاموش شدن را کامل نکرده باشد، Kubelet یک مهلت تا حذف غلاف آی پی و کشتن کانتینر با ارسال الف SIGKILL
. در این مرحله، Kubernetes را حذف می کند غلاف از سرور API
چرا یک غلاف می تواند بماند Terminating
حالت
شایع ترین دلایل الف غلاف حلق آویز شدن در طول فرآیند اخراج عبارتند از:
- آ نهایی کننده وابستگی
- یک نادرست
terminationGracePeriodSeconds
ارزش
نهایی کننده ها
از اسناد Kubernetes:
فاینالیزرها کلیدهایی با فضای نام هستند که به کوبرنتس می گویند که منتظر بماند تا شرایط خاص پیش از حذف کامل منابع مشخص شده برای حذف، برآورده شود.
نهایی کننده ها برای جلوگیری از حذف تصادفی منابع استفاده می شود. وقتی یک غلاف در حالت خاتمه آویزان است، آن را بررسی کنید metadata/finalizers
.
به عنوان مثال، این مثال دارای یک است کوبرنتیس کلید به عنوان یک نهایی کننده برای فضاهای نام استفاده می شود.
kind: Pod
metadata:
finalizers:
- kubernetes
spec:
containers:
پس از تلاش برای حذف پاد:
kubectl delete pod/mypod &
Kubernetes حذف خود را گزارش خواهد کرد:
kubectl get pod/mypod -o yaml
اتفاقی که افتاد این بود که شی به روز شد، نه حذف شد. این غلاف برای گنجاندن مهر زمانی حذف که آن را در آن نگه می دارد، اصلاح می شود Terminating
حالت.
creationTimestamp: "2023-01-28T15:01:32Z"
deletionGracePeriodSeconds: 0
deletionTimestamp: "2023-01-28T15:01:44Z"
finalizers:
- kubernetes
status:
state:
terminated:
containerID: containerd://b6298f7ee5613b717000bb5a54cf96e70f7f0cb8dd8e1c3c5f9d115b0fbfc7c9
exitCode: 0
finishedAt: "2023-01-28T15:01:44Z"
reason: Completed
startedAt: "2023-01-28T15:01:33Z"
قلاب PreStop و خاتمه GracePeriodSeconds
از اسناد Kubernetes:
اگر یک
PreStop
قلاب در هنگام اجرا آویزان می شود، فاز Pod خواهد بودTerminating
و تا زمانی که غلاف پس از آن کشته می شودterminationGracePeriodSeconds
منقضی می شود.
برای مثال. این پیکربندی:
spec:
terminationGracePeriodSeconds: 3600
containers:
- lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- sleep 3600
را حفظ خواهد کرد غلاف در Terminating
به مدت 1 ساعت حالت دهید.
رسیدگی به آن ضروری است SIGTERM
به درستی و اطمینان حاصل کنید که زمانی که kubelet برنامه را ارسال می کند، برنامه به خوبی خاتمه می یابد SIGTERM
به ظرف
Finalizers را حذف کنید
تعیین کنید که آیا علت آن Terminating
حالت برای یک غلاف، فضای نام، یا پی وی سی هست یک نهایی کننده. یک مثال نهایی کننده برای محافظت از PVC در برابر حذف می باشد kubernetes.io/pvc-protection
.
برای حذف غلاف، آن را در خط فرمان وصله کنید تا حذف شود نهایی کننده ها:
kubectl patch pod/mypod --type=json -p '[{"op": "remove", "path": "/metadata/finalizers" }]'
یا
kubectl patch pod/mypod -p '{"metadata":{"finalizers":null}}'
از وقتی که نهایی کننده لیست خالی است، شی را می توان توسط Kubernetes بازیابی کرد و در یک صف قرار داد تا از رجیستری حذف شود.
حذف اجباری POD
اسناد Kubernetes ادعا می کند که حذف را مجبور می کند انجام ندهید منتظر تایید از kubelet باشید که غلاف فسخ شده است. از آن با احتیاط و به عنوان یک راه حل استفاده کنید:
kubectl delete pod/mypod --grace-period=0 --force
اضافی: نهایی کننده هایی که ارتقاء Kubernetes را مسدود می کنند
یک یا تعداد زیادی از منابع یا در دسترس بودن گره Cluster شما می تواند باعث بیرون راندن Pod شود.
Kubelet منابعی مانند حافظه، فضای دیسک و inode های سیستم فایل را در گره های خوشه شما نظارت می کند. هنگامی که یک یا چند مورد از این منابع به سطوح مصرف خاصی می رسند، کوبلت می تواند فعالانه یک یا چند مورد را از کار بیندازد غلاف روی گره برای بازیابی منابع و جلوگیری از گرسنگی.
در طول بهروزرسانی نسخه کلاستر، تخلیه گره خود را بررسی کنید:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster Ready,SchedulingDisabled control-plane 12m v1.26.1
وضعیت خود را بررسی کنید غلاف با:
kubectl get *Pods* -A
NAMESPACE NAME READY STATUS RESTARTS AGE
default mypod 0/1 Terminating 0 5m42s
kube-system etcd-minikube 1/1 Running 0 14m
kube-system kube-apiserver-minikube 1/1 Running 0 14m
kube-system kube-controller-manager-minikube 1/1 Running 0 14m
kube-system kube-proxy-5dwnf 1/1 Running 0 14m
kube-system kube-scheduler-minikube 1/1 Running 0 14m
بررسی غلاف نهایی کننده مثل همیشه:
kubectl get pod/mypod -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2023-01-29T14:12:38Z"
deletionGracePeriodSeconds: 0
deletionTimestamp: "2023-01-29T14:13:28Z"
finalizers:
- kubernetes
و در صورت نیاز پچ کنید:
kubectl patch pod/mypod -p '{"metadata":{"finalizers":null}}'
نتیجه
اگر کامپوننت Kubernetes را پیدا کردید که در آن گیر کرده است Terminating
، در صورت وجود جزء بررسی کنید نهایی کننده از حذف آن محافظت می کند. چه برای یک غلاف، پی وی سی، یا فضای نام.
یک مثال خوب برای به خاطر سپردن دستورالعمل های حذف نصب است KEDA
عملگر برای یک خوشه Kubernetes در اینجا، جایی که scaledobjects می تواند با آن تداخل داشته باشد فضای نام حذف