日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
在Kubernetes中實(shí)現(xiàn)gRPC流量負(fù)載均衡

在Kubernetes中實(shí)現(xiàn)gRPC流量負(fù)載均衡

作者:Slagga 2023-10-27 12:36:37

云計(jì)算

云原生

后端 在嘗試將gRPC服務(wù)部署到Kubernetes集群中時(shí),一些用戶(hù)(包括我)面臨的挑戰(zhàn)之一是實(shí)現(xiàn)適當(dāng)?shù)呢?fù)載均衡。

萬(wàn)安網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,萬(wàn)安網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為萬(wàn)安上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的萬(wàn)安做網(wǎng)站的公司定做!

在嘗試將gRPC服務(wù)部署到Kubernetes集群中時(shí),一些用戶(hù)(包括我)面臨的挑戰(zhàn)之一是實(shí)現(xiàn)適當(dāng)?shù)呢?fù)載均衡。在深入了解如何平衡gRPC的方式之前,我們首先需要回答一個(gè)問(wèn)題,即為什么需要平衡流量,如果Kubernetes已經(jīng)完成了這項(xiàng)工作。

本文關(guān)注于Kubernetes和Golang。

為什么在Kubernetes中無(wú)法適當(dāng)?shù)仄胶鈍RPC流量?

之所以難以平衡gRPC流量的主要原因是人們將gRPC視為HTTP,這就是問(wèn)題的根源。設(shè)計(jì)上它們是不同的,雖然HTTP為每個(gè)請(qǐng)求創(chuàng)建和關(guān)閉連接,但gRPC使用HTTP2協(xié)議,在長(zhǎng)時(shí)間的TCP連接上運(yùn)行,使得平衡更加困難,因?yàn)槎鄠€(gè)請(qǐng)求通過(guò)同一個(gè)連接進(jìn)行多路復(fù)用。然而,這并不是配置gRPC服務(wù)在Kubernetes中出現(xiàn)平衡問(wèn)題的唯一原因,以下是一些常見(jiàn)的錯(cuò)誤配置:

  • 錯(cuò)誤的gRPC客戶(hù)端配置
  • 錯(cuò)誤的Kubernetes服務(wù)配置

錯(cuò)誤的gRPC客戶(hù)端配置

設(shè)置gRPC客戶(hù)端時(shí)常見(jiàn)的情況是選擇默認(rèn)配置,這對(duì)于1-1連接類(lèi)型完全有效,但對(duì)于生產(chǎn)環(huán)境來(lái)說(shuō)并不如我們所希望的有效。這背后的原因是因?yàn)槟J(rèn)的gRPC客戶(hù)端提供了使用簡(jiǎn)單的IP/DNS記錄連接的可能性,這只會(huì)創(chuàng)建一個(gè)與目標(biāo)服務(wù)的連接。

因此,需要為與多個(gè)服務(wù)器建立連接進(jìn)行不同的設(shè)置,將連接類(lèi)型從1-1轉(zhuǎn)換為1-N。

默認(rèn)設(shè)置:

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(), ...)
  .
  .
  .
}

新的設(shè)置:

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(), ...)
  .
  .
  .
}

這里有兩個(gè)重要的更改需要注意:

  • 地址: 最終解析的地址將類(lèi)似于 dns:///my-domain:50051,之所以使用這種格式是因?yàn)镈ial函數(shù)允許我們使用由Scheme://Authority/Endpoint組成的目標(biāo),而在我們的情況下,我跳過(guò)了Authority。因此,首先我添加了dns作為方案,因?yàn)槲蚁M馕鲆粋€(gè)域并持續(xù)觀察其更改,解析器選項(xiàng)有透?jìng)鳎J(rèn))、dns和手動(dòng),更多詳情請(qǐng)參閱這里。
  • 負(fù)載均衡器選項(xiàng): 如果我們的客戶(hù)端現(xiàn)在連接到多個(gè)服務(wù)器,那么我們的gRPC客戶(hù)端可以根據(jù)所選擇的負(fù)載均衡算法平衡請(qǐng)求。

總結(jié)一下,我們的gRPC客戶(hù)端現(xiàn)在能夠創(chuàng)建不同的連接,前提是域名解析為多個(gè)A或AAAA記錄,而且不僅如此,現(xiàn)在還能夠?qū)⒄?qǐng)求均勻地分配到不同的服務(wù)器。

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

錯(cuò)誤的Kubernetes服務(wù)配置

在Kubernetes中創(chuàng)建服務(wù)非常簡(jiǎn)單,我們只需要定義服務(wù)名稱(chēng)、端口和選擇器,以便服務(wù)可以動(dòng)態(tài)地將Pod分組并自動(dòng)平衡請(qǐng)求,如下所示:

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

那么,對(duì)于先前的設(shè)置,問(wèn)題在于默認(rèn)的Kubernetes服務(wù)只創(chuàng)建了一個(gè)DNS記錄,鏈接到單個(gè)IP。因此,當(dāng)您執(zhí)行類(lèi)似 nslookup my-service.{namespace}.svc.cluster.local 的操作時(shí),返回的是一個(gè)單個(gè)IP,這使得在常見(jiàn)的gRPC實(shí)現(xiàn)中連接圖看起來(lái)像這樣:

例如,使用默認(rèn)的Kubernetes服務(wù)的連接圖:

