我在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
1条答案
按热度按时间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
类型的运行服务:正如你在下面的代码片段中看到的,请求将从
LB Port to NodePort
转发。