10

我使用kubeadm. 我曾经flannel在集群中设置网络。我能够成功部署应用程序。然后,我通过 NodePort 服务公开了它。从这里开始,我的事情变得复杂了。

在开始之前,我禁用了firewalldmaster 和节点上的默认服务。

正如我从K8s Services doc中了解到的那样,类型 NodePort 会在集群中的所有节点上公开服务。但是,当我创建它时,该服务仅在集群中 4 个节点中的 2 个节点上公开。我猜这不是预期的行为(对吗?)

对于故障排除,以下是一些资源规格:

root@vm-vivekse-003:~# 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

root@vm-vivekse-003:~# 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

root@vm-vivekse-003:~# 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

root@vm-vivekse-003:~# 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>

root@vm-vivekse-003:~# 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(工作):

root@vm-vivekse-004:~# curl 127.0.0.1:30847      //<localhost>:<nodeport>
Hello Docker World!!
root@vm-vivekse-004:~# curl 10.101.180.19:9000   //<cluster-ip>:<port>
Hello Docker World!!
root@vm-vivekse-004:~# curl 10.244.3.7:9000      //<pod-ip>:<port>
Hello Docker World!!

Node02(工作):

root@vm-rosnthom-00f:~# curl 127.0.0.1:30847
Hello Docker World!!
root@vm-rosnthom-00f:~# curl 10.101.180.19:9000
Hello Docker World!!
root@vm-rosnthom-00f:~# curl 10.244.3.7:9000
Hello Docker World!!

Node03(不工作):

root@vm-plashkar-006:~# curl 127.0.0.1:30847
curl: (7) Failed to connect to 127.0.0.1 port 30847: Connection timed out
root@vm-plashkar-006:~# curl 10.101.180.19:9000
curl: (7) Failed to connect to 10.101.180.19 port 9000: Connection timed out
root@vm-plashkar-006:~# curl 10.244.3.7:9000
curl: (7) Failed to connect to 10.244.3.7 port 9000: Connection timed out

Node04(不工作):

root@vm-deepejai-00b:/# curl 127.0.0.1:30847
curl: (7) Failed to connect to 127.0.0.1 port 30847: Connection timed out
root@vm-deepejai-00b:/# curl 10.101.180.19:9000
curl: (7) Failed to connect to 10.101.180.19 port 9000: Connection timed out
root@vm-deepejai-00b:/# curl 10.244.3.7:9000
curl: (7) Failed to connect to 10.244.3.7 port 9000: Connection timed out

在所有 4 个奴隶上都netstat试过了。telnet这是输出:

Node01(工作主机):

root@vm-vivekse-004:~# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      27808/kube-proxy
root@vm-vivekse-004:~# telnet 127.0.0.1 30847
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Node02(工作主机):

root@vm-rosnthom-00f:~# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      11842/kube-proxy
root@vm-rosnthom-00f:~# telnet 127.0.0.1 30847
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.

Node03(不工作的主机):

root@vm-plashkar-006:~# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      7791/kube-proxy
root@vm-plashkar-006:~# telnet 127.0.0.1 30847
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection timed out

Node04(不工作的主机):

root@vm-deepejai-00b:/# netstat -tulpn | grep 30847
tcp6       0      0 :::30847                :::*                    LISTEN      689/kube-proxy
root@vm-deepejai-00b:/# telnet 127.0.0.1 30847
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection timed out

补充资料:

kubectl get pods输出中,我可以看到 pod 实际上部署在 slave 上vm-rosnthom-00f。我可以ping从所有 5 个虚拟机中访问此主机,并且curl vm-rosnthom-00f:30847也可以从所有虚拟机中工作。

我可以清楚地看到内部集群网络混乱,但我不确定如何解决它!iptables -L因为所有从站都是相同的,甚至所有从站的本地环回 ( ifconfig lo) 都已启动并运行。我完全不知道如何解决它!

4

2 回答 2

-1

您的防火墙阻止了节点之间的某些连接,或者您的 kube-proxy 无法正常工作。我猜您的服务仅适用于运行 pod 的节点。

于 2021-12-26T15:44:49.767 回答
-3

如果您想从集群中的任何节点访问服务,您需要精细的服务类型为ClusterIP. 由于您将服务类型定义为NodePort,因此您可以从运行服务的节点进行连接。


我上面的答案不正确,根据我们应该能够从任何NodeIP:Nodeport. 但它也不能在我的集群中工作。

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

NodePort:在每个 Node 的 IP 上的静态端口(NodePort)上公开服务。将自动创建 NodePort 服务将路由到的 ClusterIP 服务。您可以通过请求从集群外部联系 NodePort 服务:。

我的一个节点 ip forward 未设置。我能够使用 NodeIP:nodePort 连接我的服务

sysctl -w net.ipv4.ip_forward=1
于 2017-08-10T02:49:49.740 回答