Featured image of post Loadbalancer一定会有nodePort吗

Loadbalancer一定会有nodePort吗

service我们使用类型是LoadBalancer时一定会有nodePort吗?能不能去掉?

当Service类型为LoadBalancer时,Kubernetes会自动分配一个NodePort,但这个行为可以通过配置进行修改:

  1. 默认行为:当创建一个LoadBalancer类型的Service时,Kubernetes会自动分配一个NodePort。这是因为LoadBalancer类型实际上是建立在NodePort之上的一个扩展。
  2. 移除NodePort:从Kubernetes 1.20版本开始,可以通过设置Service的 spec.allocateLoadBalancerNodePorts 字段为 false 来防止自动分配NodePort。这样做会创建一个没有NodePort的LoadBalancer Service。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  annotations:
    metallb.universe.tf/address-pool: first-pool
    metallb.universe.tf/ip-allocated-from-pool: first-pool
spec:
  selector:
    app: nginx
  loadBalancerIP: 172.19.3.200
  allocateLoadBalancerNodePorts: false
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
  1. 注意事项:
  • 这个功能需要云提供商的支持。不是所有的云提供商都支持没有NodePort的LoadBalancer。

  • 如果集群或云提供商不支持这个特性,即使设置了allocateLoadBalancerNodePorts: false,也可能还是会分配NodePort。

  • 移除NodePort可能会影响某些网络配置或监控工具,因此在实施前请确保充分测试。

  1. 替代方案:如果主要目标是避免暴露NodePort,但仍然需要LoadBalancer功能,可以考虑使用Ingress控制器作为替代方案。

总的来说,虽然LoadBalancer类型的Service默认会分配NodePort,但是从Kubernetes 1.20版本开始,是可以通过配置来避免这种行为的。不过,具体能否实现还取决于Kubernetes版本和云提供商的支持情况。