建立外部負載平衡器

本頁說明如何建立外部負載平衡器。

在建立服務時,您可以選擇自動建立雲端負載平衡器。這會提供一個可從外部存取的 IP 位址,將流量傳送到叢集節點上的正確連接埠,前提是您的叢集在支援的環境中執行,並且已設定正確的雲端負載平衡器提供者套件

您也可以使用 Ingress 來取代服務。如需更多資訊,請查看 Ingress 文件。

開始之前

您需要有一個 Kubernetes 叢集,而且必須將 kubectl 命令列工具設定為與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用下列 Kubernetes 實驗環境之一

您的叢集必須在雲端或其他已支援設定外部負載平衡器的環境中執行。

建立服務

從 Manifest 建立服務

若要建立外部負載平衡器,請將下列行新增至您的服務 Manifest

    type: LoadBalancer

您的 Manifest 可能看起來像這樣

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  type: LoadBalancer

使用 kubectl 建立服務

或者,您可以使用 kubectl expose 命令及其 --type=LoadBalancer 旗標來建立服務

kubectl expose deployment example --port=8765 --target-port=9376 \
        --name=example-service --type=LoadBalancer

此命令會使用與參照資源相同的選取器建立新的服務 (在上述範例中,參照資源為名為 exampleDeployment)。

如需更多資訊,包括選用旗標,請參閱 kubectl expose 參考文件

尋找您的 IP 位址

您可以透過 kubectl 取得服務資訊,以找到為您的服務建立的 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 旁邊。

保留用戶端來源 IP

預設情況下,目標容器中看到的來源 IP 並非用戶端的原始來源 IP。若要啟用保留用戶端 IP,可以在 Service 的 .spec 中設定以下欄位

  • .spec.externalTrafficPolicy - 表示此服務是否希望將外部流量路由到節點本機或叢集範圍的端點。有兩個可用的選項:Cluster (預設) 和 LocalCluster 會隱藏用戶端來源 IP,並可能導致跳轉到另一個節點,但應具有良好的整體負載分散效果。Local 會保留用戶端來源 IP,並避免 LoadBalancer 和 NodePort 類型服務的第二次跳轉,但可能會有流量分散不均的風險。
  • .spec.healthCheckNodePort - 指定服務的健康檢查節點埠 (數字埠號)。如果您未指定 healthCheckNodePort,服務控制器會從叢集的 NodePort 範圍分配一個埠號。
    您可以透過設定 API 伺服器命令列選項 --service-node-port-range 來設定該範圍。如果您指定 healthCheckNodePort 值,且 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 << NumNodesNumServicePods >> NumNodes 時,即使沒有權重,也會看到相當接近的平均分配。

內部 Pod 到 Pod 的流量行為應類似於 ClusterIP 服務,所有 Pod 的機率均等。

垃圾收集負載平衡器

功能狀態: Kubernetes v1.17 [stable]

在一般情況下,在刪除 LoadBalancer 類型的 Service 後,雲端供應商中相關的負載平衡器資源應很快被清除。但已知在某些極端情況下,在關聯的 Service 被刪除後,雲端資源會變成孤立狀態。「Service LoadBalancers 的 Finalizer 保護」的引入是為了防止這種情況發生。透過使用 finalizer,Service 資源將永遠不會被刪除,直到相關的負載平衡器資源也被刪除為止。

具體來說,如果 Service 的 type 為 LoadBalancer,服務控制器將附加一個名為 service.kubernetes.io/load-balancer-cleanup 的 finalizer。finalizer 只有在負載平衡器資源被清除後才會被移除。這可以防止懸掛的負載平衡器資源,即使在服務控制器崩潰等極端情況下也是如此。

外部負載平衡器供應商

重要的是要注意,此功能的路徑是由 Kubernetes 叢集外部的負載平衡器提供的。

當 Service type 設定為 LoadBalancer 時,Kubernetes 提供與叢集中 Pod 的 type 等於 ClusterIP 相同的功能,並透過使用託管相關 Kubernetes Pod 的節點條目來程式設計(Kubernetes 外部的)負載平衡器來擴展它。Kubernetes 控制平面自動化外部負載平衡器的建立、健康檢查(如果需要)和封包篩選規則(如果需要)。一旦雲端供應商為負載平衡器分配 IP 位址,控制平面就會查詢該外部 IP 位址並將其填入 Service 物件中。

下一步

上次修改時間:2023 年 10 月 22 日下午 6:49 PST:修正了「建立外部負載平衡器」頁面上的錯字 (28c7a312af)