建立外部負載均衡器
本頁面展示瞭如何建立一個外部負載均衡器。
建立 Service 時,你可以選擇自動建立一個雲負載均衡器。 這會提供一個外部可訪問的 IP 地址,將流量傳送到叢集節點上的正確埠,前提是你的叢集執行在受支援的環境中並配置了正確的雲負載均衡器提供程式包。
你也可以使用 Ingress 來代替 Service。更多資訊,請檢視 Ingress 文件。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。 建議在至少兩個非控制平面主機節點的叢集上執行本教程。 如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一。
你的叢集必須執行在已支援配置外部負載均衡器的雲或其他環境中。
建立 Service
從清單檔案建立 Service
要建立外部負載均衡器,請在你的 Service 清單中新增以下行:
type: LoadBalancer
你的清單檔案可能如下所示:
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
- port: 8765
targetPort: 9376
type: LoadBalancer
使用 kubectl 建立 Service
你也可以使用 kubectl expose
命令及其 --type=LoadBalancer
標誌來建立 Service:
kubectl expose deployment example --port=8765 --target-port=9376 \
--name=example-service --type=LoadBalancer
此命令使用與引用資源相同的選擇器(在上述示例中,一個名為 example
的 Deployment)建立了一個新的 Service。
有關更多資訊,包括可選標誌,請參閱 kubectl expose
參考。
查詢你的 IP 地址
你可以透過 kubectl
獲取 Service 資訊來查詢為你的 Service 建立的 IP 地址:
kubectl describe services example-service
它應該生成類似於以下內容的輸出:
Name: example-service
Namespace: default
Labels: app=example
Annotations: <none>
Selector: app=example
Type: LoadBalancer
IP Families: <none>
IP: 10.3.22.96
IPs: 10.3.22.96
LoadBalancer Ingress: 192.0.2.89
Port: <unset> 8765/TCP
TargetPort: 9376/TCP
NodePort: <unset> 30593/TCP
Endpoints: 172.17.0.3:9376
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
負載均衡器的 IP 地址列在 LoadBalancer Ingress
旁邊。
注意
如果你在 Minikube 上執行 Service,可以使用以下命令找到分配的 IP 地址和埠:
minikube service example-service --url
保留客戶端源 IP
預設情況下,目標容器中看到的源 IP 不是客戶端的原始源 IP。要啟用客戶端 IP 的保留,可以在 Service 的 .spec
中配置以下欄位:
.spec.externalTrafficPolicy
- 指示此 Service 是否希望將外部流量路由到節點本地或叢集範圍的端點。有兩個可用選項:Cluster
(預設)和Local
。Cluster
會模糊客戶端源 IP,並可能導致流量跳轉到另一個節點,但通常具有良好的負載分發效果。Local
保留客戶端源 IP,並避免 LoadBalancer 和 NodePort 型別 Service 的二次跳轉,但可能存在流量分佈不均的風險。.spec.healthCheckNodePort
- 指定 Service 的健康檢查節點埠(數字埠號)。如果你未指定healthCheckNodePort
,則服務控制器會從叢集的 NodePort 範圍分配一個埠。
你可以透過設定 API 伺服器命令列選項--service-node-port-range
來配置該範圍。如果 Service 的type
設定為 LoadBalancer 且externalTrafficPolicy
設定為Local
,Service 將使用使用者指定的healthCheckNodePort
值(如果指定)。
在 Service 清單中將 externalTrafficPolicy
設定為 Local 會啟用此功能。例如:
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
- port: 8765
targetPort: 9376
externalTrafficPolicy: Local
type: LoadBalancer
保留源 IP 時的注意事項和限制
某些雲提供商的負載均衡服務不允許你為每個目標配置不同的權重。
在將流量傳送到節點時,每個目標的權重相等,外部流量在不同的 Pod 之間不會均勻地進行負載均衡。外部負載均衡器不知道每個節點上用作目標的 Pod 數量。
當 NumServicePods << NumNodes
或 NumServicePods >> NumNodes
時,即使沒有權重,也會看到一個相當接近的均勻分佈。
內部 Pod 到 Pod 的流量應該與 ClusterIP 服務類似,所有 Pod 具有相等的機率。
垃圾回收負載均衡器
通常情況下,在刪除 LoadBalancer 型別的 Service 後,雲提供商中相關的負載均衡器資源應立即被清理。但已知存在各種極端情況,導致相關 Service 被刪除後雲資源被孤立。為了防止這種情況發生,引入了 Service 負載均衡器的 Finalizer 保護機制。透過使用 Finalizer,Service 資源在相關負載均衡器資源也被刪除之前永遠不會被刪除。
具體來說,如果一個 Service 的 type
是 LoadBalancer,Service 控制器會附加一個名為 service.kubernetes.io/load-balancer-cleanup
的終結器。該終結器只會在負載均衡器資源被清理後才會被移除。這可以防止即使在 Service 控制器崩潰等極端情況下出現懸空負載均衡器資源。
外部負載均衡器提供商
重要的是要注意,此功能的資料路徑由 Kubernetes 叢集外部的負載均衡器提供。
當 Service 的 type
設定為 LoadBalancer 時,Kubernetes 為叢集內的 Pods 提供與 type
等於 ClusterIP 相同的功能,並透過對(Kubernetes 外部的)負載均衡器進行程式設計來擴充套件此功能,使其包含託管相關 Kubernetes Pods 的節點的條目。Kubernetes 控制平面自動化外部負載均衡器的建立、健康檢查(如果需要)和包過濾規則(如果需要)。一旦雲提供商為負載均衡器分配了 IP 地址,控制平面就會查詢該外部 IP 地址並將其填充到 Service 物件中。
下一步
- 請參閱使用 Service 連線應用程式教程
- 瞭解 Service
- 瞭解 Ingress