master(主节点)如果不是node的话,无法访问Service的NodePort吗
zm274310577 opened this issue · comments
环境
一个主节点,两个从节点(主节点没有配置为从节点)
masterIP:10.0.1.53
slave1IP:10.0.1.51
slave2IP:10.0.1.52
版本和配置信息
版本为1.11.0
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:08:34Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"linux/amd64"}
- kubernetes版本:1.11.0
- docker版本:
- 网络插件:
- 存储类型:
操作
导致该问题的操作或现象
我创建了一个Nginx的Service,如下
kubectl run nginx --replicas=1 --labels="run=load-balancer-example" --image=nginx:1.14 --port=80
kubectl expose deployment nginx --type=NodePort --name=example-service
这个Pod创建在slave2节点
Name: nginx-65f86676f5-vpwt7
Namespace: default
Node: slave2/10.0.1.52
Service的端口是
example-service NodePort 10.254.111.137 80:32522/TCP 2h
从三个节点分别使用nodeIP:32522进行访问,这时:
master不可访问。
[root@master dns]# curl 10.0.1.53:32522
curl: (7) Failed connect to 10.0.1.53:32522; Connection refused
slave1访问失败
[root@slave1 ~]# curl 10.0.1.51:32522
curl: (7) Failed to connect to 10.0.1.51 port 32522: No route to host
[root@slave2 ~]# curl 10.0.1.52:32522
而根据官网的解释,可以通过任何Node的NodeIP和NodePort端口号来访问。
NodePort: Exposes the service on each Node’s IP at a static port (the NodePort). A ClusterIP service, to which the NodePort service will route, is automatically created. You’ll be able to contact the NodePort service, from outside the cluster, by requesting :.
那么问题来了。
- slave1为什么不能访问,根据错误提示,和master的错误不一样。可能是DNS的问题,但是DNS我也配置过了。
- NodePort的使用是不是太局限了。一般情况下,master只作为主节点使用,即不会安装node的服务进程。但是master又访问不到node的NodePort(可能我使用的有问题)。而只能通过node的IP地址来访问,怎么使用起来怪怪的。
求大神指点。
NodePort是向集群外部暴露服务使用的,集群内部的话直接使用 service 名称就可以访问了。master 节点如果要直接访问 pod 的 IP 和 cluster IP 也需要安装网络查件。
NodePort是向集群外部暴露服务使用的,集群内部的话直接使用 service 名称就可以访问了。master 节点如果要直接访问 pod 的 IP 和 cluster IP 也需要安装网络查件。
NodePort是向集群外部暴露服务,那么说我用宿主机(搭建K8S的物理机)应该能访问NodePort才对的。现在只有Pod所在的那个宿主机可以访问该NodePort,而其他node不能访问,并且如果主节点不是node的话也不能访问。
pod 的 IP 和 cluster IP可以通过那个网络插件可以访问,flannel吗?(目前我么有这方面的需求,还没有尝试)
版本
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:39:24Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
kubectl describe svc my-svc
Name: my-svc
Namespace: default
Labels: <none>
Annotations: Selector: app=my-deployment
Type: NodePort
IP: 10.96.210.147
Port: http 3000/TCP
TargetPort: 3000/TCP
NodePort: http 30001/TCP
Endpoints: 10.244.2.241:3000
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
经过我在 master 机器的测试:
- master 机器: 直接访问 Endpoint 秒回:
curl 10.244.2.241:3000
, 访问 NodePortcurl 10.96.210.147:3000
和curl masterIP:30001
均为 60s 之后返回结果.
看了上面的回答, 用其他非 master 机器访问:
-
node 节点机: 访问 Endpoint 秒回
curl 10.244.2.241:3000
, 访问 master 机器curl masterIP:30001
秒回, 访问 NodePortcurl 10.96.210.147:3000
需要等待 60s 之后返回结果 -
非 node, 非 master 机器: 访问 master 机器
curl masterIP:30001
秒回, 不能访问其他地址.