Подтвердить что ты не робот

Служба NodePort K8s "недоступна по IP" только на 2/4 ведомых в кластере

Я создал кластер K8s из 5 виртуальных машин (1 ведущий и 4 подчиненных Ubuntu 16.04.3 LTS), используя kubeadm. Я использовал flannel для настройки сети в кластере. Мне удалось успешно развернуть приложение. Затем я выставил его через службу NodePort. Отсюда все осложнилось для меня.

До того, как я начал, я отключил службу firewalld по умолчанию на главном и узле.

Как я понимаю из K8s Services doc, тип NodePort предоставляет услугу на всех узлах кластера. Однако, когда я его создал, служба была выставлена ​​только на 2 узлах из 4 в кластере. Я предполагаю, что не ожидаемое поведение (правильно?)

Для устранения неполадок, вот некоторые спецификации ресурсов:

[email protected]:~# kubectl get nodes
NAME              STATUS    AGE       VERSION
vm-deepejai-00b   Ready     5m        v1.7.3
vm-plashkar-006   Ready     4d        v1.7.3
vm-rosnthom-00f   Ready     4d        v1.7.3
vm-vivekse-003    Ready     4d        v1.7.3   //the master
vm-vivekse-004    Ready     16h       v1.7.3

[email protected]:~# kubectl get pods -o wide -n playground
NAME                                     READY     STATUS    RESTARTS   AGE       IP           NODE
kubernetes-bootcamp-2457653786-9qk80     1/1       Running   0          2d        10.244.3.6   vm-rosnthom-00f
springboot-helloworld-2842952983-rw0gc   1/1       Running   0          1d        10.244.3.7   vm-rosnthom-00f

[email protected]:~# kubectl get svc -o wide -n playground
NAME        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
sb-hw-svc   10.101.180.19   <nodes>       9000:30847/TCP   5h        run=springboot-helloworld

[email protected]:~# kubectl describe svc sb-hw-svc -n playground
Name:               sb-hw-svc
Namespace:          playground
Labels:             <none>
Annotations:        <none>
Selector:           run=springboot-helloworld
Type:               NodePort
IP:                 10.101.180.19
Port:               <unset>   9000/TCP
NodePort:           <unset>   30847/TCP
Endpoints:          10.244.3.7:9000
Session Affinity:   None
Events:             <none>

[email protected]:~# kubectl get endpoints sb-hw-svc -n playground -o yaml
apiVersion: v1
kind: Endpoints
metadata:
  creationTimestamp: 2017-08-09T06:28:06Z
  name: sb-hw-svc
  namespace: playground
  resourceVersion: "588958"
  selfLink: /api/v1/namespaces/playground/endpoints/sb-hw-svc
  uid: e76d9cc1-7ccb-11e7-bc6a-fa163efaba6b
subsets:
- addresses:
  - ip: 10.244.3.7
    nodeName: vm-rosnthom-00f
    targetRef:
      kind: Pod
      name: springboot-helloworld-2842952983-rw0gc
      namespace: playground
      resourceVersion: "473859"
      uid: 16d9db68-7c1a-11e7-bc6a-fa163efaba6b
  ports:
  - port: 9000
    protocol: TCP

После некоторого вмешательства я понял, что на этих 2 "ошибочных" узлах эти службы недоступны изнутри самих этих хостов.

Node01 (рабочий):

[email protected]:~# curl 127.0.0.1:30847      //<localhost>:<nodeport>
Hello Docker World!!
[email protected]:~# curl 10.101.180.19:9000   //<cluster-ip>:<port>
Hello Docker World!!
[email protected]:~# curl 10.244.3.7:9000      //<pod-ip>:<port>
Hello Docker World!!

Node02 (рабочий):

[email protected]:~# curl 127.0.0.1:30847
Hello Docker World!!
[email protected]:~# curl 10.101.180.19:9000
Hello Docker World!!
[email protected]:~# curl 10.244.3.7:9000
Hello Docker World!!

Node03 (не работает):

[email protected]:~# curl 127.0.0.1:30847
curl: (7) Failed to connect to 127.0.0.1 port 30847: Connection timed out
[email protected]:~# curl 10.101.180.19:9000
curl: (7) Failed to connect to 10.101.180.19 port 9000: Connection timed out
[email protected]:~# curl 10.244.3.7:9000
curl: (7) Failed to connect to 10.244.3.7 port 9000: Connection timed out

Node04 (не работает):

[email protected]:/# curl 127.0.0.1:30847
curl: (7) Failed to connect to 127.0.0.1 port 30847: Connection timed out
[email protected]:/# curl 10.101.180.19:9000
curl: (7) Failed to connect to 10.101.180.19 port 9000: Connection timed out
[email protected]:/# curl 10.244.3.7:9000
curl: (7) Failed to connect to 10.244.3.7 port 9000: Connection timed out

Пробовал netstat и telnet на всех 4 ведомых. Здесь вывод:

Node01 (рабочий узел):

[email protected]:~# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      27808/kube-proxy
[email protected]:~# telnet 127.0.0.1 30847
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Node02 (рабочий узел):

[email protected]:~# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      11842/kube-proxy
[email protected]:~# telnet 127.0.0.1 30847
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Node03 (неработающий хост):

[email protected]:~# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      7791/kube-proxy
[email protected]:~# telnet 127.0.0.1 30847
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection timed out

Node04 (неработающий хост):

[email protected]:/# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      689/kube-proxy
[email protected]:/# telnet 127.0.0.1 30847
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection timed out

Дополнительная информация:

Из вывода kubectl get pods я вижу, что модуль фактически развернут на ведомом vm-rosnthom-00f. Я могу ping этот хост из всех 5 виртуальных машин, а curl vm-rosnthom-00f:30847 также работает со всеми виртуальными машинами.

Я отчетливо вижу, что внутренняя сеть кластеров запутана, но я не уверен, как ее разрешить! iptables -L для всех подчиненных устройств идентичны, и даже локальный Loopback (ifconfig lo) работает и работает для всех подчиненных устройств. Я совершенно не знаю, как это исправить!

4b9b3361

Ответ 1

Если вы хотите обратиться к сервису из любого node в кластере, вам нужен прекрасный тип обслуживания как ClusterIP. Поскольку вы определили тип сервиса как NodePort, вы можете подключиться к node, где работает служба.


мой выше ответ был неправильным, на основе документации мы должны быть в состоянии подключиться от любого NodeIP:Nodeport. но он также не работает в моем кластере.

https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types

NodePort: предоставляет службу на каждом IP-адресе Node на статическом порту ( NodePort). Служба ClusterIP, к которой служба NodePort будет маршрут автоматически создается. Вы сможете связаться с Служба NodePort из-за пределов кластера, запросив:.

Один из моих node ip forward не установлен. Мне удалось подключить мою службу, используя NodeIP: nodePort

sysctl -w net.ipv4.ip_forward=1