在工作中,我們暴露集群內的服務通常有幾種方式,對于普通的http或者https,我們通常使用?Ingress + Nginx? ,對于原始的TCP或者UDP端口服務,可能需要選擇 ?LoadBalancer? ,它們的核心區別在于工作層級、協議支持和流量處理邏輯
1. 架構層級與協議支持
特性 | Ingress + Nginx | LoadBalancer |
---|---|---|
OSI 層級 | 應用層(L7) | 傳輸層(L4) |
支持的協議 | HTTP/HTTPS/HTTP2/WebSocket | TCP/UDP(原始協議透傳) |
TLS 終止 | ? 可在 Ingress 層終止 HTTPS(解密后轉HTTP) | ? 需后端自行處理加密 |
URL 路徑路由 | ? 支持 /path 路由到不同服務 | ? 只能通過端口區分服務 |
2. 流量處理邏輯對比
Ingress + Nginx 的工作流程
- 客戶端發起 HTTPS 請求(如
https://example.com
) - Nginx Ingress Controller:
- 終止 TLS(使用配置的證書解密流量)
- 根據
Ingress
規則路由到對應 Service - 默認以 HTTP 協議轉發到后端 Pod(除非配置
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
)
- 后端 Pod 收到明文 HTTP 請求
LoadBalancer 的工作流程
- 客戶端直接發送原始流量(TCP/UDP)
- 云廠商的 LoadBalancer(如 AWS NLB、GCP LB):
- 不解析應用層內容(無法識別 HTTP/HTTPS)
- 單純轉發數據包到后端節點的 NodePort
- Pod 直接收到原始流量(需自行處理 TLS 解密)
3. 關鍵差異場景
場景 1:HTTPS 服務
-
Ingress + Nginx:
# Ingress 配置示例(自動 HTTPS 終止) spec:tls:- hosts:- example.comsecretName: my-tls-secretrules:- host: example.comhttp:paths:- path: /backend:serviceName: my-serviceservicePort: 80
- 客戶端 ? Nginx:HTTPS(加密)
- Nginx ? Pod:HTTP(明文)
-
LoadBalancer:
# Service 配置示例(需 Pod 自己處理 TLS) spec:ports:- name: httpsport: 443targetPort: 443protocol: TCP
- 客戶端 ? Pod:全程 HTTPS(Pod 需加載證書)
場景 2:UDP 服務(如 STUN/VoIP)
-
Ingress + Nginx:
? 不支持(Nginx Ingress 僅限 HTTP 系協議) -
LoadBalancer:
? 完美支持(如 Coturn 的 UDP 3478 端口)ports: - name: stun-udpport: 3478protocol: UDP
4. 性能與高級功能
特性 | Ingress + Nginx | LoadBalancer |
---|---|---|
負載均衡算法 | 支持加權輪詢、最少連接等 | 通常僅限輪詢(依賴云廠商實現) |
WAF 集成 | ? 可集成 Web 應用防火墻 | ? 無法解析 HTTP 內容 |
流量鏡像 | ? 支持 | ? 不支持 |
客戶端真實 IP | 需配置 X-Forwarded-For | 需設置 externalTrafficPolicy: Local |
5. 如何選擇?
-
選擇 Ingress + Nginx 當:
- 暴露 HTTP/HTTPS 服務
- 需要基于域名或路徑的路由
- 希望集中管理 TLS 證書
- 需要 L7 功能(如重定向、速率限制)
-
選擇 LoadBalancer 當:
- 暴露非 HTTP 協議(如數據庫、STUN/UDP、游戲服務器)
- 需要直接透傳原始 TCP/UDP 流量
- 云廠商負載均衡器滿足性能需求
常見誤區
-
“LoadBalancer 也能處理 HTTPS?”
- ? 不能。云廠商的 L4 LB 只做端口轉發,HTTPS 解密必須由后端完成。
-
“Ingress 能替代 LoadBalancer?”
- ? 不能。Ingress 本身需要
LoadBalancer
或NodePort
類型的 Service 作為底層支撐。
- ? 不能。Ingress 本身需要
-
“為什么 Coturn 不能用 Ingress?”
- STUN/TURN 依賴 UDP 協議和原始數據包,而 Ingress 是 HTTP 網關,無法處理此類流量。