У меня есть кластер с версией k8s 1.12.8
на AWS EC2. Кластер содержит несколько модулей - одни обслуживают веб-трафик, а другие настроены как запланированные CronJobs. Кластер работает нормально в своей текущей конфигурации не менее 6 месяцев, при этом CronJobs запускается каждые 5 минут.
В последнее время CronJobs просто прекратились. Просмотр модулей через kubectl
показывает, что последний запуск всех запланированных CronJobs был примерно в одно и то же время. Журналы, отправленные в AWS Cloudwatch, не содержат сообщений об ошибках и останавливаются в то же время, когда kubectl
отображается для последнего запуска.
Пытаясь диагностировать эту проблему, я обнаружил более широкую картину того, что кластер не реагирует на изменения, например: я не могу получить журналы или узлы через kubectl.
Я удалил модули из наборов реплик, и они больше не возвращаются. Я установил значения автомасштабирования для наборов реплик, и ничего не происходит.
Исследование kubelet
журналов на главном экземпляре выявило повторяющиеся ошибки, совпадающие со временем, когда сбой был впервые обнаружен:
I0805 03:17:54.597295 2730 kubelet.go:1928] SyncLoop (PLEG): "kube-scheduler-ip-x-x-x-x.z-west-y.compute.internal_kube-system(181xxyyzz)", event: &pleg.PodLifecycleEvent{ID:"181xxyyzz", Type:"ContainerDied", Data:"405ayyzzz"}
...
E0805 03:18:10.867737 2730 kubelet_node_status.go:378] Error updating node status, will retry: failed to patch status "{\"status\":{\"$setElementOrder/conditions\":[{\"type\":\"NetworkUnavailable\"},{\"type\":\"OutOfDisk\"},{\"type\":\"MemoryPressure\"},{\"type\":\"DiskPressure\"},{\"type\":\"PIDPressure\"},{\"type\":\"Ready\"}],"conditions\":[{\"lastHeartbeatTime\":\"2020-08-05T03:18:00Z\",\"type\":\"OutOfDisk\"},{\"lastHeartbeatTime\":\"2020-08-05T03:18:00Z\",\"type\":\"MemoryPressure\"},{\"lastHeartbeatTime\":\"2020-08-05T03:18:00Z\",\"type\":\"DiskPressure\"},{\"lastHeartbeatTime\":\"2020-08-05T03:18:00Z\",\"type\":\"PIDPressure\"},{\"lastHeartbeatTime\":\"2020-08-05T03:18:00Z\",\"type\":\"Ready\"}]}}" for node "ip-172-20-60-88.eu-west-2.compute.internal": Patch https://127.0.0.1/api/v1/nodes/ip-x-x-x-x.z-west-y.compute.internal/status?timeout=10s: context deadline exceeded (Client.Timeout exceeded while awaiting headers)
...
E0805 03:18:20.869436 2730 kubelet_node_status.go:378] Error updating node status, will retry: error getting node "ip-172-20-60-88.eu-west-2.compute.internal": Get https://127.0.0.1/api/v1/nodes/ip-172-20-60-88.eu-west-2.compute.internal?timeout=10s: context deadline exceeded (Client.Timeout exceeded while awaiting headers)
Запуск docker ps
на главном узле показывает, что оба контейнера k8s_kube-controller-manager_kube-controller-manager
и k8s_kube-scheduler_kube-scheduler
были запущены 6 дней назад, тогда как другие контейнеры k8s находятся на 8+ месяцев.
tl; dr Контейнер на моем основном узле (вероятно, kube-scheduler
, kube-controller-manager
или оба) умер. Контейнеры вернулись, но не могут связаться с существующими узлами - это мешает выполнению любых запланированных CronJobs или новых развертываний.
Как можно перенастроить kubelet и связанные службы на главном узле, чтобы снова обмениваться данными с рабочими узлами?