Узел в NotReady, но его Pod всё ещё Running и недоступны — диагностируйте.
Узел перешёл в NotReady, но его поды всё ещё числятся Running и недоступны. Объясните, почему поды всё ещё читаются как Running, что вы проверяете на узле и что с этими подами будет дальше.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-2 NotReady <none> 40d v1.29.3
$ kubectl get pods -o wide --field-selector spec.nodeName=node-2
NAME READY STATUS RESTARTS AGE NODE
web-a1 1/1 Running 0 6h node-2
$ kubectl describe node node-2 | sed -n '/Conditions/,/Events/p'
Ready Unknown KubeletNotReady kubelet stopped posting node status
MemoryPressure Unknown
Диагностируйте и исправьте.
Узел перестал слать статус и стал NotReady; поды всё ещё Running, ведь запись сделана до сбоя — молчит kubelet. Проверяйте узел: мёртвый kubelet, давление диска/памяти или потеря сети до control plane. За таймаутом поды перепланируются.
- ✗Верить устаревшему
Runningна узле, переставшем отчитываться - ✗Считать, что упало приложение, когда сбоит heartbeat kubelet
- ✗Не знать, что поды NotReady-узла вытесняются после таймаута
- →Каков дефолтный таймаут toleration
node.kubernetes.io/unreachableдо вытеснения? - →Как с узла подтвердить, что виноват kubelet, а не сеть?
Решение
1. Почему Running при NotReady
Статус пода в etcd обновляет kubelet узла. Если kubelet перестал слать heartbeat, узел через node-monitor-grace-period (~40s) становится NotReady, а состояние подов замирает на последнем сообщении — отсюда Running, хотя связи с ними нет.
2. Что проверять на узле
$ kubectl describe node node-2 | grep -A1 Ready # KubeletNotReady?
# на узле (если доступен):
$ systemctl status kubelet # процесс жив?
$ df -h ; free -m # DiskPressure / MemoryPressure
$ journalctl -u kubelet -e # почему отвалился
Причины: kubelet упал/завис, давление по диску/памяти, потеря сети до API-сервера.
3. Что дальше с подами
По истечении toleration node.kubernetes.io/unreachable (по умолчанию 300s) поды помечаются на удаление, и контроллер создаёт замену на здоровых узлах. Фикс — вернуть kubelet/сеть или увести узел (drain) и заменить.