Kubernetes 創(chuàng)建外部負載均衡器

2022-06-15 11:56 更新

創(chuàng)建外部負載均衡器

本文展示如何創(chuàng)建一個外部負載均衡器。

創(chuàng)建 服務(wù) 時,你可以選擇自動創(chuàng)建云網(wǎng)絡(luò)負載均衡器。 負載均衡器提供外部可訪問的 IP 地址,可將流量發(fā)送到集群節(jié)點上的正確端口上 ( 假設(shè)集群在支持的環(huán)境中運行,并配置了正確的云負載均衡器驅(qū)動包)。

你還可以使用 Ingress 代替 Service。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:

你的集群必須在已經(jīng)支持配置外部負載均衡器的云或其他環(huán)境中運行。

創(chuàng)建服務(wù) 

基于清單文件創(chuàng)建服務(wù) 

要創(chuàng)建外部負載均衡器,請將以下內(nèi)容添加到你的 Service 清單文件:

    type: LoadBalancer

你的清單文件可能會如下所示:

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

使用 kubectl 創(chuàng)建 Service 

你也可以使用 ?kubectl expose? 命令及其 ?--type=LoadBalancer? 參數(shù)創(chuàng)建服務(wù):

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

此命令通過使用與引用資源(在上面的示例的情況下,名為 ?example ?的 Deployment) 相同的選擇器來創(chuàng)建一個新的服務(wù)。

更多信息(包括更多的可選參數(shù)),請參閱 kubectl expose 指南。

找到你的 IP 地址 

你可以通過 ?kubectl ?獲取服務(wù)信息,找到為你的服務(wù)創(chuàng)建的 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 上運行服務(wù),你可以通過以下命令找到分配的 IP 地址和端口:
minikube service example-service --url

保留客戶端源 IP 

默認情況下,目標容器中看到的源 IP 將不是客戶端的原始源 IP。 要啟用保留客戶端 IP,可以在服務(wù)的 ?.spec? 中配置以下字段:

  • ?.spec.externalTrafficPolicy? - 表示此 Service 是否希望將外部流量路由到節(jié)點本地或集群范圍的端點。 有兩個可用選項:?Cluster?(默認)和 ?Local?。 ?Cluster ?隱藏了客戶端源 IP,可能導(dǎo)致第二跳到另一個節(jié)點,但具有良好的整體負載分布。 ?Local ?保留客戶端源 IP 并避免 LoadBalancer 和 NodePort 類型服務(wù)的第二跳, 但存在潛在的不均衡流量傳播風(fēng)險。
  • ?.spec.healthCheckNodePort? - 指定服務(wù)的 healthcheck nodePort(數(shù)字端口號)。 如果你未指定 ?healthCheckNodePort?,服務(wù)控制器從集群的 NodePort 范圍內(nèi)分配一個端口。 你可以通過設(shè)置 API 服務(wù)器的命令行選項 ?--service-node-port-range? 來配置上述范圍。 在服務(wù) ?type ?設(shè)置為 LoadBalancer 并且 ?externalTrafficPolicy ?設(shè)置為 ?Local ?時, Service 將會使用用戶指定的 ?healthCheckNodePort ?值(如果你指定了它)。

可以通過在服務(wù)的清單文件中將 ?externalTrafficPolicy ?設(shè)置為 Local 來激活此功能。比如:

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

保留源 IP 時的注意事項和限制 

一些云服務(wù)供應(yīng)商的負載均衡服務(wù)不允許你為每個目標配置不同的權(quán)重。

由于每個目標在向節(jié)點發(fā)送流量方面的權(quán)重相同,因此外部流量不會在不同 Pod 之間平均負載。 外部負載均衡器不知道每個節(jié)點上用作目標的 Pod 數(shù)量。

在 ?NumServicePods << _NumNodes? 或 ?NumServicePods >> NumNodes? 時, 即使沒有權(quán)重,也會看到接近相等的分布。

內(nèi)部 Pod 到 Pod 的流量應(yīng)該與 ClusterIP 服務(wù)類似,所有 Pod 的概率相同。

回收負載均衡器 

特性狀態(tài): Kubernetes v1.17 [stable]

在通常情況下,應(yīng)在刪除 LoadBalancer 類型 Service 后立即清除云服務(wù)供應(yīng)商中的相關(guān)負載均衡器資源。 但是,眾所周知,在刪除關(guān)聯(lián)的服務(wù)后,云資源被孤立的情況很多。 引入了針對服務(wù)負載均衡器的終結(jié)器保護,以防止這種情況發(fā)生。 通過使用終結(jié)器,在刪除相關(guān)的負載均衡器資源之前,也不會刪除服務(wù)資源。

具體來說,如果服務(wù)具有 ?type ?LoadBalancer,則服務(wù)控制器將附加一個名為 ?service.kubernetes.io/load-balancer-cleanup? 的終結(jié)器。 僅在清除負載均衡器資源后才能刪除終結(jié)器。 即使在諸如服務(wù)控制器崩潰之類的極端情況下,這也可以防止負載均衡器資源懸空。

外部負載均衡器供應(yīng)商 

請務(wù)必注意,此功能的數(shù)據(jù)路徑由 Kubernetes 集群外部的負載均衡器提供。

當服務(wù) ?type ?設(shè)置為 LoadBalancer 時,Kubernetes 向集群中的 Pod 提供的功能等同于 ?type ?設(shè)置為 ClusterIP,并通過使用托管了相關(guān) Kubernetes Pod 的節(jié)點作為條目對負載均衡器 (從外部到 Kubernetes)進行編程來擴展它。 Kubernetes 控制平面自動創(chuàng)建外部負載均衡器、健康檢查(如果需要)和包過濾規(guī)則(如果需要)。 一旦云服務(wù)供應(yīng)商為負載均衡器分配了 IP 地址,控制平面就會查找該外部 IP 地址并將其填充到 Service 對象中。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號