Kubernetes 的負載均衡器
本專案包括 Spring Cloud Load Balancer,用於基於 Kubernetes Endpoints 或 Kubernetes Service 進行負載均衡。要將其新增到您的專案中,請新增以下依賴項。Fabric8 實現
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-fabric8-loadbalancer</artifactId>
</dependency>
Kubernetes Java 客戶端實現
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
</dependency>
負載均衡器有兩種“模式”:POD 和 SERVICE,由屬性表示(預設為 POD)
spring.cloud.kubernetes.loadbalancer.mode=SERVICE
或
spring.cloud.kubernetes.loadbalancer.mode=POD
在 POD 模式下,我們將使用 DiscoveryClient 來查詢所有與您的負載均衡器名稱匹配的服務。例如,如果您有如下配置
@Bean
@LoadBalanced
WebClient.Builder client() {
return WebClient.builder();
}
並使用該 WebClient 向 service-a 發出請求,我們將使用 service-a 以該值呼叫 DiscoveryClient::getInstances。由於這使用了 DiscoveryClient,因此所有與其相關的配置都適用,這些配置在文件的相關部分進行了解釋。
另一方面,如果您使用 SERVICE 模式,情況略有不同,但與發現客戶端設定非常相似。例如,為了回答在哪個名稱空間中查詢名為 service-a 的服務的問題,我們將使用以下設定之一
spring.cloud.kubernetes.discovery.all-namespaces
spring.cloud.kubernetes.discovery.namespaces
以在所有名稱空間或所謂的“選擇性名稱空間”中搜索。如果以上均未指定,則 名稱空間解析 將生效。
一旦我們找到所有服務,我們需要知道透過哪個埠呼叫它們。如果所討論的服務定義了單個埠,我們將使用該埠,無論其名稱如何。如果沒有定義埠,則此服務將不被視為負載均衡並將被跳過。
如果定義了多個埠,我們將嘗試將其名稱與屬性值匹配(預設為 http)
spring.cloud.kubernetes.loadbalancer.portName
如果找到這樣的匹配,將使用該埠號。否則,將使用列表中的“第一個”埠。這最後一個選項是不確定的,必須小心。
一旦我們知道埠,我們就知道如何呼叫該服務。URL 將具有以下形式
service-a.<SERVICE_NAMESPACE>.svc.<DOMAIN>:<FOUND_PORT>
<SERVICE_NAMESPACE> 是服務所在的名稱空間,DOMAIN 是屬性的值(預設等於 cluster.local)
spring.cloud.kubernetes.loadbalancer.clusterDomain
而 <FOUND_PORT> 是我們在上述過程中選擇的服務埠。
如果需要透過 HTTPS 訪問服務,您需要明確配置。其規則與發現實現的規則完全相同,可在有關發現客戶端的文件相關部分中找到。