在Kubernetes中,Service是一种抽象层,它将请求路由到一组Pod。当你需要将Service的不同端口映射到不同的Pod时,可以通过以下两种主要方式实现:
方法一:使用单个Service的多端口配置
如果不同的Pod提供不同的服务(如HTTP和HTTPS),但属于同一应用,可以在同一个Service中定义多个端口,每个端口映射到不同的Pod端口。
示例配置
apiVersion: v1
kind: Service
metadata:
name: my-multi-port-service
spec:
selector:
app: my-app # 选择所有带有app=my-app标签的Pod
ports:
- name: http # 端口名称(必须唯一)
port: 80 # Service端口(集群内访问)
targetPort: 8080 # 后端Pod端口(HTTP服务)
- name: https
port: 443
targetPort: 8443 # 后端Pod端口(HTTPS服务)
工作原理
- 客户端通过Service的IP和端口(如
10.96.0.10:80
)访问。 - kube-proxy根据端口将请求转发到匹配
app=my-app
标签的Pod的对应端口(如8080
或8443
)。
方法二:使用多个Service指向不同的Pod组
如果不同的功能由不同标签的Pod提供(如前端和后端),可以创建多个Service,每个Service选择不同的Pod组。
示例配置
# 前端Service
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: my-app
tier: frontend # 仅选择前端Pod
ports:
- port: 80
targetPort: 3000
---
# 后端Service
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: my-app
tier: backend # 仅选择后端Pod
ports:
- port: 80
targetPort: 8080
工作原理
- 客户端通过不同的Service IP访问(如
frontend-service:80
或backend-service:80
)。 - 每个Service独立路由到其选择的Pod组(通过标签筛选)。
方法三:使用EndpointSlice(高级场景)
对于超大规模集群,可以通过EndpointSlice手动控制Service与Pod的映射关系,实现更细粒度的端口分配。
示例配置
# 创建EndpointSlice
apiVersion: discovery.k8s.io/v1
kind: EndpointSlice
metadata:
name: my-service-ep
labels:
kubernetes.io/service-name: my-service
addressType: IPv4
ports:
- name: http
protocol: TCP
port: 80
- name: https
protocol: TCP
port: 443
endpoints:
- addresses:
- "10.244.1.10" # Pod 1 IP
ports:
- name: http
port: 8080
- name: https
port: 8443
- addresses:
- "10.244.1.11" # Pod 2 IP
ports:
- name: http
port: 8080
- name: https
port: 8443
工作原理
- EndpointSlice显式指定每个Pod的IP和端口映射。
- Service通过标签
kubernetes.io/service-name
关联到该EndpointSlice。
选择策略
场景 | 推荐方法 |
---|---|
同一组Pod提供多个服务端口 | 单个Service的多端口配置 |
不同组Pod提供不同服务 | 多个Service指向不同Pod组 |
超大规模集群或自定义负载均衡 | 使用EndpointSlice |
验证配置
查看Service配置:
kubectl describe service my-service
检查Endpoint映射:
kubectl get endpoints my-service
测试访问:
# 在集群内Pod中测试 curl http://<SERVICE_IP>:<PORT>
总结
通过合理设计Service的端口映射和标签选择器,你可以灵活地将请求路由到不同的Pod端口。对于复杂场景,建议结合使用多个Service和EndpointSlice,以实现更精细的流量控制。