Kubernetes – не может подключиться к кластеру из-за закрытого порта

Вопрос или проблема

Я следовал этому документу, чтобы настроить кластер Kubernetes – https://github.com/piyushsachdeva/CKA-2024/tree/main/Resources/Day27,

Одно, что отличалось в том, что я сделал, это то, что я использовал

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

вместо

sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=172.31.89.68 --node-name master

Ошибка, с которой я сейчас сталкиваюсь, в том, что другие узлы не могут присоединиться к кластеру, используя команду kubeadm join. Когда я пытаюсь выполнить netcat к серверу управления на порту 6443, он выдает мне эту ошибку.

connect to 129.x.x.x port 6443 (tcp) failed: No route to host

Я открыл порт 6443, используя ufw.

$ sudo ufw status
Статус: активен

Кому                     Действие      Из
--                        ------      ----
6443/tcp                 Разрешить    Везде
6443                     Разрешить    Везде
6443/udp                 Разрешить    Везде

Вот несколько других проверок, которые я сделал …

$ sudo nc -l 6443
nc: Адрес уже используется

$ sudo ss -tuln | grep 6443
tcp   LISTEN 0      4096                 *:6443             *:*

$ sudo iptables -L -n | grep 6443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:6443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:6443
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:6443
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:6443

Со стороны клиентской машины –

$ ping 129.x.x.x
PING 129.x.x.x (129.x.x.x) 56(84) bytes of data.
64 bytes от 129.x.x.x: icmp_seq=1 ttl=63 время=0.266 мс
64 bytes от 129.x.x.x: icmp_seq=2 ttl=63 время=0.213 мс
64 bytes от 129.x.x.x: icmp_seq=3 ttl=63 время=0.238 мс
64 bytes от 129.x.x.x: icmp_seq=4 ttl=63 время=0.168 мс
64 bytes от 129.x.x.x: icmp_seq=5 ttl=63 время=0.189 мс
64 bytes от 129.x.x.x: icmp_seq=6 ttl=63 время=0.193 мс
64 bytes от 129.x.x.x: icmp_seq=7 ttl=63 время=0.195 мс
64 bytes от 129.x.x.x: icmp_seq=8 ttl=63 время=0.179 мс
^C
--- 129.x.x.x ping statistics ---
8 пакетов отправлено, 8 получено, 0% потеря пакетов, время 7167мс
rtt min/avg/max/mdev = 0.168/0.205/0.266/0.030 мс

$ nc -vz 129.x.x.x 22
Соединение с 129.x.x.x 22 порт [tcp/ssh] установлено!

Но вот ошибка –

$ nc -vz 129.x.x.x 6443
nc: connect to 129.x.x.x port 6443 (tcp) failed: No route to host

Ответ или решение

Не удается присоединиться к кластеру Kubernetes из-за закрытого порта: подробное руководство по решению проблемы

Введение

Настройка кластера Kubernetes может быть сложной задачей, особенно когда возникают проблемы с подключением. В данном случае у вас возникла проблема соединения с контроллером API кластера по порту 6443. Давайте разберемся, что может быть причиной этой ошибки и какие шаги можно предпринять для ее решения.

Описание проблемы

Вы выполнили инициализацию кластера с помощью команды:

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

Однако другие узлы не могут присоединиться к кластеру с помощью команды kubeadm join. При попытке подключиться к контроллеру API с помощью netcat по порту 6443 вы получаете сообщение:

connect to 129.x.x.x port 6443 (tcp) failed: No route to host

Проверка конфигурации сети

  1. Проверка доступности узла мастер:
    Вы уже проверили доступность IP-адреса с помощью команды ping, и ответы приходят, что указывает на корректность работы сети.

  2. Проверка открытого порта:
    Вы открыли порт 6443, используя ufw, и проверили его статус:

    $ sudo ufw status

    Ваши настройки выглядят нормально, и порт действительно открыт:

    6443/tcp                   ALLOW       Anywhere
  3. Проверка прослушивания порта:
    Вы также использовали команду:

    $ sudo ss -tuln | grep 6443

    Она показывает, что контроллер Kubernetes слушает на порту 6443.

Возможные причины ошибки

  1. Маршрутизация трафика:
    Сообщение об ошибке "No route to host" может указывать на проблемы с маршрутизацией. Проверьте маршруты на узле, который пытается подключиться, и убедитесь, что он может "видеть" мастер-узел (129.x.x.x) на уровне маршрутов.

    $ ip route
  2. Настройка сетевых интерфейсов:
    Убедитесь, что сетевые интерфейсы настроены правильно, особенно если вы используете облачную инфраструктуру. Иногда необходимо задать правильный сетевой интерфейс для --apiserver-advertise-address.

  3. Брандмауэр на уровне облака:
    Убедитесь, что правила брандмауэра (например, в AWS, GCP, Azure) разрешают доступ к порту 6443. Иногда даже когда ufw настроен правильно, правила на уровне облака могут блокировать соединения.

Рекомендации по устранению неполадок

  1. Дополнительные проверки маршрутизации:
    Попробуйте выполнить traceroute до управляющего узла (контроллера API) с клиента для диагностики маршрутов:

    traceroute 129.x.x.x
  2. Проверка конфигурации сетевой подсистемы:
    Если вы используете CNI (Container Network Interface), убедитесь, что конфигурация сети не мешает маршрутизации трафика между узлами. Возможно, вам нужно будет установить плагин сетевого взаимодействия.

  3. Логи kubelet:
    Проверьте логи kubelet на узле-мастере, чтобы найти возможные ошибки:

    journalctl -u kubelet
  4. Переменные окружения:
    Убедитесь, что настройки переменных окружения для вашей сети, если они есть, правильно заданы. Неверные настройки могут препятствовать корректной работе сети.

Заключение

Решение проблемы "не удается присоединиться к кластеру Kubernetes из-за закрытого порта" требует внимательного изучения конфигурации сети, брандмауэра и маршрутизации. Применяя предложенные методы и проверки, вы сможете быстрее диагностировать и устранить проблему. Если ни один из этих шагов не помог, рассмотрите возможность обращения за поддержкой к сообществу Kubernetes или к документации, в которой могут быть подсказки по вашему конкретному окружению.

Оцените материал
Добавить комментарий

Капча загружается...