了解从外部环境访问 NodePort

时间:2021-04-08 14:32:55

标签: kubernetes kubernetes-service

我在 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

1 个答案:

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

Listener of the ELB