首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解外部环境对NodePort的访问

理解外部环境对NodePort的访问
EN

Stack Overflow用户
提问于 2021-04-08 14:32:55
回答 1查看 726关注 0票数 1

我当时在https://kubernetes.io/docs/concepts/services-networking/service/读k8s文档。

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

所以,我试着检查一下。在此LoadBalancer服务中,端口31724是NodePort,80是容器端口。根据docs,NodePort应该向外部世界开放,而集装箱港口不应该开放。但有了nmap,我发现情况正好相反。

代码语言:javascript
复制
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP               PORT(S)                  AGE
gen       LoadBalancer   10.200.32.132   10.44.9.162,10.44.9.163   80:31724/TCP,443:30039   20d
代码语言:javascript
复制
$ nmap -p 80 10.44.9.162

Starting Nmap 6.40 ( http://nmap.org ) at 2021-04-08 12:33 UTC
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 10.44.9.162
Host is up (0.00061s latency).
PORT   STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 0.02 seconds

$ nmap -p 31724 10.44.9.162

Starting Nmap 6.40 ( http://nmap.org ) at 2021-04-08 12:33 UTC
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 10.44.9.162
Host is up (0.00044s latency).
PORT      STATE  SERVICE
31724/tcp closed unknown

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

我肯定漏掉了什么。请帮我理解一下。谢谢!

后续

我知道跟进应该是一个不同的问题,但似乎是正确的地方。

我创建了一个NodePort服务,并重新尝试了同样的方法。正如描述中所说的那样。

代码语言:javascript
复制
object-controller-np      NodePort       10.200.32.240   <none>         7203:31206/TCP                                             5s

NodeIP

代码语言:javascript
复制
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.46.104.20 ...
代码语言:javascript
复制
$ nmap -p 7203 10.46.104.20

Starting Nmap 6.40 ( http://nmap.org ) at 2021-04-09 07:01 UTC
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 10.46.104.20
Host is up (0.00052s latency).
PORT     STATE  SERVICE
7203/tcp closed unknown

Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

$ nmap -p 31206 10.46.104.20

Starting Nmap 6.40 ( http://nmap.org ) at 2021-04-09 07:01 UTC
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 10.46.104.20
Host is up (0.00050s latency).
PORT      STATE SERVICE
31206/tcp open  unknown

早些时候,我尝试使用LoadBalancer,因为我认为它是一个NodePort的超集。

问题:那么为什么在NodePort类型的服务和LoadBalancer类型的服务中与NodePort的行为完全相反呢?

来自通俗答案

NodePort 如果您从节点的外部IP访问nodePort上的此服务,它将将请求路由到spec.clusterIp:spec.ports[*].port,如果设置了,该请求将依次路由到您的spec.ports[*].targetPort。还可以以与ClusterIP相同的方式访问该服务。..。 LoadBalancer 您可以从负载均衡器的IP地址访问此服务,该地址将请求路由到nodePort,而后者又将请求路由到clusterIP端口。

因此,对于一个NodePort,请求如下:

代码语言:javascript
复制
NodeIP:NodePort -> ClusterIP:Port -> ClusterIP:TargetPort

上面的Port是yaml中指定为port的端口,它在集群中的指定端口上公开了Kubernetes服务。TargetPort是由yaml中的targetPort指定的端口,服务将在该端口上发送请求,以便您的吊舱能够监听。

对于LoadBalancer,我期望的行为是:

代码语言:javascript
复制
ExternalLBIP:NodePort --(load-balanced across nodes)--> NodeIP:NodePort -> ClusterIP:Port -> ClusterIP:TargetPort

我看到的是:

代码语言:javascript
复制
ExternalLBIP:NodePort -> (doesn't work)

相反,起作用的是:

代码语言:javascript
复制
ExternalLBIP:Port --(load-balanced across nodes)--> NodeIP:Port -> ClusterIP:Port -> ClusterIP:TargetPort
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-08 14:41:13

您所看到的是正确的,因为您使用nmap访问的IP是由LoadBalancer类型的服务创建的LoadBalancer的IP,该服务的开放时间为80 (和/或443)。而NodePort可以在运行pod和服务的工作节点的IP上访问。

您在这里部署的服务类型是LoadBalancer,而不是NodePort

要进一步阅读,请查看 out。

对后续问题的回答

你在期望和实际工作中提到的都是不正确的。

ExternalLBIP:NodePort:如果您查看您共享的帖子,<NodePort>可以通过<NodeIP>访问,而不是通过LB的外部IP访问。

ExternalLBIP:Port --(load-balanced across nodes)--> NodeIP:Port ->:LB将请求路由到NodePort,所以它将是NodeIP:NodePort

因此,对于您的问题,在NodePort类型服务和LoadBalancer类型服务中使用NodePort的行为不是相反的。您只需记住,NodePort只能在NodeIP上访问。

在服务类型NodePort

NodeIP:NodePort -> ClusterIP:Port -> Pod:TargetPort

在服务类型LoadBalancer

ExternalIPofLB:Port -> NodeIP:NodePort -> ClusterIP:Port -> Pod:TargetPort

例如:来自LoadBalancer类型的运行服务

代码语言:javascript
复制
kubectl get svc -n <namespace> <service-name>
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)          AGE
<service-name>-**********   LoadBalancer   172.20.96.130   a4b63c833c2***************d4-1996967498.<region>.elb.amazonaws.com   8443:31010/TCP   8m49s

正如您在下面的片段中所看到的,请求将从LB Port to NodePort转发。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67006197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档