成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Kubernetes中實現gRPC流量負載均衡

云計算 云原生 后端
在嘗試將gRPC服務部署到Kubernetes集群中時,一些用戶(包括我)面臨的挑戰之一是實現適當的負載均衡。

在嘗試將gRPC服務部署到Kubernetes集群中時,一些用戶(包括我)面臨的挑戰之一是實現適當的負載均衡。在深入了解如何平衡gRPC的方式之前,我們首先需要回答一個問題,即為什么需要平衡流量,如果Kubernetes已經完成了這項工作。

本文關注于Kubernetes和Golang。

為什么在Kubernetes中無法適當地平衡gRPC流量?

之所以難以平衡gRPC流量的主要原因是人們將gRPC視為HTTP,這就是問題的根源。設計上它們是不同的,雖然HTTP為每個請求創建和關閉連接,但gRPC使用HTTP2協議,在長時間的TCP連接上運行,使得平衡更加困難,因為多個請求通過同一個連接進行多路復用。然而,這并不是配置gRPC服務在Kubernetes中出現平衡問題的唯一原因,以下是一些常見的錯誤配置:

  • 錯誤的gRPC客戶端配置
  • 錯誤的Kubernetes服務配置

錯誤的gRPC客戶端配置

設置gRPC客戶端時常見的情況是選擇默認配置,這對于1-1連接類型完全有效,但對于生產環境來說并不如我們所希望的有效。這背后的原因是因為默認的gRPC客戶端提供了使用簡單的IP/DNS記錄連接的可能性,這只會創建一個與目標服務的連接。

因此,需要為與多個服務器建立連接進行不同的設置,將連接類型從1-1轉換為1-N。

默認設置:

func main(){
  conn, err := grpc.Dial("my-domain:50051", grpc.WithInsecure())
  if err != nil {
    log.Fatalf("error connecting with gRPC server: %v", err)
  }
  
  defer conn.Close()
  cli := test.NewTestServiceClient(conn)
  rs, err := cli.DoSomething(context.Background(), ...)
  .
  .
  .
}

新的設置:

func main(){
  conn, err := grpc.Dial("my-domain:50051", grpc.WithInsecure())
  if err != nil {
    log.Fatalf("error connecting with gRPC server: %v", err)
  }
  
  defer conn.Close()
  cli := test.NewTestServiceClient(conn)
  rs, err := cli.DoSomething(context.Background(), ...)
  .
  .
  .
}

這里有兩個重要的更改需要注意:

  • 地址: 最終解析的地址將類似于 dns:///my-domain:50051,之所以使用這種格式是因為Dial函數允許我們使用由Scheme://Authority/Endpoint組成的目標,而在我們的情況下,我跳過了Authority。因此,首先我添加了dns作為方案,因為我希望解析一個域并持續觀察其更改,解析器選項有透傳(默認)、dns和手動,更多詳情請參閱這里。
  • 負載均衡器選項: 如果我們的客戶端現在連接到多個服務器,那么我們的gRPC客戶端可以根據所選擇的負載均衡算法平衡請求。

總結一下,我們的gRPC客戶端現在能夠創建不同的連接,前提是域名解析為多個A或AAAA記錄,而且不僅如此,現在還能夠將請求均勻地分配到不同的服務器。

現在讓我們看看如何讓它與Kubernetes一起工作的缺失部分。

錯誤的Kubernetes服務配置

在Kubernetes中創建服務非常簡單,我們只需要定義服務名稱、端口和選擇器,以便服務可以動態地將Pod分組并自動平衡請求,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - name: grpc
      protocol: TCP
      port: 50051
      targetPort: 50051

那么,對于先前的設置,問題在于默認的Kubernetes服務只創建了一個DNS記錄,鏈接到單個IP。因此,當您執行類似 nslookup my-service.{namespace}.svc.cluster.local 的操作時,返回的是一個單個IP,這使得在常見的gRPC實現中連接圖看起來像這樣:

例如,使用默認的Kubernetes服務的連接圖:

綠線表示與客戶端的活動連接,黃色表示未活動的Pod。客戶端與Kubernetes服務創建了持久連接,同時服務也與其中一個Pod創建了連接,但這并不意味著服務與其余的Pod沒有連接。

讓我們使用一個無頭服務來解決這個問題:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
 clusterIP: None **this is the key***
 selector:
    app: my-app
  ports:
    - name: grpc
      protocol: TCP
      port: 50051
      targetPort: 50051

創建了無頭服務后,nslookup看起來有些不同,現在它返回與之關聯的記錄(將Pod的IP分組到服務中),從而使gRPC客戶端更好地了解需要連接的服務器數量。

現在您已經看到了gRPC客戶端的配置,您必須知道為什么Kubernetes服務返回與一組Pod關聯的IP非常重要。原因是客戶端可以看到所有需要建立連接的服務器。在這一點上,您可能已經意識到了一個注意事項,即平衡的責任現在在客戶端部分,而不在Kubernetes的一側。我們現在需要從Kubernetes那里得到的主要任務是保持與服務關聯的Pod列表的最新狀態。

