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 Client 實現

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
</dependency>

負載均衡器有兩種工作“模式”:PODSERVICE,由屬性指定(預設為 POD

spring.cloud.kubernetes.loadbalancer.mode=SERVICE

spring.cloud.kubernetes.loadbalancer.mode=POD

POD 模式下,我們將使用 DiscoveryClient 來查詢與您的負載均衡器名稱匹配的所有服務。例如,如果您有以下配置

@Bean
@LoadBalanced
WebClient.Builder client() {
	return WebClient.builder();
}

並使用該 WebClientservice-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 訪問服務,則需要明確進行配置。其規則與發現實現的規則完全相同,可在關於 discovery-client 的文件相關部分中找到。