kubernetes 了解从外部环境访问NodePort

zpqajqem  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(102)

我在https://kubernetes.io/docs/concepts/services-networking/service/上阅读k8s文档。
NodePort:在静态端口(NodePort)处将服务暴露在每个节点的IP上。将自动创建NodePort服务路由到的InternetIP服务。您可以通过请求从集群外部联系NodePort服务:。
所以,我实际上是在检查。在此LoadBalancer服务中,端口31724是NodePort,80是容器端口。根据文档,NodePort应该对外开放,而容器端口不应该。但是对于nmap,我发现情况正好相反。

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
$ 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服务并重试了相同的服务。就像描述中所说的那样。

object-controller-np      NodePort       10.200.32.240   <none>         7203:31206/TCP                                             5s

NodeIP

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 10.46.104.20 ...
$ 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在NodePort类型服务和LoadBalancer类型服务中的行为完全相反呢?

popular answer
NodePort
如果您从节点的外部IP访问nodePort上的此服务,它将把请求路由到spec.clusterIp:spec.ports[*].port,如果设置了,spec.clusterIp:spec.ports[*].port又会把请求路由到您的spec.ports[*].targetPort。此服务也可以通过与InternetIP相同的方式访问。...
LoadBalancer
您可以从负载均衡器的IP地址访问此服务,它将您的请求路由到nodePort,nodePort又将请求路由到clusterIP端口。
因此,对于NodePort,请求如下:

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

上面的Port是yaml中指定为port的端口,它在集群内的指定端口上公开Kubernetes服务。TargetPort是targetPort在yaml中指定的端口,服务将向其发送请求,您的pod将侦听该端口。
对于LoadBalancer,我期望的行为是:

ExternalLBIP:NodePort --(load-balanced across nodes)--> NodeIP:NodePort -> ClusterIP:Port -> ClusterIP:TargetPort

我看到的是:

ExternalLBIP:NodePort -> (doesn't work)

相反,有效的方法是:

ExternalLBIP:Port --(load-balanced across nodes)--> NodeIP:Port -> ClusterIP:Port -> ClusterIP:TargetPort
ndh0cuux

ndh0cuux1#

你看到的是正确的,因为你用nmap访问的IP是由LoadBalancer类型的服务创建的LoadBalancer的IP,这意味着在80(和/或443)打开。而NodePort可以在运行pod和服务的工作节点的IP上访问。
您在这里部署的服务的类型是LoadBalancer,而不是NodePort
要进一步阅读,请查看this

对后续问题的答复

你提到的你所期望的和实际工作的,都是不正确的。
ExternalLBIP:NodePort:如果你看一下你分享的帖子,<NodePort>可以通过<NodeIP>访问,而不需要LB的外部IP。
ExternalLBIP:Port --(load-balanced across nodes)--> NodeIP:Port ->:LB将请求路由到NodePort,因此它将是NodeIP:NodePort
所以对于你的问题,NodePort在NodePort类型服务和LoadBalancer类型服务中的行为并不相反。您只需要记住NodePort只能在NodeIP上访问。
在役类型NodePort
NodeIP:NodePort -> ClusterIP:Port -> Pod:TargetPort
在役型号LoadBalancer
ExternalIPofLB:Port -> NodeIP:NodePort -> ClusterIP:Port -> Pod:TargetPort
例如,从LoadBalancer类型的运行服务:

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转发。

相关问题