Назад | Перейти на главную страницу

Невозможно получить доступ к Kubernetes NodePort с других рабочих узлов, кроме узла пода

Я управляю автономным кластером Kubernetes (v 1.17.2), установленным на CentOS 7, с одним сервером API и двумя рабочими узлами для модулей.

Одна из служб настроена как служба порта узла, однако я не могу получить доступ к службе с других узлов. Я не очень опытен в Kubernetes, но вот что я знаю

Подробнее об услугах kubectl get svc -o wide --namespace docker-registry docker-registry-deployment как следует:

NAME                         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE   SELECTOR
docker-registry-deployment   NodePort   10.104.194.201   <none>        5000:31505/TCP   67d   app=docker-registry

Выход kubectl describe svc docker-registry-deployment --namespace registry как следует:

Name:                     docker-registry-deployment
Namespace:                registry
Labels:                   app=docker-registry
Annotations:              <none>
Selector:                 app=docker-registry
Type:                     NodePort
IP:                       10.104.194.201
Port:                     <unset>  5000/TCP
TargetPort:               5000/TCP
NodePort:                 <unset>  31505/TCP
Endpoints:                10.244.1.65:5000
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

В текущем состоянии модуль недоступен через его Cluster IP:5000 из любого узла, но Endpoint:5000 доступен и реагирует должным образом.


Обновление (2020-04-14)

Для службы и модулей нет проблем с пространством имен. Они находятся в одном пространстве имен.

Я полностью обновил установки (включая Docker и Kubernetes), и проблема изменилась. Сейчас, другие узлы также отвечают, но ровно через 63 секунды.

Постараюсь отладить проблему и сообщить об этом здесь.

Наконец-то я нашел проблему.

Это комбинация фланели, сложной сетевой структуры cni и виртуализации.

flannel реализует свою сеть маршрутизации от узла к узлу с vxlan и он включает функции разгрузки на устройстве vxlan.

Когда выгрузка включена на фланелевом устройстве, NodePort доступы между узлами имеют задержку маршрутизации 63 секунды. Задержка уходит при выключении разгрузки с помощью

ethtool --offloading tx off rx off flannel.1

Мой кластер работает в среде Proxmox, а сетевые карты virtio устройств. Я не думаю, что проблема в уровне виртуализации, потому что у меня есть другой кластер на том же узле Proxmox, и все работает нормально. Поскольку это производственный кластер, он не обновляется часто.

Так что этот помечен как фланелевая ошибка. Сейчас попробую обновить фланель и посмотрю, что будет.

Обновить: flannel обновлен в этом конкретном кластере, и он работает как шарм.

Если я правильно понял, проблема в том, что вы не можете связаться с приложением, если не отправляете запросы напрямую в EndPoint.

Похоже, проблема с Service для меня. На основании предоставленной вами информации Служба была создана в --namespace docker-registry и должен передавать трафик на app=docker-registry что сидит под docker-registry-deployment создан для в другом пространстве имен (Namespace: registry).

Обратите внимание, что службы NodePort должны быть созданы в том же пространстве имен, что и развертывание. Если вам действительно нужно, чтобы ваша служба и приложение находились в разных NS, проверьте эту ветку на Переполнение стека.

Я создал развертывание и две службы (один находится в одном NS с развертыванием, а другой - в другом NS).

Моя конфигурация выглядит так, как показано ниже. Пространства имён

$ kubectl get namespaces
NAME                   STATUS   AGE
default                Active   108d
namespace-a            Active   48d

Сервисы:

$ kubectl get svc --namespace namespace-a knp-hello-go-deploy-namespace-a
NAME                  TYPE       CLUSTER-IP   PORT(S)          AGE     SELECTOR
knp-hello-go-deploy   NodePort   10.0.0.253   8180:30050/TCP   2m53s   app=knp-hello-go-app

$ kubectl get svc --namespace default knp-hello-go-deploy -o wide 
NAME                  TYPE       CLUSTER-IP   PORT(S)          AGE     SELECTOR
knp-hello-go-deploy   NodePort   10.0.12.114  8180:32673/TCP   3h21m   app=knp-hello-go-app

Я запустил 2 узла GKE. Итак, я проверил узел, на котором находится мой модуль, и подключился к другому.

Проверить через CLUSTER-IP

gke-node-mnnv:~$ curl 10.0.12.114:8180/test
Hello from ServerGo. You requested: /test 

gke-node-mnnv:~$ curl 10.0.0.253:8180
curl: (7) Failed to connect to 10.0.0.253 port 8180: Connection refused

Проверить через внешний IP-адрес GKE-Node:

gke-node-mnnv:~$ curl GKE_NodeIP:32673/test
Hello from ServerGo. You requested: /test

gke-node-mnnv:~$ curl GKE_NodeIP:30050/test
curl: (7) Failed to connect to GKE_NodeIP port 30050: Connection refused

Надеюсь, это поможет! )