綠線表示與客戶(hù)端的活動(dòng)連接,黃色表示未活動(dòng)的Pod??蛻?hù)端與Kubernetes服務(wù)創(chuàng)建了持久連接,同時(shí)服務(wù)也與其中一個(gè)Pod創(chuàng)建了連接,但這并不意味著服務(wù)與其余的Pod沒(méi)有連接。

讓我們使用一個(gè)無(wú)頭服務(wù)來(lái)解決這個(gè)問(wèn)題:

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

創(chuàng)建了無(wú)頭服務(wù)后,nslookup看起來(lái)有些不同,現(xiàn)在它返回與之關(guān)聯(lián)的記錄(將Pod的IP分組到服務(wù)中),從而使gRPC客戶(hù)端更好地了解需要連接的服務(wù)器數(shù)量。

現(xiàn)在您已經(jīng)看到了gRPC客戶(hù)端的配置,您必須知道為什么Kubernetes服務(wù)返回與一組Pod關(guān)聯(lián)的IP非常重要。原因是客戶(hù)端可以看到所有需要建立連接的服務(wù)器。在這一點(diǎn)上,您可能已經(jīng)意識(shí)到了一個(gè)注意事項(xiàng),即平衡的責(zé)任現(xiàn)在在客戶(hù)端部分,而不在Kubernetes的一側(cè)。我們現(xiàn)在需要從Kubernetes那里得到的主要任務(wù)是保持與服務(wù)關(guān)聯(lián)的Pod列表的最新?tīng)顟B(tài)。

例如,在具有無(wú)頭Kubernetes服務(wù)的連接圖中,可以看到連接發(fā)生了一些變化,現(xiàn)在我們不通過(guò)Kubernetes服務(wù)來(lái)訪問(wèn)Pod,而是使用Kubernetes服務(wù)來(lái)檢索與域名關(guān)聯(lián)的Pod列表,然后直接與Pod建立連接。但是不要因?yàn)橹苯舆B接到Pod而感到驚慌,因?yàn)槲覀冊(cè)诳蛻?hù)端中設(shè)置了DNS解析器類(lèi)型,該解析器將持續(xù)監(jiān)視與無(wú)頭服務(wù)的更改,并將與可用的Pod保持最新的連接。

為什么不使用服務(wù)網(wǎng)格?

如果可以的話,請(qǐng)使用服務(wù)網(wǎng)格,因?yàn)樵诜?wù)網(wǎng)格中,所有這些設(shè)置都是透明的,而且最重要的是它是與編程語(yǔ)言無(wú)關(guān)的。關(guān)鍵區(qū)別在于服務(wù)網(wǎng)格利用了Sidecar模式和控制平面來(lái)編排入站和出站流量,還可以看到所有網(wǎng)絡(luò)和流量類(lèi)型(HTTP、TCP等),從而能夠正確平衡請(qǐng)求。簡(jiǎn)而言之,如果您不使用服務(wù)網(wǎng)格,那么您需要直接從每個(gè)客戶(hù)端連接到多個(gè)服務(wù)器,或者連接到一個(gè)L7代理來(lái)幫助平衡請(qǐng)求。

附加信息

盡管先前的設(shè)置可以工作,但我在嘗試在alpine Linux映像中進(jìn)行Pod輪換或擴(kuò)展時(shí)重新平衡連接時(shí)遇到了問(wèn)題。經(jīng)過(guò)一些研究,我意識(shí)到我并不是唯一遇到這種問(wèn)題的人,可以查看這里和這里的一些相關(guān)的GitHub問(wèn)題。這就是為什么我決定創(chuàng)建自己的解析器的原因,您可以在這里查看我創(chuàng)建的自定義解析器,我創(chuàng)建的自定義解析器非?;A(chǔ),但現(xiàn)在可以正常工作,gRPC客戶(hù)端現(xiàn)在可以再次監(jiān)聽(tīng)域名的更改,我還為該庫(kù)添加了一個(gè)可配置的監(jiān)聽(tīng)器,它每隔一段時(shí)間查找域名并更新提供給gRPC連接管理器的IP集合,如果您想貢獻(xiàn),歡迎加入。

另一方面,因?yàn)槲蚁肷钊肓私?,所以我決定創(chuàng)建自己的gRPC代理(我也學(xué)到了很多東西),利用了gRPC的http2基礎(chǔ),我可以創(chuàng)建一個(gè)代理,而無(wú)需更改proto負(fù)載消息或甚至不知道proto文件的定義(還使用了前面提到的自定義解析器)。

最后,我想說(shuō)的是,如果您的gRPC客戶(hù)端需要與許多服務(wù)器連接,我強(qiáng)烈建議使用代理作為平衡的機(jī)制,因?yàn)閷⑦@個(gè)機(jī)制放在主應(yīng)用程序中將增加復(fù)雜性和資源消耗,嘗試保持許多打開(kāi)的連接并重新平衡它們,想象一下,如果最終的平衡在應(yīng)用程序中,您將有一個(gè)與N個(gè)服務(wù)器連接的實(shí)例(1-N),但是使用代理,您將有一個(gè)與M個(gè)代理連接到N個(gè)服務(wù)器的實(shí)例(1-M-N),其中M
網(wǎng)站標(biāo)題:在Kubernetes中實(shí)現(xiàn)gRPC流量負(fù)載均衡
網(wǎng)站鏈接:http://www.5511xx.com/article/cococcp.html