我使用kubeadm
创建了一个包含5个虚拟机的K8s集群(运行Ubuntu 16.04.3 LTS的1个主虚拟机和4个从虚拟机)。我使用flannel
在集群中设置网络。我成功地部署了一个应用程序。然后,我通过NodePort服务公开了它。从这里开始,事情变得复杂起来。
在开始之前,我禁用了主节点和节点上的默认firewalld
服务。
正如我从K8s服务文档中了解到的,类型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
经过一些修补之后,我意识到在这两个“故障”节点上,这些服务在这些主机本身内部是不可用的。
节点01(工作):
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!!
节点02(工作):
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!!
节点03(不工作):
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
节点04(不工作):
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
。以下是输出:
Node 01(工作主机):
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 '^]'.
Node 02(工作主机):
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 '^]'.
Node 03(非工作主机):
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
Node 04(非工作主机):
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实际上部署在从vm-rosnthom-00f
上。我可以从所有5个虚拟机中ping
此主机,并且curl vm-rosnthom-00f:30847
也可以从所有虚拟机中工作。
我可以清楚地看到内部集群网络混乱,但我不知道如何解决它!iptables -L
为所有的奴隶是相同的,甚至本地环回(ifconfig lo
)是启动和运行为所有的奴隶。我完全不知道如何修复它!
3条答案
按热度按时间wh6knrhe1#
使用服务类型NodePort,如果是主节点的Ipadress,则访问NodePort。
服务显然知道Pod在哪个节点上运行,并且如果您有多个示例,则将流量重定向到其中一个Pod。
给您的pod贴上标签,并在服务中使用相应的选择器。
如果您仍然遇到问题,请发布您的服务和部署。
要检查连接,我建议使用netcat。
如果网络正常,则其响应:开放
在集群内部访问容器,如下所示:
请始终考虑您有3种端口。
在容器中运行软件的端口。
在其上向Pod公开端口端口。(Pod有一个IP地址,即clusterIp地址,由特定端口上的容器使用)
NodePort允许您从群集网络外部访问Pod的ipaddress端口。
mpbci0fu2#
要么是你的防火墙阻止了节点之间的连接,要么是你的kube-proxy工作不正常。我猜你的服务只在pod运行的节点上工作。
8yoxcaq73#
如果要从集群中的任何节点访问服务,则需要
ClusterIP
这样的服务类型。由于已将服务类型定义为NodePort
,因此可以从运行服务的节点进行连接。我上面的答案是不正确的,根据文档,我们应该能够从任何
NodeIP:Nodeport
连接。但它不在我的集群也工作。https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services---service-types
NodePort:在静态端口(NodePort)公开每个节点IP上的服务。将自动创建NodePort服务将路由到的ClusterIP服务。您将能够通过请求从群集外部联系NodePort服务:。
我的一个节点IP转发未设置。我可以使用NodeIP:nodePort连接我的服务