如何找出 Kubernetes 中可用的端口?

JVE*_*999 2 kubernetes

我想在 kubernetes 集群中的不同端口上运行多个服务,我想知道如何检查哪些端口可用并且不会与我的服务产生任何冲突。我还想知道每个端口上的服务名称,以便更好地了解我的配置。

Pjo*_*erS 7

还有与验证哪些NodePorts已在使用中相关的类似问题。你可以在这里找到它。

此命令将显示所有类型和已在使用中的ports所有内容。namespacesNodePort

$ kubectl get svc --all-namespaces -o go-template='{{range .items}}{{range.spec.ports}}{{if .nodePort}}{{.nodePort}}{{"\n"}}{{end}}{{end}}{{end}}'
30007
30107
30207
30307
30407
30676
Run Code Online (Sandbox Code Playgroud)

但是,请记住,Kubernetes 不允许您第二次使用同样的NodePort.

$ cat<<eof|kubectl apply -f -
> apiVersion: v1
> kind: Service
> metadata:
>   name: my-service-test
> spec:
>   type: NodePort
>   selector:
>     app: MyApp
>   ports:
>     - port: 80
>       targetPort: 80
>       nodePort: 30307
> eof
The Service "my-service-test" is invalid: spec.ports[0].nodePort: Invalid value: 30307: provided port is already allocated
Run Code Online (Sandbox Code Playgroud)

此外,还有一些非常具体的场景,当您想要使用K8s 文档中提到的默认范围之外的端口时。有一个解决方法,如果您添加一个--service-node-port-range带有请求范围的特殊标志,准入控制器允许您使用NodePort端口80443. 有关如何操作的详细信息,请查看此答案


Tho*_*ach 5

我想说的是,您需要了解您的 pod(您的多个服务)如何让流量进出您的 k8s 集群。

服务网络

在那之后,据我了解你的意思是你想问我们如何管理 NodePorts

节点端口

正如文件提供的那样:

如果将 type 字段设置为NodePort,Kubernetes 控制平面会从--service-node-port-range flag指定的范围(默认值:30000-32767)中分配端口。每个节点将该端口(每个节点上的相同端口号)代理到您的服务中。您的服务在其.spec.ports[*].nodePort字段中报告分配的端口。

所以 k8s 已经NodePorts为你管理了:

  • 配置是集群级别的,所以你不需要关心工作负载节点之间的冲突。

  • 如果您不指定NodePort,k8s 集群将生成一个以上范围的端口并将其映射到您的服务(它将指向您的 pods - 您的应用程序)

  • 您不能在 1 个 k8s-cluster 中指定相同的 NodePort,因此您无需担心与您的服务冲突。

  • 还有一件事,您可以使用下面的 kubectl 命令来显示 NodePort 与它们映射的所有 svc 和详细信息: kubectl get svc --all-namespaces 或者您可以将 k8s-dashboard 安装到您的 k8s-cluster 中并检查应用程序的每个命名空间以查看和管理您的服务和节点端口。

您需要关心的另一件事是控制 VPC 中的流量(如果您使用云解决方案) 在 unix 机器中管理流量的低级概念是 iptable。但是为了获得这个概念,您只需要知道我们为什么以及如何管理流量:

  • VPC 网络 (GCP) 上的防火墙规则
  • VPC (AWS) 上的安全组