華為云云原生鉆石集訓營 第十三課:Istio數(shù)據(jù)面架構(gòu)(Envoy)深度解析

      網(wǎng)友投稿 1108 2022-05-29

      課程目標:

      學完本課程后,您將能夠:

      1.了解Envoy的基本概念

      2.了解Envoy的原理總體架構(gòu)

      3.了解Envoy的基本線程模型

      4.了解Envoy的過濾器架構(gòu)

      目錄

      1.服務網(wǎng)格數(shù)據(jù)面Envoy介紹

      2. Envoy原理及總體架構(gòu)

      3. Envoy啟動配置及xDS

      4. Envoy網(wǎng)絡及線程模型、過濾器架構(gòu)、HTTP請求流程

      5. Envoy問題分析方法

      前言:

      微服務架構(gòu)最早由Fred George在2012年的一次技術(shù)大會上所提出,他講到如何通過拆分SOA服務實現(xiàn)服務之間的解耦,這是微服務最早的雛形。

      微服務架構(gòu)通過細粒度的服務解耦拆分,帶來縮短開發(fā)周期、獨立部署、易擴展等好處的同時,同時帶來對服務發(fā)現(xiàn)、負載均衡、熔斷等能力前所未有的訴求。

      第一階段為dubbo、SpringCloud侵入式開發(fā)框架,語言強相關(guān)。非侵入服務網(wǎng)格最早為2016年Linkerd。

      2017年,Google、IBM、Lyft發(fā)布lstio。Istio目前為服務網(wǎng)格的事實標準,并且是2019年Github增長最快的TOP10開源項目之一。目前最新為1.10版本。

      Envoy介紹

      Envoy采用C++實現(xiàn),本身為四層及七層代理,可以根據(jù)用戶應用請求內(nèi)的數(shù)據(jù)進行高級服務治理能力,包括服務發(fā)現(xiàn)、路由、高級負載均衡、動態(tài)配置、鏈路安全及證書更新、目標健康檢查、完整的可觀測性等。

      ·目前常見數(shù)據(jù)面主要有三種: Envoy、Linkerd、Traefic。Envoy由于高性能和擴展能力前在數(shù)據(jù)面遙遙領(lǐng)先。

      . lptables使Pod間出入應用的流量均由Envoy代理,對應用來說完全透明。支持主要常用網(wǎng)路協(xié)議Http1/Http2/Tls/gRPC/Tcp等。

      Envoy原理及總體架構(gòu)-說明

      華為云云原生鉆石集訓營 第十三課:Istio數(shù)據(jù)面架構(gòu)(Envoy)深度解析

      . 1.啟動階段

      ·istiodopod創(chuàng)建請惑.資烈的指家nmepsace則根據(jù)configmap配置生成帶有Envoy兩個容器的創(chuàng)建POD請求,修改過的創(chuàng)建過的創(chuàng)建請求被kubelet接收,并在節(jié)點創(chuàng)建POD.

      istio-init容器添加用于配置容器網(wǎng)絡內(nèi)iptables規(guī)則

      . istio-proxy容器啟動pilot-agent進程,使用UID=1337GID=1337創(chuàng)建Envoy啟動命令行與配置文件

      ·可以通過自定義deployment內(nèi)istio注解sidecar.istio.io/inject. “false”跳過自動注入過程,或修改部分啟動參數(shù)。

      ·proxy.istio.io/config:"{concurrency: 6}]”#修改工作線程數(shù),默認2

      . sidecar.istio.io/proxylmage: “istio/proxyv2new.1.9.0“#修改默認注入鏡像

      2.控制面通信

      Pilot-agent進程本身創(chuàng)建UDS接收Envoy連接,用于證書更新下發(fā)。并且與istiod建立證書更新通道。

      Envoy 通過pilot-agent轉(zhuǎn)發(fā)機制與istiod建立長連接,通過xDS協(xié)議接收系統(tǒng)下發(fā)的-、路由、集群節(jié)點等更新信息。

      3.數(shù)據(jù)面通信

      ·客戶端請求進入容器網(wǎng)絡,并被iptables規(guī)則攔截,經(jīng)過DNAT后進入Envoy virtualOutbound-. virtualOutbound經(jīng)過監(jiān)聽過濾器恢復用于原始目標服務,并找到后端處理器處理新連接。

      后端處理器在配置中指定處理協(xié)議,根據(jù)協(xié)議相關(guān)的網(wǎng)絡過濾器處理讀取到的數(shù)據(jù)。

      ·如果為http協(xié)議,再經(jīng)過請求過濾器處理http協(xié)議頭部,如路由選擇等功能并創(chuàng)建上游連接池

      ·將修改及編碼后的http消息通過網(wǎng)絡發(fā)送到對端Envoy的容器網(wǎng)絡。

      . lptables識別為入流量則進入virtuallnbound端口。

      ·類似恢復原始目標后,根據(jù)virtuallnbound配置的監(jiān)聽過濾器找到對應的本地服務器地址。并發(fā)起localhost的請求。

      ·請求進入本地服務器內(nèi)進行處理并返回響應。

      Envoy啟動配置及xDS-cont'(實操)

      ·分為static_resources及dynamic_resources兩種配置,

      ·兩種方式查看Envoy配置

      . pilot-agent:訪問Envoy 15000端口,指定url獲取:

      .kubectl exec -it $podname -c istio-proxy -- pilot-agent request

      ·istioctl:需要根據(jù)Istio不同版本下載: https:/github.com/istio/istio/releases/download/1.9.5/istioctl-1.9.5-linux-amd64.tar.gz

      . istioctl pc listener $podname#輸出LDS

      . istioctl pc route $podname #輸出RDS

      . istioctl pc cluster $podname #輸出CDS

      . istioctl pc endpoint $podname #輸出EDS

      . istioctl pc secret $podname #輸出SDS

      網(wǎng)格內(nèi)部調(diào)用,通過自動注入到網(wǎng)格內(nèi)的iptables規(guī)則進行攔截

      默認為2個工作線程

      默認最大上游連接數(shù)1024,最大掛起等待請求數(shù)1024

      外部請求通過直接訪問ingressgateway網(wǎng)關(guān)端口進入網(wǎng)格

      ingressgateway為envoy相同二進制,不做iptables規(guī)則注入,作為外網(wǎng)客戶端網(wǎng)格內(nèi)代理。

      ingressgateway不設置工作線程數(shù)限制,并且最天上游連接及最大掛起等待請求數(shù)請求數(shù)默認值不做限制。

      分為Envoy主線程及worker線程:

      主線程:

      ·負責初始化Envoy并讀取解析配置文件

      ·啟動gRPC-,并啟動xDS變化監(jiān)聽

      ·啟動日志寫入線程,每個目標日志文件有獨立線程負責輸出

      ·啟動admin RESTful監(jiān)聽,處理運行狀態(tài)輸出,prometheus收集等請求

      ·定期將工作線程內(nèi)監(jiān)控數(shù)據(jù)stat進行合并

      ·定期刷新DNS信息,加速域名解析。

      .目標cluster內(nèi)主機列表健康狀態(tài)判斷。

      worker線程:

      ·通過啟動配置參數(shù)concurrency指定,不支持動態(tài)調(diào)整。

      啟動virtualoutbound/virtualinbond網(wǎng)縫監(jiān)聽,每個工作線程都對此監(jiān)聽端口進行監(jiān)聽。由內(nèi)核隨機挑選監(jiān)聽線程處理新連接。

      ·進行連接負載均衡處理后,選擇最終的業(yè)務-處理新連接。

      之后對于此連接的所有處理都在此線程進行,包括下游數(shù)據(jù)集解碼,路由選擇、上游數(shù)據(jù)編碼發(fā)送等。

      同時此工作線程還要處理定期觀測信息與主線程同步(通過異步加回調(diào))、線程內(nèi)配置及集群管理器狀態(tài)更新等工作。

      請求完成后延遲釋放內(nèi)存,解決本次事件處理中回調(diào)所引用對象可以被安全訪問,并在下次事件處理中安全刪除。

      Envoy網(wǎng)絡及線程模型-共享數(shù)據(jù)同步

      1.調(diào)度器通過epoll監(jiān)控文件事件(網(wǎng)絡)及定時器事件進行排隊任務處理.

      2.線程間通信通過post接口發(fā)送任務,此任務通過定時器事件激活。

      3.線程間數(shù)據(jù)交換通過post更新TLS,這樣每個線程內(nèi)代碼都不需要加鎖處理。

      4.每個線程的TLS對象本身只保存真實對象的共享指針進行讀操作,減少內(nèi)存消耗。

      5.全局對象更新只發(fā)生在主線程,并通過COW方式通知工作線程進行指針修改

      每個TLS slot通過allocateSlot分配,在使用前通過set在每個線程中創(chuàng)建一個拷貝并保存。

      在主線程中調(diào)用此slot的runOnAllThreads在所有線程中延遲執(zhí)行回調(diào),回調(diào)內(nèi)更新每個線程內(nèi)拷貝對象狀態(tài)

      Envoy網(wǎng)絡及線程模型-集群信息更新

      .1.Envoy需要在運行中支持添加集群并監(jiān)控每個集群內(nèi)目標主機列表變化.

      2.監(jiān)控到目標主機健康狀態(tài)變化時,需要通知到工作線程內(nèi)主機可用狀態(tài)。

      3.當收到節(jié)點變化EDS消息時,需要通知到工作線程內(nèi)新上線、下線主機。·

      4.Envoy使用前面提到的TLS方式實現(xiàn)集群狀態(tài)更新,集群管理器保存TLS slot,類型為ThreadLocalClusterManagerlmpl。

      當節(jié)點變化、DNS解析更新、健康狀態(tài)變化時,將調(diào)用集群管理器的postThreadLocalClusterUpdate方法

      5.此方法將延遲調(diào)用所有線程內(nèi)ThreadLocalClusterManagerlmpl slot的回調(diào)函數(shù)。

      6.此函數(shù)內(nèi)將保存新clusterEntry對象的引用。

      7.下一輪請求解析時將從頭TLS中獲取到更新后的集群可用狀態(tài)。

      Envoy網(wǎng)絡及線程模型-網(wǎng)絡處理

      Envoy啟動時創(chuàng)建的Listener與工作線程綁定并啟動監(jiān)聽(向libevent注冊Read回調(diào)onSocketEvent),并進入阻塞運行狀態(tài),直到進程退出。

      當新連接到達時,內(nèi)核網(wǎng)絡協(xié)議棧調(diào)用回調(diào)并創(chuàng)建新連接的Socket。

      通過ConnectionHandler調(diào)用監(jiān)聽過濾器獲得真實訪問目標地址

      根據(jù)目標地址匹配得到業(yè)務-后創(chuàng)建Connection連接對象

      之后Connection對象再次向libevent注冊Read/Write回調(diào)onFileEvent,并作為L4層過濾管理器處理

      onNewConnection, onData數(shù)據(jù)接收。

      對于HTTP協(xié)議,將繼續(xù)經(jīng)過L7層編解碼處理后向上游發(fā)送請求。

      當請求處理完畢后,將調(diào)用deferredDelete刪除請求對象并記錄統(tǒng)計觀測數(shù)據(jù)。

      使用異步I/O方式發(fā)送網(wǎng)絡數(shù)據(jù),降低對線程內(nèi)其他操作的阻塞。

      根據(jù)位置及作用類型,分為:

      ·監(jiān)聽過濾器(Network:.ListenerFilter)

      .onAccept接收新連接,判斷協(xié)議類型,TLS握手,HTTP協(xié)議自動識別、提取連接地址信息

      . L4網(wǎng)絡過濾器

      .HTTP、Mysql、Dubbo協(xié)議處理、元數(shù)據(jù)交換,四層限流,開發(fā)調(diào)試支持等。

      onNewConnection新連接建立,可以決定是否拒絕

      onData處理連接數(shù)據(jù)到達

      .onWrite處理連接數(shù)據(jù)發(fā)送

      .L7 HTTP過濾器

      修改HTTP請求頭,限流處理,Lua擴展、WASM擴展、開發(fā)調(diào)試支持、壓縮、元數(shù)據(jù)交換、路由等。

      decodeHeaders處理HTTP請求頭部

      decodeData處理HTP請求數(shù)據(jù)

      decodeTrailers處理HTTP請求結(jié)束位置

      encodeHeaders發(fā)送請求前編碼頭部

      encodeData發(fā)送請求前編碼數(shù)據(jù).、

      encodeTrailers消息發(fā)送前編碼處理

      APP發(fā)出的請求被iptables攔截,并根據(jù)源信息判斷為outbound被DNAT后攔截進入Envoy 15001端口

      15001上-通過ORIGINAL_ DST獲取原始目標地址(服務的clusterlp),匹配業(yè)務-〈不真正監(jiān)聽網(wǎng)絡)地址并傳遞新建下游連接。下游連接過濾器判斷TLS,ALPN(業(yè)務協(xié)議名稱),HTTP版本后匹配到L4層http_connection_manager網(wǎng)絡過濾器。

      http_connection_manager使用http codec解碼http協(xié)議header/body/tailer等并觸發(fā)回調(diào)函數(shù)。

      http header/body處理回調(diào)中將調(diào)用L7層HTTP過濾器處理(可修改http原始請求等)最后調(diào)用Router過濾器。Router過濾器負責根據(jù)配置中路由部分及請求內(nèi)url等進行匹配并找到目標cluster。

      根據(jù)cluster的負載均衡策略及當前可用POD實例信息,選擇最適合的目標POD地址,并創(chuàng)建此目標地址的連接池。根據(jù)連接池配置的最大可用連接數(shù)及允許的最大等待連接數(shù)等信息將下游請求與上游連接進行關(guān)聯(lián)。

      當連接準備好后對下游請求使用codec進行HTTP編碼,并發(fā)送到上游連接的L4層網(wǎng)絡過濾器。

      上游連接的L4層網(wǎng)絡過濾器使用metadata exchange傳輸本Envoy內(nèi)保存的與調(diào)用APP相關(guān)的元數(shù)據(jù)信息,包括POD名稱、用戶空間、cluster d等信息。之啟將待發(fā)送請求通過Socket度送到網(wǎng)絡,經(jīng)過iptables時判斷發(fā)送者為Envoy則不再攔截。

      目標POD收到從網(wǎng)絡進入的流量,通過iptables攔截后判斷為inbound并DNAT處理后,進入Envoy的15006端口。

      由于inbound方向流量的目標地址一定為本POD地址,無需再提取后轉(zhuǎn)到不同業(yè)務-,因此virtualinbound負責TLS、ALPN及HTP協(xié)議版本判斷。L4層網(wǎng)絡過濾器metadata exchance首先解析請求中包含的源POD元數(shù)據(jù)信息,并同時發(fā)送回本Envoy代理POD的元數(shù)據(jù)信息。之后進入L4層http_connection_manager網(wǎng)絡過濾器。

      L7層處理流程同outbound方向,區(qū)別為inbound通過Router匹配后的目標cluster所指向的上游地址為127.0.0.1。之后創(chuàng)建與本POD內(nèi)業(yè)務容器的服務端口的Socket連接并完成請求發(fā)送。

      由于請求方向在建立時會保存下游與上游連接的雙向?qū)P(guān)系,因此Response匹配的對上游進行L7層過濾器解碼、通過Router關(guān)聯(lián)關(guān)系找到下游并編碼發(fā)送HTTP請求(POD1處理類似)。

      以上所提到的Envoy L4層網(wǎng)絡讀取及數(shù)據(jù)發(fā)送為全異步讀寫模式,采用網(wǎng)絡事件觸發(fā)機制完成響應數(shù)據(jù)的接收和發(fā)送。

      由于Router部分請求處理方向需要進行更多路由選擇計算及負載均衡計算工作,因此通常outbound方向處理較復雜,CPU消耗比inbound更高。

      lstio數(shù)據(jù)面發(fā)展趨勢

      ·現(xiàn)狀問題:

      引入Sidecar模式,導致端到端時延增加、并隨著集群規(guī)模增加導致系統(tǒng)資源消耗上升,對大規(guī)模lstio集群的實際使用造成影響。

      ·運維難度增加,透明代理模式無法針對不同業(yè)務本身的特點定制監(jiān)控能力,同時只能從業(yè)務容器外面收集應用的運行狀態(tài)。

      ·演進方式:

      ·從Envoy自身V/O及線程模型、容器網(wǎng)絡協(xié)議棧優(yōu)化提升端到端性能,降低tp90網(wǎng)絡時延。

      ·通過運行時拉取集群依賴服務及POD實例配置信息,同時考慮配置信息共享的方式,降低每Envoy資源消耗。

      ·增加更多運維監(jiān)控維度及探測點,收集更全面的觀測信息。同時支持對出現(xiàn)問題的Envoy進行旁路處理。

      本課總結(jié):

      Envoy:基于C++11,14的高性能服務網(wǎng)格數(shù)據(jù)面代理

      xDS:Envoy與上層控制面如istiod使用的基于gRPC的應用層協(xié)議,用于傳輸配置變更。

      自動注入及流量攔截:POD創(chuàng)建時,由istiod進行自動修改deployment并將istio-init, istio-proxy容器注入到新創(chuàng)建POD內(nèi);當發(fā)生調(diào)用時,iptables規(guī)則將自動攔截出入流量進入Envoy代理。

      線程模型:Envoy采用每個工作線程獨立處理網(wǎng)絡及定時器事件,線程間無數(shù)據(jù)共享,提升性能。

      過濾器架構(gòu):Envoy采用可擴展插件架構(gòu)實現(xiàn)監(jiān)聽過濾器、L4網(wǎng)絡過濾器、L7HTTP過濾器;同時支持基于L4/L7 WASM及L7 Lua過濾器的二次擴展。

      參考鏈接:

      相關(guān)內(nèi)容的華為云官網(wǎng)鏈接: https://support.huaweicloud.com/usermanual-cce/cce_01_0006.html

      詳細ASM官網(wǎng)資料: https://support.huaweicloud.com/istio/

      lstio官方文檔: https://istio.io/latest/docs/

      envoy官方文檔: https://www.envoyproxy.io/docs/envoy/latest/

      Istio 云原生 任務調(diào)度

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:數(shù)字簽名系列一:簽名簡介與RSA簽名算法
      下一篇:【神經(jīng)網(wǎng)絡】綜合篇——人工神經(jīng)網(wǎng)絡、卷積神經(jīng)網(wǎng)絡、循環(huán)神經(jīng)網(wǎng)絡、生成對抗網(wǎng)絡一、人工神經(jīng)網(wǎng)絡
      相關(guān)文章
      国产人成亚洲第一网站在线播放| 久久精品国产亚洲AV网站| 亚洲av无码一区二区三区不卡| 亚洲裸男gv网站| 亚洲片国产一区一级在线观看| 国产成人综合亚洲| 亚洲欧美日韩中文字幕在线一区| 亚洲人成网站日本片| 亚洲三级视频在线观看| 亚洲午夜精品在线| 亚洲一区在线免费观看| 国产精品亚洲片夜色在线| 亚洲男人天堂2022| 亚洲愉拍一区二区三区| 亚洲日韩精品无码AV海量| 亚洲国产精品网站在线播放| 中国亚洲呦女专区| 亚洲成av人片天堂网无码】| 亚洲精品无码专区| 无码专区一va亚洲v专区在线| 伊人久久亚洲综合影院| 亚洲区小说区图片区| 亚洲综合网站色欲色欲| 国产亚洲精久久久久久无码| 亚洲成av人影院| 1区1区3区4区产品亚洲| 亚洲国产成人资源在线软件| 亚洲一区中文字幕在线观看| 久久夜色精品国产噜噜亚洲a| 国产成人精品亚洲日本在线| 亚洲人成人网站18禁| 午夜亚洲国产成人不卡在线 | 亚洲国产精品第一区二区三区| 亚洲国产成人乱码精品女人久久久不卡| 亚洲高清最新av网站| 亚洲综合无码AV一区二区| 亚洲a一级免费视频| 亚洲乱码卡三乱码新区| 亚洲爆乳大丰满无码专区| 亚洲国产成人精品女人久久久| 国产亚洲精AA在线观看SEE |