
Модули в определенном узле (назовем его mynode) не имеют доступа к Интернету, остальные модули, запланированные в других узлах, имеют доступ к Интернету.
У mynode есть доступ к Интернету, я могу подключиться к нему по SSH, я также могу запускать автономные контейнеры Docker, и у них есть доступ к Интернету, но у модулей, запланированных на узле, его нет.
Проблема затрагивает входящий и исходящий трафик, kubelet работает на порту 10250 и доступен через:
curl https://localhost:10250 -k
returns 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. Выполните следующие шаги, которые могут помочь решить вашу проблему:
Просмотрите логи coreDNS и логи pod, чтобы понять проблему. Более подробную информацию вы получите, выполнив команды:
логи kubectl --namespace=kube-system -l k8s-app=kube-dns
kubectl logs имя_пода
Проверьте все сетевые политики, блокирующие трафик к модулю. Вы получите дополнительную информацию, выполнив команду:
kubectl get networkpolicy
Проверьте необходимые портыоткрыты они или нет.
Проверьте, не блокирует ли правило брандмауэра внутри модуля трафик.
Сопоставьте модули CIDR и Calico по умолчанию 192.168.0.0/16, см.комментарий на githubБольше подробностей.
Если HTTP-сервер использует DNS-имена, убедитесь, чтоРазрешение DNS-именнастроен правильно в кластере.
Редактировать1
Иногда проблем с CoreDNS нет, но из-за проблем с сетью k8s, когда трафик на ClusterIPs не направляется правильно на Pods. Это может быть из-за Kube-proxy. Обратитесь к k8sОтладочные службыдля руководства по устранению неполадок.
Также проверьте, не перекрываются ли сети Pod с сетями хоста. См.Установка сетевого дополнения PodБольше подробностей.
Иногда сетевые функции не загружаются во время обновления, и когда вы попадаете в такие 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