برنامه نویسی

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 می تواند با آن تداخل داشته باشد فضای نام حذف

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا