Вопрос или проблема
У меня есть кластер k8, основанный на Ubuntu 20.04: 1 мастер и 3 рабочих узла.
Я освободил один из рабочих узлов. Установил пакеты kubectl, iptables, kubeadm, kubelet и containerd на удержание.
Обновление ОС до 22.04 прошло гладко, но после обновления поды (daemon-sets kube-system) постоянно сбоивают. Одна из проблем, которую я обнаружил, заключается в том, что DNS-резолвинг не работает внутри подов на обновлённом узле. Когда я возвращаюсь к Ubuntu 20.04, всё работает нормально. Кто-нибудь может помочь/предложить решение, пожалуйста?
Ответ или решение
Когда вы обновляете операционную систему на рабочем узле Kubernetes с Ubuntu 20.04 до 22.04 и сталкиваетесь с проблемами DNS-резолюции внутри подов, это может быть вызвано несколькими факторами. Проблема с DNS может привести к сбоям и перезагрузкам подов, поскольку многие приложения полагаются на корректное разрешение имен для коммуникации между компонентами. Рассмотрим возможные причины и шаги по их устранению.
Теория
Проблемы с сетевыми настройками и DNS могут возникнуть из-за различных изменений в системах, связанных с обновлением ОС:
-
Изменения в сетевой конфигурации: Обновление до Ubuntu 22.04 может привести к изменениям в конфигурации сетевых интерфейсов, политике брандмауэра (iptables) и настройках DNS. Вероятно, произошли изменения в системном резольвере (например, переход на systemd-resolved) или изменились настройки firewall, влияющие на сетевые подключения.
-
Совместимость компонентов Kubernetes: Неверное взаимодействие между версиями компонентов Kubernetes и новыми системными библиотеками или драйверами может вызвать сбои в работе кластерных сервисов.
-
Политики безопасности и SELinux: С новыми версиями ОС могут быть внесены изменения в политиках безопасности либо активирован SELinux, который может блокировать определенные сетевые вызовы.
Пример
Допустим, вы обновили систему, и сетевые параметры изменились. Например, система могла сменить настройки DNS в /etc/resolv.conf
или автоматизировать DNS через systemd-resolved, обновив конфигурацию сети, но Kubernetes использует другую логику работы с DNS. Если kubelet не помечен как совместимый с вашей новой ОС, это также может быть источником проблемы.
Поэтому возникает ситуация: внутри кластера pod пытается обратиться к DNS-серверу, но запросы не разрешаются, поскольку резольверы либо не настраиваются, либо не взаимодействуют корректно с новой конфигурацией сети.
Применение
Вот ряд действий, которые стоит предпринять для устранения проблемы:
-
Проверка стека сетевой конфигурации:
- Убедитесь, что изменения в сетях (например, создание интерфейсов или правил NAT) не привели к разрыву связи между компонентами кластера.
- Убедитесь, что конфигурация
/etc/resolv.conf
на узле корректна и указывает на правильные DNS-серверы, используемые вашим кластером.
-
Проверка политики iptables:
- Проверьте правила iptables и убедитесь, что они совместимы с кластерами Kubernetes и не блокируют внешний и внутренний трафик.
-
Проверьте совместимость компонентов Kubernetes:
- Убедитесь, что версии
kubeadm
,kubelet
иkubectl
, которые вы используете, совместимы с Ubuntu 22.04. - Перезапустите службы Kubernetes после обновления и проверьте статус модулей с помощью
journalctl
.
- Убедитесь, что версии
-
Диагностика DNS:
- Используйте утилиты вроде
nslookup
илиdig
внутри подов с установленным допустимым образом для диагностики, чтобы узнать, действительно ли DNS-запросы не разрешаются.
- Используйте утилиты вроде
-
Проверка log-файлов:
- Проанализируйте журналы
kubelet
,containerd
и системных служб для выявления конкретных ошибок и предупреждений, указывающих на сетевые проблемы.
- Проанализируйте журналы
-
Использование alternative resolver:
- Рассмотрите возможность использования альтернативного DNS-кешера или резольвера, совместимого с новой версией Ubuntu, для тестирования.
-
Отключение systemd-resolved:
- Временно отключите
systemd-resolved
и проверьте изменение работы системы, если считаете, что его конфигурация может быть причиной проблем.
- Временно отключите
Каждая из этих мер может отдельно привести к решению проблемы. Все перечисленные шаги подразумевают развертывание и тестирование в тестовом окружении, чтобы минимизировать риск воздействия на продакшн-кластер. Всегда сохраняйте резервные копии перед критическими изменениями конфигурации.
Следуя этим рекомендациям, вы сможете не только восстановить работоспособность вашего кластера, но и понять причину сбоя, тем самым предотвратив подобные ситуации в будущем.