我在 https://kubernetes.io/docs/concepts/services-networking/service/ 阅读 k8s 文档。
<块引用>NodePort:在静态端口(
节点端口)。一个 ClusterIP 服务,NodePort 服务路由到它,
是自动创建的。 您将能够联系 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
节点IP
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 类型的服务和 LoadBalancer 类型的服务中的 NodePort 行为完全相反。
来自popular answer:
节点端口
如果您从节点的外部 IP 访问 nodePort 上的此服务,
它将请求路由到 spec.clusterIp:spec.ports[*].port
,后者
将依次将其路由到您的 spec.ports[*].targetPort
(如果已设置)。这
服务也可以通过与 ClusterIP 相同的方式访问。
...
负载均衡器
您可以从负载均衡器的 IP 地址访问此服务,
它将您的请求路由到一个 nodePort,它依次路由
请求到 clusterIP 端口。
因此,对于 NodePort,请求如下:
NodeIP:NodePort -> ClusterIP:Port -> ClusterIP:TargetPort
上面的 Port
是在 yaml 中指定为 port
的端口,它在集群内的指定端口上公开 Kubernetes 服务。 TargetPort 是由 yaml 中的 targetPort
指定的端口,服务将向其发送请求,您的 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
答案 0 :(得分:2)
您看到的是正确的,因为您使用 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类型的服务和LoadBalancer类型的服务中NodePort
的行为并不是相反的。您只需要记住 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
转发。