今天就跟大家聊聊有關(guān)TKE基于彈性網(wǎng)卡直連Pod的網(wǎng)絡(luò)負(fù)載均衡是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)于2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目網(wǎng)站制作、成都網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元玉屏做網(wǎng)站,已為上家服務(wù),為玉屏各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
Kubernetes
在集群接入層設(shè)計并提供了兩種原生資源Service
和Ingress
,分別負(fù)責(zé)四層和七層的網(wǎng)絡(luò)接入層配置。
傳統(tǒng)的做法是創(chuàng)建Ingress或LoadBalancer類型的Service來綁定騰訊云的負(fù)載均衡將服務(wù)對外暴露。這種做法將用戶流量負(fù)載到用戶節(jié)點的NodePort上,通過KubeProxy組件轉(zhuǎn)發(fā)到容器網(wǎng)絡(luò)中,但這種方案在業(yè)務(wù)的性能和能力支持會有所局限。
為了解決這個問題,TKE容器團(tuán)隊為在騰訊云上使用獨立或托管集群的用戶提供了一種新的網(wǎng)絡(luò)模式,利用彈性網(wǎng)卡直連Pod的方案很大的增強(qiáng)了性能和業(yè)務(wù)能力的支持。
本文將會從傳統(tǒng)的模式的問題入手,比較新舊模式的區(qū)別,并在最后提供新直連模式的使用指引。
KubeProxy
在集群中會將用戶NodePort
的流量通過NAT的方式轉(zhuǎn)發(fā)到集群網(wǎng)絡(luò)中。這個NAT轉(zhuǎn)發(fā)帶來了以下一些問題。
NAT轉(zhuǎn)發(fā)導(dǎo)致請求在性能上有一定的損失。
進(jìn)行NAT操作本身會帶來性能上的損失。
NAT轉(zhuǎn)發(fā)的目的地址可能會使得流量在容器網(wǎng)絡(luò)內(nèi)跨節(jié)點轉(zhuǎn)發(fā)。
NAT轉(zhuǎn)發(fā)導(dǎo)致請求的來源IP被修改了,客戶端無法獲取來源IP。
當(dāng)負(fù)載均衡的流量集中到幾個NodePort時。過于集中的流量會導(dǎo)致NodePort的SNAT轉(zhuǎn)發(fā)過多,使得源端口耗盡流量異常。還可能導(dǎo)致 conntrack 插入沖突導(dǎo)致丟包,影響性能。
KubeProxy
的轉(zhuǎn)發(fā)具有隨機(jī)性,無法支持會話保持。
KubeProxy
的每個NodePort其實也起到獨立的負(fù)載均衡作用,由于負(fù)載均衡無法收斂到一個地方,所以難以達(dá)到全局的負(fù)載均衡。
為了解決以上問題,我們以前給用戶提供的技術(shù)建議主要是通過Local轉(zhuǎn)發(fā)的方式,避免KubeProxy
NAT轉(zhuǎn)發(fā)帶來的問題。但是因為轉(zhuǎn)發(fā)的隨機(jī)性,一個節(jié)點上部署多個副本時會話保持依舊無法支持。而且Local轉(zhuǎn)發(fā)在滾動更新時,容易出現(xiàn)服務(wù)的閃斷,對業(yè)務(wù)的滾動更新策略以及優(yōu)雅停機(jī)提出了更高的要求。我們有理由去尋找更好的方案解決這個問題。
通過NodePort接入服務(wù)時,NodePort的設(shè)計存在極大的容錯性。負(fù)載均衡會綁定集群所有節(jié)點的NodePort作為后端。集群任意一個節(jié)點的訪問服務(wù)時,流量將隨機(jī)分配到集群的工作負(fù)載中。這就意味著部分NodePort的不可用,或者是Pod的不可用都不會影響服務(wù)的流量接入。
和Local訪問一樣,直接將負(fù)載均衡后端連接到用戶Pod的情況下,當(dāng)業(yè)務(wù)在滾動更新時,如果負(fù)載均衡不能夠及時綁定上新的Pod,業(yè)務(wù)的快速滾動可能導(dǎo)致業(yè)務(wù)入口的負(fù)載均衡后端數(shù)量嚴(yán)重不足甚至被清空。因此,業(yè)務(wù)滾動更新的時候,接入層的負(fù)載均衡的狀態(tài)良好,方能保證滾動更新的安全平穩(wěn)。
負(fù)載均衡的控制面接口。包括創(chuàng)建刪除修改四層、七層監(jiān)聽器,創(chuàng)建刪除七層規(guī)則,綁定各個監(jiān)聽器或者規(guī)則的后端。這些接口大部分是異步接口,需要輪詢請求結(jié)果,接口的調(diào)用時間相對較長。當(dāng)用戶集群規(guī)模較大時,大量的接入層資源同步會導(dǎo)致組件存在很大的時延上的壓力。
Pod直連模式已經(jīng)在騰訊TKE上線,是對負(fù)載均衡的控制面優(yōu)化。針對整個同步流程,重點優(yōu)化了批量調(diào)用和后端實例查詢兩個遠(yuǎn)程調(diào)用比較頻繁的地方。**優(yōu)化完成后,Ingress典型場景下的控制面性能較優(yōu)化前版本有了95%-97%左右的性能提升。**目前同步的耗時主要集中在異步接口的等待上。
除去控制面性能優(yōu)化這樣的硬核優(yōu)化,負(fù)載均衡能夠直接訪問容器網(wǎng)絡(luò)的Pod就是組件業(yè)務(wù)能力最重要的組成部分了,其不僅避免了NAT轉(zhuǎn)發(fā)性能上的損失,同時避免了NAT轉(zhuǎn)發(fā)帶來的各種對集群內(nèi)業(yè)務(wù)功能影響。但是在啟動該項目時這一塊還沒有特別好的訪問容器網(wǎng)絡(luò)的支持。所以一期考慮集群CNI網(wǎng)絡(luò)模式下Pod有彈性網(wǎng)卡入口,這個入口可以直接接入到負(fù)載均衡以達(dá)到直接訪問的目的。負(fù)載均衡直接后端訪問到容器網(wǎng)絡(luò),目前已經(jīng)有通過云聯(lián)網(wǎng)解決的方案,后續(xù)也會繼續(xù)跟進(jìn)這種更貼近集群網(wǎng)絡(luò)的直連方案。
接下來能夠直接訪問了,如何保證滾動更新時的可用性保證呢?我們找到了官方提供的一個特性ReadinessGate
。這個特性在1.12正式提供出來,主要是用來控制Pod的狀態(tài)。默認(rèn)情況下,Pod有以下Condition:PodScheduled、Initialized、ContainersReady,當(dāng)這幾個狀態(tài)都Ready的時候,Pod Ready的Condition就通過了。但是在云原生的場景下面,Pod的狀態(tài)是非常有可能需要參考其他狀態(tài)的。ReadinessGate
提供了這樣一個機(jī)制,允許為Pod的狀態(tài)判斷添加一個柵欄,由第三方來進(jìn)行判斷與控制。這樣Pod的狀態(tài)就和第三方關(guān)聯(lián)起來了。
請求流量進(jìn)入負(fù)載均衡
請求被負(fù)載均衡轉(zhuǎn)發(fā)到某一個節(jié)點的NodePort
KubeProxy將來自NodePort的流量進(jìn)行NAT轉(zhuǎn)發(fā),目的地址是隨機(jī)的一個Pod。
請求進(jìn)入容器網(wǎng)絡(luò),并根據(jù)Pod地址轉(zhuǎn)發(fā)到對應(yīng)節(jié)點。
請求來到Pod所屬節(jié)點,轉(zhuǎn)發(fā)到Pod。
請求流量進(jìn)入負(fù)載均衡
請求被負(fù)載均衡轉(zhuǎn)發(fā)到某一個Pod的ENI彈性網(wǎng)卡
看起來這兩種訪問方式的效果是一樣的,但是在細(xì)節(jié)上還是存在一些差別。
從性能上區(qū)別不大,開啟Local訪問時,流量不會進(jìn)行NAT操作也不會進(jìn)行跨節(jié)點轉(zhuǎn)發(fā),所以僅僅多了一個到容器網(wǎng)絡(luò)的路由。
沒有進(jìn)行NAT操作,來源IP就能夠正確獲取了。會話保持功能可能會有以下問題,當(dāng)一個節(jié)點上存在多個Pod時,流量到哪一個Pod是隨機(jī)的,這個機(jī)制可能會使話保持出現(xiàn)問題。
前面有兩個細(xì)節(jié),可以在這里得到解答。
為什么要求集群版本高于 1.12
為什么kubectl get pod -o wide
的結(jié)果中READINESS GATES
列有內(nèi)容。
這里涉及到一個滾動更新相關(guān)的問題當(dāng)用戶開始為應(yīng)用做滾動更新的時候,Kubernetes
會根據(jù)更新策略進(jìn)行滾動更新。但是其判斷一批Pod啟動的標(biāo)識僅包括Pod自身的狀態(tài),并不會考慮這個Pod在負(fù)載均衡上是否已經(jīng)進(jìn)行配置健康檢查是否通過。有的時候當(dāng)接入層組件高負(fù)載,不能及時對這些Pod進(jìn)行及時調(diào)度的話,這些滾動更新成功的Pod可能并沒有正在對外提供服務(wù),從而導(dǎo)致服務(wù)的中斷。為了將滾動更新和負(fù)載均衡的后端狀態(tài)關(guān)聯(lián)起來,TKE接入層組件引入了Kubernetes 1.12中引入的新特性ReadinessGate
。TKE接入層組件只有在確認(rèn)后端綁定成功并且健康檢查通過時,通過配置ReadinessGate
的狀態(tài)來使Pod達(dá)到Ready的狀態(tài),從而推動整個工作負(fù)載的滾動更新。
在集群中使用ReadinessGate
的細(xì)節(jié)Kubernetes集群提供的是一個服務(wù)注冊的機(jī)制,你只需要將你的服務(wù)以MutatingWebhookConfigurations
資源的形式注冊到集群中就可以了。集群會在Pod創(chuàng)建的時候按照你的配置的回調(diào)路徑通知你,這個時候就可以對Pod做一些創(chuàng)建前的操作,在這個Case里面就是給Pod加上ReadinessGate
。唯一需要注意的就是這個回調(diào)過程必須是Https的,所以標(biāo)配需要在MutatingWebhookConfigurations
中配置簽發(fā)請求的CA,并在服務(wù)端配置該CA簽發(fā)的證書。
ReadinessGate
機(jī)制的災(zāi)難恢復(fù)用戶集群中的服務(wù)注冊或是證書有可能被用戶刪除,雖然這些系統(tǒng)組件資源不應(yīng)該被用戶修改或破壞。但在用戶對集群的探索或是誤操作下,這類問題會不可避免的出現(xiàn)。所以接入層組件在啟動時會檢查以上資源的完整性,在完整性受到破壞時會重建以上資源,加強(qiáng)系統(tǒng)的魯棒性。
直連與NodePort是服務(wù)應(yīng)用的接入層方案,其實最終參與工作的還是用戶部署的工作負(fù)載,用戶工作負(fù)載的能力直接決定了業(yè)務(wù)的QPS等指標(biāo)。所以我們針對這兩種接入層方案,在工作負(fù)載壓力較低的情況下,重點針對網(wǎng)絡(luò)鏈路的時延進(jìn)行了一些對比測試。直連在接入層的網(wǎng)絡(luò)鏈路上能夠優(yōu)化10%左右的時間。同時測試中的監(jiān)控也發(fā)現(xiàn),直連模式減少了大量VPC網(wǎng)絡(luò)內(nèi)的流量。測試場景,從20節(jié)點到80節(jié)點,逐步增大集群規(guī)模,通過wrk工具對集群進(jìn)行網(wǎng)絡(luò)延時的測試。針對QPS和網(wǎng)絡(luò)時延,下圖給出了直連場景與NodePort的對比測試。
KubeProxy
的缺點也在前文中提到的一樣明顯。但是基于云上負(fù)載均衡、VPC網(wǎng)絡(luò)的各種特性,我們能給出各種其他更加本地化的接入層方案。但這并不意味著KubeProxy
的設(shè)計不好或是作用不大。其對集群接入層的設(shè)計極具普適性、容錯性,基本適用于所有業(yè)務(wù)場景下的集群,作為一個官方提供的組件這個設(shè)計是非常合適的。
Kubernetes
集群版本需要高于 1.12。
集群網(wǎng)絡(luò)模式必須開啟VPC-CNI
彈性網(wǎng)卡模式。
直連模式Service
使用的工作負(fù)載需使用VPC-CNI
彈性網(wǎng)卡模式。
登錄 容器服務(wù)控制臺。
參考控制臺 創(chuàng)建 Service 步驟,進(jìn)入 “新建Service” 頁面,根據(jù)實際需求設(shè)置 Service 參數(shù)。
其中,部分關(guān)鍵參數(shù)信息需進(jìn)行如下設(shè)置,如下圖所示:
服務(wù)訪問方式:選擇為【提供公網(wǎng)訪問】或【VPC內(nèi)網(wǎng)訪問】。
網(wǎng)絡(luò)模式:勾選【采用負(fù)載均衡直連Pod模式】。
Workload綁定:選擇【引用Worklocad】,并在彈出窗口中選擇 VPC-CNI 模式的后端工作負(fù)載。
單擊【創(chuàng)建服務(wù)】,完成創(chuàng)建。
Workload示例:nginx-deployment-eni.yaml
注意
spec.template.metadata.annotations
中聲明了tke.cloud.tencent.com/networks: tke-route-eni
,在工作負(fù)載使用VPC-CNI彈性網(wǎng)卡模式。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment-eni spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: annotations: tke.cloud.tencent.com/networks: tke-route-eni labels: app: nginx spec: containers: - image: nginx:1.7.9 name: nginx ports: - containerPort: 80 protocol: TCP
- Service示例:nginx-service-eni.yaml > 注意:`metadata.annotations`中聲明了`service.cloud.tencent.com/direct-access: "true"`,Service在同步負(fù)載均衡時將采用直連的方式配置訪問后端。 ```yaml apiVersion: v1 kind: Service metadata: annotations: service.cloud.tencent.com/direct-access: "true" labels: app: nginx name: nginx-service-eni spec: externalTrafficPolicy: Cluster ports: - name: 80-80-no port: 80 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None type: LoadBalancer ``` - 部署以上內(nèi)容到集群 > 注意:在你的環(huán)境你首先需要連接到集群(沒有集群的需要先創(chuàng)建集群),可以參考文章尾部的幫助文檔配置kubectl連接集群。 ```shell ? ~ kubectl apply -f nginx-deployment-eni.yaml deployment.apps/nginx-deployment-eni created ? ~ kubectl apply -f nginx-service-eni.yaml service/nginx-service-eni configured ? ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-eni-bb7544db8-6ljkm 1/1 Running 0 24s 172.17.160.191 172.17.0.3 <none> 1/1 nginx-deployment-eni-bb7544db8-xqqtv 1/1 Running 0 24s 172.17.160.190 172.17.0.46 <none> 1/1 nginx-deployment-eni-bb7544db8-zk2cx 1/1 Running 0 24s 172.17.160.189 172.17.0.9 <none> 1/1 ? ~ kubectl get service -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes ClusterIP 10.187.252.1 <none> 443/TCP 6d4h <none> nginx-service-eni LoadBalancer 10.187.254.62 150.158.221.31 80:32693/TCP 6d1h app=nginx ```
看完上述內(nèi)容,你們對TKE基于彈性網(wǎng)卡直連Pod的網(wǎng)絡(luò)負(fù)載均衡是怎樣的有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
名稱欄目:TKE基于彈性網(wǎng)卡直連Pod的網(wǎng)絡(luò)負(fù)載均衡是怎樣的
文章出自:http://sd-ha.com/article22/ihhjcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、微信小程序、品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)