一、NodePort类型的Service NodePort是Kubernetes中Service的另一种类型。 它为Service分配一个静态端口, 这个端口在每个节点上都是开放的, 可以通过节点的IP地址和这个端口来访问Service。 NodePort类型的Service通常用于将集群内的服务暴露给集群外部的客户端。 例如, 假设有一个名为my-nodeport-service的Service, 它的NodePort端口是30007。 集群外部的客户端可以通过访问任意一个节点的IP地址和端口30007来与my-nodeport-service通信, 而不需要知道my-nodeport-service背后的Pod的具体IP地址。 集群外 → NodeIP:NodePort → ClusterIP → Pod 1.1、NodePort的端口范围 NodePort的端口范围是30000到32767, 这是Kubernetes默认 可以通过修改kube-apiserver的--service-node-port-range参数来更改这个范围。 1.2、NodePort的工作原理 当创建一个NodePort类型的Service时, Kubernetes会在每个节点上开放一个指定的端口。 当集群外部的客户端发送请求到这个端口时, 请求会被转发到Service的ClusterIP, 然后再由ClusterIP将请求路由到后端的Pod。 这种转发和路由通常是通过kube-proxy来实现的, kube-proxy会在每个节点上运行, 负责监听NodePort端口并将请求转发到相应的ClusterIP。 1.3、externalTrafficPolicy NodePort类型的Service有一个externalTrafficPolicy字段, 用于控制外部流量的路由策略。 该字段有两个可选值: Local和Cluster。 Local: 只将流量路由到与请求源节点相同节点上的Pod。这种策略可以减少跨节点的网络延迟, 但可能导致某些节点上的Pod过载, 而其他节点上的Pod闲置。 Cluster: 将流量路由到集群中所有匹配的Pod, 无论它们位于哪个节点上。这种策略可以实现更均匀的负载分布, 但可能增加跨节点的网络延迟。 1.4、示例配置文件 apiVersion: v1 kind: Service metadata: name: my-nodeport-service namespace: default spec: type: NodePort selector: app: my-app ports: - port: 80 # Service暴露的端口 targetPort: 8080 # Pod监听的端口 nodePort: 30007 # NodePort端口