当前位置: 首页 > 知识库问答 >
问题:

了解外部环境对NodePort的访问

庾鸿飞
2023-03-14

我在https://kubernetes.io/docs/concepts/services-networking/service/.看K8的文档

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

所以,我试着实际检查一下。在此LoadBalancer服务中,端口31724是节点端口,80是容器端口。根据文件,节点港应该对外开放,集装箱港不应该对外开放。但对于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行为正好相反呢
来自一个流行的答案:

节点端口
如果您从节点的外部IP在节点端口上访问此服务,它会将请求路由到spec.clusterIp:spec.ports[*]。端口,然后将其路由到您的规范端口【*】。目标端口(如果设置)。也可以使用与ClusterIP相同的方式访问此服务
负载平衡器
您可以从负载平衡器的IP地址访问此服务,该地址将请求路由到节点端口,节点端口又将请求路由到clusterIP端口。

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

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

上面的Port是yaml中指定为port的端口,它在集群中的指定端口上公开库伯内特斯服务。TargetPort是yaml中Target etPort指定的端口,服务将向其发送请求,您的pod将监听该端口。

对于负载均衡器,我期望的行为是:

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个答案

益何平
2023-03-14

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

您在此处部署的服务属于LoadBalancer类型,而不是NodePort类型。

如需进一步阅读,请查看此内容。

对后续问题的答复:

你在《你的期望》中提到的内容和实际有效的内容都是不正确的。

ExternalLBIP:NodePort:如果您查看您分享的帖子,

<代码>外部BIP:端口--(节点间负载平衡)--

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

在服务类型节点端口中:

NodeIP:NodePort-

在服务类型中,负载平衡器:

<代码>外部POFLB:端口-

例如,从正在运行的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转发到NodePort

 类似资料:
  • 是否可以从一个地方访问不同应用。属性的环境变量。实际上,我们正在构建这个软件,我们有不同的应用。不同项目的属性,如用户资产。因此,是否有可能将所有环境变量放在一个外部位置。如果是,将如何访问?

  • 在过去的几个小时里,我一直在谷歌上搜索,看看是否可以从AWS Lambda或我的本地PC等外部服务中使用Google Secret Manager。我找不到任何有用的东西,也找不到一些正确描述执行步骤的东西。 我不想玩API,最终通过OAuth进行身份验证,我希望使用客户端库。我该怎么做呢? 到目前为止,我已经提到了以下链接: https://cloud.google.com/secret-man

  • 我正在迭代JSON数据,获取数据并将其赋值给一个全局变量,当我在循环内打印变量时,我得到了所有数据,然而,当我在循环外打印变量时,我只得到了JSON对象的最后一些数据。我的目标是获取数据并将其作为函数的参数传递。我如何获取循环之外的所有数据?

  • Unix is the answer, but only if you phrase the question very carefully. — Belinda Asbell 在本章中,我们将学习如下内容: 创建 Facter 的自定义 fact 在运行 Puppet 之前和之后执行命令 从 Shell 会话生成 Puppet 配置清单 从运行的系统上生成 Puppet 配置清单 使用 Pupp

  • 本文向大家介绍Dockerfile 部署java web的环境详解,包括了Dockerfile 部署java web的环境详解的使用技巧和注意事项,需要的朋友参考一下 Dockerfile 构建java web 环境 Dockfile 介绍: Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些D

  • 在开展实验之前,我们需要根据不同的平台提前安装相关依赖的软件包,具体需要的软件包如下: Rust 工具链 Rust 版本管理工具:rustup Rust 软件包管理工具:cargo Rust 编译器:rustc 等等 虚拟机软件:QEMU (版本至少支持 RISC-V 64) 具体安装的方法在不同平台上安装方式类似,但也有细微差别,后面会有具体说明。 安装 QEMU 根据不同平台,我们分为下面 3