Модули в определенном узле не имеют доступа к Интернету

Модули в определенном узле не имеют доступа к Интернету

Модули в определенном узле (назовем его mynode) не имеют доступа к Интернету, остальные модули, запланированные в других узлах, имеют доступ к Интернету.

У mynode есть доступ к Интернету, я могу подключиться к нему по SSH, я также могу запускать автономные контейнеры Docker, и у них есть доступ к Интернету, но у модулей, запланированных на узле, его нет.

Проблема затрагивает входящий и исходящий трафик, kubelet работает на порту 10250 и доступен через: curl https://localhost:10250 -kreturns 404 page not found.

Контекст: В моем кластере несколько узлов с одинаковыми характеристиками. Вчера я решил обновить ОС (с 20.04 до 22.04), поэтому я удалил предыдущий кластер K8S, который работал нормально, обновил ОС на всех узлах, переустановил K8S, заново создал кластер. Все работает гладко на всех узлах, кроме mynode. Он находится в состоянии ReadyState, кажется, все в порядке, но это не так.

Мой CNI — calico. Модули Calico (csi-node-driver и calico-node) на узле находятся в состоянии выполнения, перезапусков нет.

Я следовал странице отладки на веб-сайте k8s, HTTP-сервер, запланированный на модуле, не может быть доступен, поэтому эта проблема затрагивает обавход и выход.

решение1

Похоже, проблема возникла после обновления ОС, поэтому проверьте, обновлены ли плагин CNI, CRI и образы контейнеров модулей и совместимы ли они с новой версией ОС 22.04.

Проблема может возникнуть по разным причинам, например:сетевые политикиблокировка доступа, конфигурация сети pod и проблемы Calico CNI. Выполните следующие шаги, которые могут помочь решить вашу проблему:

  1. Просмотрите логи coreDNS и логи pod, чтобы понять проблему. Более подробную информацию вы получите, выполнив команды:

    логи kubectl --namespace=kube-system -l k8s-app=kube-dns

    kubectl logs имя_пода

  2. Проверьте все сетевые политики, блокирующие трафик к модулю. Вы получите дополнительную информацию, выполнив команду:kubectl get networkpolicy

  3. Проверьте необходимые портыоткрыты они или нет.

  4. Проверьте, не блокирует ли правило брандмауэра внутри модуля трафик.

  5. Сопоставьте модули CIDR и Calico по умолчанию 192.168.0.0/16, см.комментарий на githubБольше подробностей.

  6. Если HTTP-сервер использует DNS-имена, убедитесь, чтоРазрешение DNS-именнастроен правильно в кластере.

Редактировать1

  1. Иногда проблем с CoreDNS нет, но из-за проблем с сетью k8s, когда трафик на ClusterIPs не направляется правильно на Pods. Это может быть из-за Kube-proxy. Обратитесь к k8sОтладочные службыдля руководства по устранению неполадок.

  2. Также проверьте, не перекрываются ли сети Pod с сетями хоста. См.Установка сетевого дополнения PodБольше подробностей.

  3. Иногда сетевые функции не загружаются во время обновления, и когда вы попадаете в такие pod, вы работаете как пользователь root. Так что попробуйте сделать это, apt-get updateа затем позже вы сможете сделатьapt-get install curl.

решение2

Решением было перезапустить сервер...

решение3

Kubelet показывает, 404что ожидается, так как этот URL не существует. Попробуйте следующее:

curl -k https://localhost:10250/healthz

Я бы начал с ip_forwardпроверки неисправного узла.

cat /proc/sys/net/ipv4/ip_forward

Если это не так, то я проверю политику, применяемую Calico.

kubectl get networkpolicy -A
kubectl get gnp
kubectl get cnp -A

Далее я бы проверил, natвключен ли IPPool

kubetl get ippool -o yaml

Проверьте шлюз.

Примечание: очистка iptables может привести к временному разрыву соединения, поэтому убедитесь, что у вас есть под рукой консольное соединение.

Очистка IPtables тоже может быть неплохой идеей, возможно, это какое-то правило, которое уже изжило себя.

iptables -F

Связанный контент