例如,在具有無頭Kubernetes服務的連接圖中,可以看到連接發生了一些變化,現在我們不通過Kubernetes服務來訪問Pod,而是使用Kubernetes服務來檢索與域名關聯的Pod列表,然后直接與Pod建立連接。但是不要因為直接連接到Pod而感到驚慌,因為我們在客戶端中設置了DNS解析器類型,該解析器將持續監視與無頭服務的更改,并將與可用的Pod保持最新的連接。

為什么不使用服務網格?

如果可以的話,請使用服務網格,因為在服務網格中,所有這些設置都是透明的,而且最重要的是它是與編程語言無關的。關鍵區別在于服務網格利用了Sidecar模式和控制平面來編排入站和出站流量,還可以看到所有網絡和流量類型(HTTP、TCP等),從而能夠正確平衡請求。簡而言之,如果您不使用服務網格,那么您需要直接從每個客戶端連接到多個服務器,或者連接到一個L7代理來幫助平衡請求。

附加信息

盡管先前的設置可以工作,但我在嘗試在alpine Linux映像中進行Pod輪換或擴展時重新平衡連接時遇到了問題。經過一些研究,我意識到我并不是唯一遇到這種問題的人,可以查看這里和這里的一些相關的GitHub問題。這就是為什么我決定創建自己的解析器的原因,您可以在這里查看我創建的自定義解析器,我創建的自定義解析器非常基礎,但現在可以正常工作,gRPC客戶端現在可以再次監聽域名的更改,我還為該庫添加了一個可配置的監聽器,它每隔一段時間查找域名并更新提供給gRPC連接管理器的IP集合,如果您想貢獻,歡迎加入。

另一方面,因為我想深入了解,所以我決定創建自己的gRPC代理(我也學到了很多東西),利用了gRPC的http2基礎,我可以創建一個代理,而無需更改proto負載消息或甚至不知道proto文件的定義(還使用了前面提到的自定義解析器)。

最后,我想說的是,如果您的gRPC客戶端需要與許多服務器連接,我強烈建議使用代理作為平衡的機制,因為將這個機制放在主應用程序中將增加復雜性和資源消耗,嘗試保持許多打開的連接并重新平衡它們,想象一下,如果最終的平衡在應用程序中,您將有一個與N個服務器連接的實例(1-N),但是使用代理,您將有一個與M個代理連接到N個服務器的實例(1-M-N),其中M<N,因為每個代理實例可以處理與不同服務器的許多連接。

責任編輯:趙寧寧 來源: 技術的游戲
相關推薦

2023-10-17 08:08:37

Dubbo服務注冊中心

2022-08-31 08:30:32

kubernetesMetalLB

2023-02-13 16:39:45

Kubernetes容器負載均衡器

2018-03-01 14:10:37

Kubernetes負載均衡容器

2021-04-21 14:56:28

負載均衡高并發優化技術架構

2010-05-10 14:48:01

流量負載均衡

2010-05-10 17:52:30

實現負載均衡

2010-05-10 14:00:21

流量負載均衡

2010-04-23 11:05:16

流量負載均衡

2022-07-14 08:53:48

MetalLBkubernetes

2013-12-13 09:55:44

VDI負載均衡

2010-05-06 12:18:34

IP負載均衡

2019-10-25 09:28:12

算法設計操作系統

2018-12-03 08:31:40

負載均衡解密Web 服務器

2018-12-03 13:50:03

流量網絡負載均衡

2024-10-30 10:54:36

2022-09-01 21:56:34

KubernetesLinkerd

2021-07-14 18:21:38

負載均衡K8SgRPC

2018-06-25 09:54:14

LinuxDNS負載均衡

2017-07-03 08:08:25

負載均衡分類
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美一区二区精品忘忧草 | 欧美精品成人一区二区三区四区 | 欧美一区二区三区在线 | 久久合久久 | 国产精品一区二区av | 国产精品一区二区三区免费观看 | 色婷婷av久久久久久久 | 日韩超碰 | 国产精品178页 | 91看片网| 国产免费一区 | 性做久久久久久免费观看欧美 | 成人一区二区三区在线观看 | 毛片大全 | 日韩久久久久 | 国产高清视频 | 无码一区二区三区视频 | 男人天堂久久 | 久久久久久久久久久一区二区 | 毛片网站在线观看 | 黄色大片免费网站 | 久久成人精品视频 | 国产精品一区久久久 | 亚洲视频免费在线看 | 亚洲精品区| 看a网站| 在线免费中文字幕 | 欧美一区成人 | 欧美一区2区三区4区公司二百 | 国产在线一区二区 | 黄色激情毛片 | 国产精品揄拍一区二区久久国内亚洲精 | cao在线| 黄色片免费 | 欧美一级三级在线观看 | 91精品久久久久久久久久 | 亚洲精品一区二区网址 | 免费观看一级特黄欧美大片 | 日韩国产欧美视频 | 日韩 欧美 综合 | 久久i |