Я щойно бачив, як деякі мої стручки були виселені кубернетами. Що з ними буде? просто бовтатися так, або я повинен видалити їх вручну?
DiskPressure
kubectl describe pods my-pod-name --namespace prod
Я щойно бачив, як деякі мої стручки були виселені кубернетами. Що з ними буде? просто бовтатися так, або я повинен видалити їх вручну?
DiskPressure
kubectl describe pods my-pod-name --namespace prod
Відповіді:
Швидкий обхідний шлях, який я використовую, - це видалення всіх виселених стручків вручну після інциденту. Ви можете використовувати цю команду:
kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c
-a
аргумент недійсний.
Видалення стручків у стані Failed у просторі імен default
kubectl -n default delete pods --field-selector=status.phase=Failed
status.phase=Evicted
. Мені вдалося це зробити kubectl -n default delete pods --field-selector=status.phase!=Running
. Але будьте обережні, це все
kubectl -n default get pods --field-selector=status.phase=Failed
спочатку може бути корисно запустити .
Evicted
стручків для мене.
Виселених стручків слід видаляти вручну. Ви можете використовувати наступну команду для видалення всіх стручків у Error
стані.
kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
Залежно від того, чи було досягнуто поріг м’якого чи жорсткого виселення , контейнери в підстанції будуть припинені з пільговим періодом або без, підпис PodPhase
буде позначений як, Failed
а підстанція видалена. Якщо ваш додаток працює як частина, наприклад, розгортання, буде створений і запланований Kubernetes інший Pod - можливо, на іншому Вузлі, що не перевищує порогові значення виселення.
Врахуйте , що виселення не обов'язково має бути викликано граничними значеннями , але також може бути викликано з допомогою , kubectl drain
щоб звільнити вузол або вручну через API Kubernetes .
kubectl get pods -n mynamespace
kubectl describe pod <pod>
говорить?
kubectl describe
говорить "Статус: Помилка Причина: Виселене повідомлення: Під Вузол мало ресурсу: [MemoryPressure]."
Kube-controller-manager
існує за замовчуванням з робочим встановленням K8s. Схоже, що за замовчуванням максимум 12500 завершених стручків перед тим, як GC запуститься.
Безпосередньо з документації K8s: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager
--terminated-pod-gc -reshold int32 За замовчуванням: 12500
Кількість завершених стручків, які можуть існувати до того, як збирач сміття завершеного стручка почне видаляти завершені модулі. Якщо <= 0, припинений збирач сміття під вимкнено.
kubectl edit pod kube-controller-manager-<master_name> -n kube-system
це видає pod is invalid
помилку після збереження конфігураційного файлу.
На той випадок, якщо хтось хоче автоматично видалити всі виселені стручки для всіх просторів імен:
Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces
OpenShift, еквівалент команди Кальвіна, щоб видалити всі "виселені" стручки:
eval "$(oc get pods --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Failed" and .status.reason == "Evicted") | "oc delete pod --namespace " + .metadata.namespace + " " + .metadata.name')"
Ще одна команда bash для видалення виселених стручків
kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
Щоб Evicted
примусово видалити всі стручки, ви можете спробувати виконати цю однорядкову команду:
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'
Поради: використовуйте p
модифікатор s
команди sed
замість, а e
просто надрукуйте справжню команду, щоб виконати завдання видалення:
$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'
Ось "офіційний" посібник щодо того, як жорстко кодувати поріг (якщо ви не хочете бачити занадто багато виселених стручків): kube-controll-manager
Але відома проблема полягає в тому, як встановити kube-controll-manager ...
Інший спосіб, як і раніше awk
.
Щоб запобігти будь-якій людській помилці, яка могла б звести мене з розуму (видалення бажаних стручків), я перевіряю перед результатом get pods
команди:
kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed
Якщо це виглядає непогано, ось тут:
kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'
Наведена нижче команда видаляє всі невдалі підсистеми з усіх просторів імен
kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod
команда нижче отримає всі виселені підси з простору імен за замовчуванням і видалить їх
kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}
Evicted
стані вже 13 днів. Схоже, що виселених стручків не видаляють (або, можливо, це просто помилка).