nodelocaldns dial tcp 10.233.0.3:53: i/o timeout

Чудесная ошибка nodelocaldns

dial tcp 10.233.0.3:53: i/o timeout

Исходные данные

10.233.0.3, как наверное понятно из контекста — это DNS сервер кластера. Обычно этот IP используется при установке кластера кубернетес при помощи kubespray. На самом деле — это сервис типа ClusterIP, который перекидывает данные на два пода coredns. В системе это выглядит как то так:

# ipvsadm -Ln | grep -A2 10.233.0.3
TCP 10.233.0.3:53 rr
  -> 10.233.65.9:53 Masq 1 0 32
  -> 10.233.66.210:53 Masq 1 0 32

nodelocaldns, установленные на нодах кластера, пытаются до него достучаться по протоколу tcp.

Когда появляется ошибка

После добавления новой ноды в кластер при помощи kubespray. Что то типа такого:

 # ansible-playbook -i inventory/my-cluster/inventory.ini scale.yml

После этого все поды на новой ноде перестанут резолвить DNS имена. При этом прямое обращение по IP к coredns будет работать.

# telnet 10.233.65.9 53
Trying 10.233.65.9...
Connected to 10.233.65.9.
Escape character is '^]'.
Connection closed by foreign host.

А вот обращение на IP сервиса уже нет.

Как лечить

При добавлении ноды в кластер никогда не используйте scale.yml. Пользуйтесь только cluster.yml, Т.е. добавили новую ноду в инвентори файл и сразу cluster.yml.

Если всё же сначала сделали scale и получили ошибку, просто перезапустите плейбук cluster.yml. И все станет хорошо.