如何知道可以从 Kubernetes API 服务器分配哪个节点端口?

How to know which nodeport can be allocated from Kubernetes API Server?

我想弄清楚 kubernetes 如何知道在创建具有这样的节点端口类型的新服务时可以分配哪个节点端口:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
    - port: 80
      targetPort: 80

我搜索 google 并找到了这些 kubernetes 源代码,但我不明白它是如何工作的。 https://github.com/kubernetes/kubernetes/blob/master/pkg/registry/core/service/portallocator/allocator.go

节点端口在30000-32767之间随机选择。您可以在服务定义中设置它。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
      # By default and for convenience, the `targetPort` is set to the same value as the `port` field.
    - port: 80
      targetPort: 80
      # Optional field
      # By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)
      nodePort: 30007

来自文档:https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

更新

放在包kubernetes/pkg/registry/core/service/portallocator中的类负责为一个服务分配节点端口

此测试记录了行为:https://github.com/kubernetes/kubernetes/blob/master/pkg/registry/core/service/portallocator/operation_test.go

Kubernetes 只占用一个随机端口,如果那个端口不可用,它会占用下一个端口。

如果你可以阅读该包中的其他 类 是了解该行为的良好起点。