在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標簽的Podports:- name: http # 端口名稱(必須唯一)port: 80 # Service端口(集群內訪問)targetPort: 8080 # 后端Pod端口(HTTP服務)- name: httpsport: 443targetPort: 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-apptier: frontend # 僅選擇前端Podports:- port: 80targetPort: 3000---
# 后端Service
apiVersion: v1
kind: Service
metadata:name: backend-service
spec:selector:app: my-apptier: backend # 僅選擇后端Podports:- port: 80targetPort: 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-eplabels:kubernetes.io/service-name: my-service
addressType: IPv4
ports:- name: httpprotocol: TCPport: 80- name: httpsprotocol: TCPport: 443
endpoints:- addresses:- "10.244.1.10" # Pod 1 IPports:- name: httpport: 8080- name: httpsport: 8443- addresses:- "10.244.1.11" # Pod 2 IPports:- name: httpport: 8080- name: httpsport: 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,以實現更精細的流量控制。