rootsongjc / kubernetes-handbook

Kubernetes中文指南/云原生应用架构实战手册 - https://jimmysong.io/kubernetes-handbook

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 :.

那么问题来了。

  1. slave1为什么不能访问,根据错误提示,和master的错误不一样。可能是DNS的问题,但是DNS我也配置过了。
  2. 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 机器的测试:

  1. master 机器: 直接访问 Endpoint 秒回: curl 10.244.2.241:3000, 访问 NodePort curl 10.96.210.147:3000curl masterIP:30001 均为 60s 之后返回结果.

看了上面的回答, 用其他非 master 机器访问:

  1. node 节点机: 访问 Endpoint 秒回 curl 10.244.2.241:3000, 访问 master 机器 curl masterIP:30001 秒回, 访问 NodePort curl 10.96.210.147:3000 需要等待 60s 之后返回结果

  2. 非 node, 非 master 机器: 访问 master 机器 curl masterIP:30001 秒回, 不能访问其他地址.