深度Istio Sidecar自動注入如何實現的?

2021-10-10 08:28:03 字數 3257 閱讀 4550

這篇文章打算講一下sidecar,我在剛學習istio的時候會有一些疑惑,sidecar是如何做到無感知的注入的,很多學習資料都沒有詳細去講這部分的內容,下面打算解析一下。

邊車介紹#

在sidecar部署方式中會為每個應用的容器部署乙個伴生容器。對於istio,sidecar接管進出應用程式容器的所有網路流量。

使用sidecar模式部署服務網格時,無需在先前的上執行**,但可以在中上執行多個相同的sidecar副本。容器共享儲存,網路等資源,可以通用的將這個注入了sidecar容器的pod理解為一台主機,兩個容器共享主機資源。

邊車注入過程#

注入sidecar的時候會在生成pod的時候附加上兩個容器:istio-init,istio-proxy。istio-init這個容器從名字上看也可以知道它屬於k8s中的init容器,主要用於設定iptables規則,讓讓出入流量都轉由sidecar進行處理。istio-proxy是基於envoy實現的乙個網路**容器,是真正的sidecar,應用的流量會被改為進入或替換sidecar。

我們在使用sidecar自動注入的時候只需要給對應的應用部署的命名空間打個istio-injection = enabled標籤,這個命名空間中新建的任何pod都會被istio注入sidecar。

應用部署後我們可以通過kubectl describe檢視pod內的容器:

複製[root @ localhost〜]#kubectl描述pod的詳細資訊-v1-6c9f8bcbcb-shltm

sidecar注入原理#

sidecar注入主要是依託k8s的准入控制器admission controller來實現的。

准入控制器會攔截kubernetes api server收到的請求,攔截發生在認證和鑑權完成之後,物件進行持久化之前。可以定義兩種型別的准入webhook:驗證和變異。驗證型別的webhook可以根據自定義的准入策略決定是否拒絕請求;更改型別的webhook可以根據自定義配置來對請求進行編輯。

我們可以看看配置詳情:

複製[root @ localhost〜]#kubectl獲取mutatingwebhookconfiguration istio-sidecar-injector -o yaml

複製[root @ localhost〜]#kubectl get svc --namespace = istio-system | grep istiod

istiod clusterip 10.68.222.38 《無》 15012 / tcp,443 / tcp

32小時

通常sidecar注入由以下步驟完成:

解析webhook rest請求,將admissionreview原始資料反序列化;

解析pod,將admissionreview中的admissionrequest反序列化;

利用pod和網格配置渲染sidecar配置模板;

利用pod及渲染後的模板建立json patch;

構造入學響應;

構造入學審查,將其發給apiserver;

原始碼流程差不多是這個樣子:

-20201107174326312

下面我們來看看原始碼。

原始位置:pkg / kube / inject / webhook.go

然後我們進入到serveinject方法中:

檔案位置:pkg / kube / inject / webhook.go

ar:= v1beta1.admissionreview {} //解碼請求體

如果_,_,err:= deserializer.decode(body,nil,&ar); err!= nil else //構建admissionreview作為引數返回給呼叫方

響應:= v1beta1.admissionreview {}如果reviewresponse!= nil

}resp,err:= json.marshal(response)if err!= nil 如果_,err:= w.write(resp); err!= nil

}這個方法很簡單,主要就是讀取請求體並解碼,然後呼叫inject方法,生成admissionreview作為引數返回給呼叫方。

主要邏輯從這裡可以拋光都在inject方法裡面,下面看看這個方法:

copyfunc(wh * webhook)注入(ar * v1beta1.admissionreview)* v1beta1.admissionresponse

… //封裝模板資料

spec,istatus,err:= injectiondata(wh.config.template,wh.valuesconfig,wh.sidecartemplateversion,typemetadata,deploymeta,&pod.spec,&pod.objectmeta,wh.meshconfig.defaultconfig,wh.meshconfig)//目錄:lll

如果err!= nil

… //將需要注入的有istio-init / istio-proxy容器封裝成補丁操作

//具體可以看這裡:https:

patchbytes,err:= createpatch(&pod,injectionstatus(&pod),注釋,spec,deploymeta.name)if err!= nil

log.debugf(「 admissionresponse:patch =%v \ n」,string(patchbytes))//將需要補丁的配置封裝成admissionresponse返回

reviewresponse:= v1beta1.admissionresponse (),

}totalsuccessfulinjections.increment()返回&reviewresponse

}注入方法邏輯主要分為以下幾個步驟:

json反序列化請求資料到pod中;

呼叫injectiondata根據模板封裝資料,主要是構造istio-init,istio-proxy等容器配置;

呼叫createpatch方法將模板資料轉化成json形式,到時候在建立容器的時候會補丁到建立容器的配置中,具體可以看這裡:https :

最後將資料封裝成admissionresponse返回;

總結#本篇文章重點講解sidecar容器注入實現原理,通過使用k8s的准入控制器來做到在每個新建的pod裡面都無感知的建立sidecar做流量託管。

自寫泛型深度複製

淺度複製 shallow copy 對第一層的值型別的值複製和引用型別的引用複製,如果改變了起引用的值,其引用也會相應的改變。深度複製 deep copy 引用型別的複製,不僅複製了引用物件,生成了新的物件,並且將原物件的值也進行了絕對複製,如果原物件中的值進行了改變,這裡並不會受到影響。對於深度複...

自聯想神經網路 深度信念網路

自聯想神經網路 auto associative neural network 縮寫為aann 是1987年ballard提出的,其網路原型是一種具有對稱拓撲結構的五層前饋傳遞網路,aann 應用到資料檢驗問題時具有比較明顯的物理意義。是bp神經網路的一種特殊情形。其特點是有對稱拓撲結構,即輸出量等...

深入研究自監督單目深度估計 Monodepth2

單目深度估計模型monodepth2對應的 為digging into self supervised monocular depth estimation,由倫敦大學學院提出,這篇 的研究目標是從單目rgb影象中恢復出對應的深度,由圖1所示 該網路可以從單目影象中恢復對應的深度,圖中不同顏色代表不...