Я управляю автономным кластером Kubernetes (v 1.17.2), установленным на CentOS 7, с одним сервером API и двумя рабочими узлами для модулей.
Одна из служб настроена как служба порта узла, однако я не могу получить доступ к службе с других узлов. Я не очень опытен в Kubernetes, но вот что я знаю
kube-proxy
делает свое дело. Связанный порт (31505) открыт в каждом узле (отмечен с помощью lost -i
).
Служба запущена, я могу получить к ней доступ из порта узла, на котором работает модуль.
no-iptables
вариант, и все правила брандмауэра управляются самим Kubernetes. kubelet
и docker
очистка всех правил IPTables и принуждение кубернетов к их воссозданию не решило проблему.Подробнее об услугах 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
доступен и реагирует должным образом.
Для службы и модулей нет проблем с пространством имен. Они находятся в одном пространстве имен.
Я полностью обновил установки (включая 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
Надеюсь, это поможет! )