Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(高級(jí)篇)_第1頁
Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(高級(jí)篇)_第2頁
Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(高級(jí)篇)_第3頁
Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(高級(jí)篇)_第4頁
Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(高級(jí)篇)_第5頁
已閱讀5頁,還剩177頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐(高級(jí)篇)目錄\h高級(jí)篇\h第9章Istio穩(wěn)定性與運(yùn)維\h9.1Istio功能模塊的穩(wěn)定性與常見問題\h9.2Istio流量管理相關(guān)運(yùn)維\h9.3Istio組件升級(jí)與回滾\h9.4本章總結(jié)\h第10章Istio定制與擴(kuò)展\h10.1Mixer適配器擴(kuò)展\h10.2實(shí)現(xiàn)適配器\h10.3編譯與打包適配器\h10.4IstioCNI插件\h10.5從Kubernetes擴(kuò)展到虛擬機(jī)\h10.6擴(kuò)展Envoy過濾器\h10.7集成外部Zipkin兼容服務(wù)\h10.8本章總結(jié)\h第11章Knative:基于Istio的無服務(wù)器計(jì)算\h11.1Knative架構(gòu)解析\h11.2KnativeBuild運(yùn)行機(jī)制\h11.3KnativeEventing運(yùn)行機(jī)制\h11.4基于Istio實(shí)現(xiàn)Serving組件\h11.5在Istio上部署配置Knative\h11.6基于KnativeServing的自動(dòng)伸縮\h11.7本章總結(jié)\h第12章多集群管理\h12.1服務(wù)網(wǎng)格的未來\h12.2多集群部署管理\h12.3單控制平面VPN連接拓?fù)鋅h12.4單控制平面Gateway連接拓?fù)鋅h12.5多控制平面\h12.6本章總結(jié)高級(jí)篇第9章Istio穩(wěn)定性與運(yùn)維第10章Istio定制與擴(kuò)展第11章Knative:基于Istio的無服務(wù)器計(jì)算第12章多集群管理第9章Istio穩(wěn)定性與運(yùn)維本章介紹Istio的穩(wěn)定性與運(yùn)維調(diào)試,這屬于Istio的高級(jí)功能之一。首先,介紹Istio相關(guān)組件的功能穩(wěn)定性、可能的請(qǐng)求錯(cuò)誤排查情況以及如何使用SDS動(dòng)態(tài)管理證書來提升穩(wěn)定性,接著,重點(diǎn)闡述Istio流量管理相關(guān)的運(yùn)維及問題排查,以幫助讀者在遇到問題時(shí)可以參考調(diào)試,最后介紹Istio在運(yùn)維過程中涉及的組件升級(jí)與回滾,以及帶來的影響。9.1Istio功能模塊的穩(wěn)定性與常見問題Istio社區(qū)一直在快速更新中,每個(gè)Istio功能模塊的相對(duì)成熟度和支持級(jí)別也隨之在不斷地變化。社區(qū)對(duì)這些功能模塊的不同發(fā)展階段進(jìn)行了定義,參見表9-1。表9-1Istio功能模塊的不同發(fā)展階段不同的功能模塊成熟度和發(fā)展階段不盡相同,熟悉這些階段進(jìn)展情況,對(duì)于選擇Istio的哪些功能模塊應(yīng)用到生產(chǎn)環(huán)境中非常有幫助。這些信息在每月Istio發(fā)布后會(huì)及時(shí)更新,讀者可以及時(shí)從官方網(wǎng)站了解最新進(jìn)展:\hhttps://istio.io/about/feature-stages/??傮w而言,IstioPilot和Envoy相關(guān)的流量管理功能模塊比較成熟,除了自定義EnvoyFilter的支持處于Alpha狀態(tài)外,其他功能模塊都是Beta或者Stable。Istio1.4中的具體狀態(tài)摘錄參見表9-2。表9-2Istio1.4中的功能模塊狀態(tài)1.Pilot的穩(wěn)定性Pilot負(fù)責(zé)Istio的流量控制功能,同時(shí)將Sidecar更新至最新的配置。Pilot啟動(dòng)以后,監(jiān)聽端口15010(gRPC)和8080(HTTP)。當(dāng)應(yīng)用的Sidecar(Envoy,Istio-Proxy)啟動(dòng)以后,它將會(huì)連接pilot.istio-system:15010,獲取初始配置,并保持長(zhǎng)連接。Pilot會(huì)監(jiān)聽Kubernetes資源,只要檢測(cè)到網(wǎng)格發(fā)生變化,就會(huì)將最新的配置通過gRPC連接推送到Sidecar上。當(dāng)Pilot停止以后,Pilot和Sidecar之間的gRPC連接被關(guān)閉,同時(shí)Sidecar會(huì)一直嘗試重連。網(wǎng)絡(luò)流量不會(huì)受Pilot停止的影響,因?yàn)樗械呐渲帽煌扑瓦^來以后,就會(huì)存儲(chǔ)在Sidecar的內(nèi)存中。網(wǎng)格中新的變更信息(例如新的pod、規(guī)則、服務(wù)等)不會(huì)繼續(xù)到達(dá)Sidecar,因?yàn)镻ilot不再監(jiān)聽這些變化并轉(zhuǎn)發(fā)。當(dāng)Pilot重新上線以后,Sidecar就會(huì)重新建立連接(一直嘗試重連)并獲取最新的網(wǎng)格配置。2.Mixer的穩(wěn)定性MixerPolicy執(zhí)行網(wǎng)絡(luò)策略。Mixer在啟動(dòng)時(shí)讀取配置,并監(jiān)聽Kubernetes的資源變化。一旦檢測(cè)到新的配置,Mixer就會(huì)將其加載至內(nèi)存中。Sidecar在每次請(qǐng)求服務(wù)應(yīng)用時(shí),檢查(發(fā)起連接)MixerPolicypod。當(dāng)MixerPolicypod停止以后,所有到服務(wù)的請(qǐng)求會(huì)失敗,并收到“503UNAVAILABLE:nohealthyupstream”的錯(cuò)誤,因?yàn)樗蠸idecar無法連接到這些pod。在Istio1.1版本中新增了[global]配置(policyCheckfailOpen),允許“失敗打開”策略,即當(dāng)MixerPolicypod無法響應(yīng)時(shí),所有的請(qǐng)求會(huì)成功,而不是報(bào)503錯(cuò)誤。當(dāng)Mixer停止后,我們?cè)诰W(wǎng)格中執(zhí)行的操作(例如新增規(guī)則、更新配置等)都不會(huì)對(duì)應(yīng)用產(chǎn)生影響,直到Mixer重新啟動(dòng)。MixerTelemetry為Istio插件提供遙測(cè)信息。Sidecar什么時(shí)候調(diào)用Telemetrypod取決于兩個(gè)因素:批量完成100次請(qǐng)求和請(qǐng)求時(shí)間超過1秒鐘(默認(rèn)配置),這兩個(gè)條件只要有一個(gè)先滿足就會(huì)執(zhí)行該操作,這是為了避免對(duì)Telemetrypod造成過于頻繁的調(diào)用。當(dāng)Telemetrypod停止以后,Sidecar記錄一次失敗信息(在pod標(biāo)準(zhǔn)錯(cuò)誤輸出里),并丟棄遙測(cè)信息。請(qǐng)求不會(huì)受到影響,正如Policypod停止時(shí)一樣。當(dāng)Telemetrypod重新啟動(dòng)以后,就會(huì)繼續(xù)從Sidecar收到遙測(cè)信息。此外,Istio允許自定義控制平面的組件。例如,如果不需要Policy,你可以完全禁用MixerPolicy。Pilot、MixerPolicy和MixerTelemetry在高可用部署場(chǎng)景工作得也很好,可以同時(shí)運(yùn)行多副本。實(shí)際上,默認(rèn)配置通過HorizontalPodAutoscaler允許啟動(dòng)1到5個(gè)pod。9.1.1可能的請(qǐng)求錯(cuò)誤排查在實(shí)際的運(yùn)行過程中,IstioPilot或者Envoy代理可能會(huì)遇到503或者404請(qǐng)求錯(cuò)誤,例如,對(duì)于HTTP和TCP來說,可能會(huì)遇到如下的響應(yīng)信息:·UH:除503響應(yīng)代碼外,上游集群中沒有健康的上游主機(jī)。·UF:除503響應(yīng)代碼外,還有上游連接失敗?!O:除503響應(yīng)代碼外,還有上游溢出(觸發(fā)熔斷)。·NR:除404響應(yīng)代碼外,沒有為給定請(qǐng)求配置路由?!RX:請(qǐng)求被拒絕,因?yàn)橐堰_(dá)到上游重試限制(HTTP)或最大連接嘗試次數(shù)(TCP)。除此之外,對(duì)于HTTP請(qǐng)求來說,還可能會(huì)遇到如下的響應(yīng)信息:·DC:下游連接中斷?!H:除503響應(yīng)代碼外,本地服務(wù)的運(yùn)行狀況檢查請(qǐng)求失敗。·UT:除504響應(yīng)代碼外,上游請(qǐng)求超時(shí)?!R:除503響應(yīng)代碼外,連接本地重置?!R:除503響應(yīng)代碼外,上游遠(yuǎn)程重置?!C:除503響應(yīng)代碼外,上游連接中斷。這些錯(cuò)誤可能有多種原因,但最常見的原因如下。1.無法連接上Pilot應(yīng)用程序的Sidecar代理可能無法連接上Pilot(確認(rèn)Pilot正在運(yùn)行),如圖9-1所示。2.Kubernetes服務(wù)未配置正確的協(xié)議Kubernetes服務(wù)未配置正確的協(xié)議,如圖9-2所示,IstioPilot通過KubernetesAPI獲取集群內(nèi)的服務(wù)信息。圖9-1應(yīng)用程序的Sidecar代理無法連接上Pilot圖9-2Kubernetes服務(wù)未配置正確的協(xié)議3.啟用了雙向認(rèn)證mTLS但服務(wù)間的目標(biāo)規(guī)則不對(duì)啟用了雙向認(rèn)證mTLS,但服務(wù)間的目標(biāo)規(guī)則DestinationRule中并沒有設(shè)置相應(yīng)的流量策略(TrafficPolicy),即流量策略中的TLS設(shè)置模式不匹配。例如,Istio環(huán)境中啟用了mTLS,即kubectlgetMeshPolicydefault-oyaml

apiVersion:authentication.istio.io/v1alpha1

kind:MeshPolicy

metadata:...

spec:

peers:

-mtls:{}

但服務(wù)間設(shè)置的目標(biāo)規(guī)則配置如下:kubectlgetdestinationruleproductoyaml

apiVersion:networking.istio.io/v1alpha3

kind:DestinationRule

metadata:...

spec:

...

trafficPolicy:

tls:

mode:DISABLE

4.VirtualService/Envoy的配置不對(duì)導(dǎo)致請(qǐng)求錯(cuò)誤的另一個(gè)原因可能是Istio的VirtualService/Envoy配置正在捕獲錯(cuò)誤的上游集群中的路由。例如目標(biāo)集群應(yīng)用中Socket超時(shí)設(shè)置較低等,Socket超時(shí)越短,可能會(huì)有越多的503問題。因此在應(yīng)用代碼中建議設(shè)置合適的超時(shí)時(shí)間,例如在Node.js應(yīng)用中可以如下設(shè)置:constserver=app.listen(port,'',()=>{

(`Appisnowrunningonhttp://localhost:${port}`)

})

server.keepAliveTimeout=1000*(60*6)//6minutes

在Python應(yīng)用中可以如下設(shè)置:global_config={

'server.socket_timeout':6*60,

}

cherrypy.config.update(global_config)

而在Tomcat應(yīng)用中則可以如下設(shè)置連接超時(shí)參數(shù):server:

connect-timeout:360000

9.1.2證書有效期管理證書的有效期也會(huì)影響整個(gè)系統(tǒng)的穩(wěn)定性,Istio自簽名證書之前的版本中設(shè)置了1年的默認(rèn)生命周期。如果使用的是Istio自簽名證書,則需要在過期之前安排定期根證書輪轉(zhuǎn)。根證書到期可能會(huì)導(dǎo)致意外的集群范圍中斷。請(qǐng)注意,重新啟動(dòng)Envoy實(shí)例以重新加載新的根證書,這可能會(huì)影響長(zhǎng)連接。如果當(dāng)前沒有使用Istio中的雙向TLS功能,并且將來不會(huì)使用它,則不會(huì)受到影響,也不需要采取任何措施。此外,可以選擇升級(jí)到1.1.8或更高版本以避免將來出現(xiàn)此證書有效期問題。如果當(dāng)前沒有在Istio中使用雙向TLS功能并且將來可能會(huì)使用它,建議按照下面列出的步驟進(jìn)行升級(jí)。如果當(dāng)前正在使用Istio中的雙向TLS功能和自簽名證書,請(qǐng)按照該過程檢查是否會(huì)受到影響。首先,要評(píng)估根證書的剩余壽命,檢查根證書何時(shí)到期??梢栽诒緯拇a庫中找到目錄root-transition,下載該目錄下的腳本root-transition.sh,如下所示:chmod+xroot-transition.sh

./root-transition.shcheck

在根證書過期之前執(zhí)行其余步驟以避免系統(tǒng)中斷。在過渡期間,Envoy的Sidecar可能會(huì)重新啟動(dòng)以重新加載新證書。這可能會(huì)對(duì)你的流量產(chǎn)生一些影響。如果你的Pilot沒有Sidecar代理Envoy,請(qǐng)考慮為你的Pilot安裝Sidecar代理Envoy。因?yàn)镻ilot使用舊的根證書來驗(yàn)證新的工作負(fù)載證書存在問題,這可能會(huì)導(dǎo)致Pilot和Envoy之間斷開連接。默認(rèn)情況下,Istio升級(jí)指南會(huì)安裝帶有Sidecar代理的Pilot:./root-transition.shtransition

Createnewcacert,withtrustdomainascluster.local

SunAug1123:02:48CST2019deleteoldCAsecret

secret"istio-ca-secret"deleted

SunAug1123:02:48CST2019createnewCAsecret

secret/istio-ca-secretcreated

SunAug1123:02:48CST2019RestartingCitadel...

pod"istio-citadel-8455b8d867-jjbtz"deleted

SunAug1123:02:59CST2019restartedCitadel,checkingstatus

NAMEREADYSTATUSRESTARTSAGE

istio-citadel-8455b8d867-xdl7q1/1Running011s

Newrootcertificate:

Certificate:

Data:

Version:1(0x0)

SerialNumber:12087458590407451702(0xa7bf478bbe7ae436)

SignatureAlgorithm:sha256WithRSAEncryption

Issuer:O=cluster.local

Validity

NotBefore:Aug1115:02:482019GMT

NotAfter:Aug815:02:482029GMT

Subject:O=cluster.local

SubjectPublicKeyInfo:

PublicKeyAlgorithm:rsaEncryption

Public-Key:(2048bit)

Modulus:

00:ba:79:72:c0:32:8a:54:99:fe:b5:41:c8:5d:d1:

d7:91:52:c4:31:d1:42:83:e2:89:e7:d7:21:64:15:

ca:f9:8c:27:be:13:ff:8f:69:10:2c:54:c1:0c:aa:

85:3b:5e:09:e8:ce:ab:ce:a4:47:9c:2e:6d:2a:c6:

8a:36:82:96:b1:9c:20:07:bc:40:99:bd:36:c5:82:

c5:18:a3:cf:78:1a:40:e9:35:5f:82:41:1e:09:2b:

3b:50:69:03:7d:a9:24:81:99:c2:7a:48:aa:ae:4f:

df:70:51:3f:8c:bf:16:14:7b:29:06:7a:91:91:6d:

00:ee:66:ca:4c:78:08:54:98:13:ac:78:ba:74:5f:

65:1a:83:e9:52:78:f0:ad:77:53:f1:16:14:9b:43:

4d:7d:3b:6e:02:fa:64:f2:40:e4:49:6b:9e:d2:45:

a3:89:21:07:44:cf:9a:ba:e1:f5:f3:7a:02:c4:fe:

48:91:a8:2e:d3:22:b7:96:98:64:c5:55:18:74:ff:

ca:b6:52:03:6b:2b:62:a3:6a:f4:4a:17:e0:d8:d0:

14:23:ef:c5:55:e1:56:c6:94:7a:06:c4:55:97:7f:

b7:91:dd:7d:de:ca:19:08:a3:96:50:b3:0f:c8:2f:

66:57:37:70:26:fc:cf:8e:82:ff:b9:98:19:2e:7f:

5b:a1

Exponent:65537(0x10001)

SignatureAlgorithm:sha256WithRSAEncryption

84:f4:bb:86:1c:d5:c2:28:b3:01:96:db:89:fa:da:c8:96:e2:

78:74:b4:72:1e:60:ae:6c:7a:0c:31:3f:81:cf:63:8c:db:cc:

f6:5b:0a:06:03:97:b7:7b:ad:26:a7:c9:be:6e:f7:75:d9:e1:

13:78:80:09:20:0b:ad:71:7f:de:9f:4d:96:36:93:a3:f7:1c:

19:9a:6b:f2:6d:e5:00:8d:1b:5d:38:bc:b4:ba:32:32:ed:ac:

3c:6c:a2:19:30:4a:9a:4d:23:3d:b7:41:0c:8d:e5:ad:75:3b:

43:85:c8:89:73:25:32:8b:ea:7e:53:4d:47:5d:38:93:ff:30:

24:83:6f:b7:1d:ce:bf:bb:0d:d9:ce:5c:ee:36:84:f5:75:ce:

c8:0c:d6:c5:78:90:3e:81:ac:3b:0f:db:11:15:85:d0:f8:40:

91:ed:1a:53:c9:fb:b8:ca:aa:52:52:4a:33:de:9d:2e:66:cd:

a6:c0:35:16:f7:dc:c8:32:44:87:f8:ab:6d:37:f6:92:e0:54:

b8:05:12:b5:02:10:98:35:e1:89:3b:29:07:32:a3:a3:63:76:

71:0b:e8:d8:95:ad:c4:8f:05:fd:67:4a:19:33:a2:38:e5:7c:

06:19:f4:77:eb:13:dc:62:21:c1:82:df:bc:3c:70:fb:94:fa:

70:8b:6d:76

Youroldcertificateisstoredasold-ca-cert.pem,andyourprivatekeyisstoredasca-key.pem

Pleasesavethemsafelyandprivately.

驗(yàn)證是否生成了新的工作負(fù)載證書:./root-transition.shverify

ThisscriptchecksthecurrentrootCAcertificateispropagatedtoalltheIstio-managedworkloadsecretsinthecluster.

RootcertMD5is33f9d1eae5dbbdb18e7be4613d99e2af

Checkingnamespace:ack-system

Secretack-system.istio.ackismatchescurrentroot.

Secretack-system.istio.defaultismatchescurrentroot.

Checkingnamespace:authorizationsample

Secretauthorizationsample.istio.defaultismatchescurrentroot.

Checkingnamespace:default

Secretdefault.istio.bookinfo-detailsismatchescurrentroot.

Secretdefault.istio.bookinfo-productpageismatchescurrentroot.

Secretdefault.istio.bookinfo-ratingsismatchescurrentroot.

Secretdefault.istio.bookinfo-reviewsismatchescurrentroot.

Secretdefault.istio.defaultismatchescurrentroot.

Secretdefault.istio.sleepismatchescurrentroot.

Checkingnamespace:istio-system

Secretistio-system.istio.certmanagerismatchescurrentroot.

Secretistio-system.istio.defaultismatchescurrentroot.

Secretistio-system.istio.istio-citadel-service-accountismatchescurrentroot.

Secretistio-system.istio.istio-galley-service-accountismatchescurrentroot.

Secretistio-system.istio.istio-ingressgateway-service-accountismatchescurrentroot.

Secretistio-system.istio.istio-init-operatorismatchescurrentroot.

Secretistio-system.istio.istio-mixer-service-accountismatchescurrentroot.

Secretistio-system.istio.istio-pilot-service-accountismatchescurrentroot.

Secretistio-system.istio.istio-sidecar-injector-service-accountismatchescurrentroot.

Secretistio-system.istio.kiali-service-accountismatchescurrentroot.

Secretmetheusismatchescurrentroot.

Checkingnamespace:nosidecar

Secretnosidecar.istio.defaultismatchescurrentroot.

Checkingnamespace:ns1

Secretns1.istio.defaultismatchescurrentroot.

Checkingnamespace:ns2

Secretns2.istio.defaultismatchescurrentroot.

AllIstiomutualTLSkeysandcertificatesmatchwithcurrentroot!

如果此命令失敗,請(qǐng)等待一分鐘再次運(yùn)行該命令。Citadel傳播證書需要一些時(shí)間。為確??刂破矫娼M件和Envoy全部加載新證書和密鑰,要升級(jí)到Istio1.1.8或更高版本:驗(yàn)證Envoy是否加載了新的工作負(fù)載證書,以下命令顯示了一個(gè)示例,用于檢查在命名空間欄中運(yùn)行的podfoo的Envoy證書。kubectlexec-itsleep-57f9d6fd6b-n4ftq-cistio-proxy-ndefault--curlhttp://localhost:15000/certs|head-c1000

{

"certificates":[

{

"ca_cert":[

{

"path":"/etc/certs/root-cert.pem",

"serial_number":"a7bf478bbe7ae436",

"subject_alt_names":[],

"days_until_expiration":"3649",

"valid_from":"2019-08-11T15:02:48Z",

"expiration_time":"2029-08-08T15:02:48Z"

}

],

請(qǐng)檢查一下ca_cert的valid_from值,如果與前面步驟中運(yùn)行命令./root-transition.shtransition時(shí)新證書中的值匹配,則你的Envoy已加載新的根證書。9.1.3使用SDS動(dòng)態(tài)管理證書SDS(秘鑰發(fā)現(xiàn)服務(wù))是Envoy1.8.0版本起開始引入的服務(wù)??梢栽赽ootstrap.static_resource的secrets配置中為Envoy指定TLS證書(secret),也可以通過SDS遠(yuǎn)程獲取。Istio已經(jīng)將在1.1版本中支持SDS。SDS帶來的最大好處就是簡(jiǎn)化證書管理。要是沒有該功能,我們就必須使用Kubernetes中的secret資源創(chuàng)建證書,然后把證書掛載到代理容器中。如果證書過期,還需要更新secret和重新部署代理容器。使用SDS之后,SDS服務(wù)器將證書推送到所有Envoy實(shí)例上。如果證書過期,服務(wù)器只需將新證書推送到Envoy實(shí)例,Envoy可以立即使用新證書而無須重新部署。如果listenerserver需要從遠(yuǎn)程獲取證書,則listenerserver不會(huì)被標(biāo)記為active狀態(tài),在獲取證書之前不會(huì)打開其端口。如果Envoy由于連接失敗或錯(cuò)誤的響應(yīng)數(shù)據(jù)而無法獲取證書,則listenerserver將被標(biāo)記為active,并且打開端口,但是將重置與端口的連接。上游集群的處理方式類似,如果需要通過SDS從遠(yuǎn)程獲取集群客戶端證書,則不會(huì)將其標(biāo)記為active狀態(tài),在獲得證書之前它不會(huì)被使用。如果Envoy由于連接失敗或錯(cuò)誤的響應(yīng)數(shù)據(jù)而無法獲取證書,則集群將被標(biāo)記為active,可以處理請(qǐng)求,但路由到該集群的請(qǐng)求都將被拒絕。Envoy代理和SDS服務(wù)器之間的連接必須是安全的??梢栽谕恢鳈C(jī)上運(yùn)行SDS服務(wù)器,使用UnixDomainSocket進(jìn)行連接。否則,需要代理和SDS服務(wù)器之間的mTLS。在這種情況下,必須靜態(tài)配置SDS連接的客戶端證書。9.2Istio流量管理相關(guān)運(yùn)維服務(wù)網(wǎng)格Istio將流量管理從Kubernetes中解耦,網(wǎng)格內(nèi)部的流量無須kube-proxy組件進(jìn)行路由,而是通過一個(gè)Sidecar代理層,管理服務(wù)間的流量路由。流量管理是Istio中最為重要的功能之一,同時(shí)也是運(yùn)維Istio最容易出現(xiàn)問題的環(huán)節(jié),下面總結(jié)了我們?cè)趯?shí)踐中遇到的一些問題及其解決方法供讀者參考。9.2.1路由規(guī)則對(duì)應(yīng)用程序不生效安裝官方Bookinfo示例,如果路由規(guī)則正常運(yùn)行,但類似的版本路由規(guī)則對(duì)自己的應(yīng)用程序沒有生效,則可能需要更改Kubernetes服務(wù)。Kubernetes服務(wù)必須遵守某些限制才能利用Istio的L7路由功能,對(duì)pod和服務(wù)的要求如下。1.服務(wù)端口命名約定服務(wù)端口必須進(jìn)行命名。端口名稱只允許是<協(xié)議>[-<后綴>-]模式,其中<協(xié)議>部分可選擇范圍包括http、http2、grpc、mongo以及redis,Istio可以通過對(duì)這些協(xié)議的支持來提供路由能力。例如name:http2-foo和name:http都是有效的端口名,但name:http2foo就是無效的。如果沒有給端口進(jìn)行命名,或者命名沒有使用指定前綴,那么這一端口的流量就會(huì)被視為普通TCP流量(除非顯式地用Protocol:UDP聲明該端口是UDP端口)。2.關(guān)聯(lián)服務(wù)pod必須關(guān)聯(lián)到Kubernetes服務(wù),如果一個(gè)pod屬于多個(gè)服務(wù),這些服務(wù)不能在同一端口上使用不同協(xié)議,例如HTTP和TCP。3.Deployment應(yīng)帶有app以及version類似標(biāo)簽在使用KubernetesDeployment進(jìn)行pod部署的時(shí)候,建議顯式地為Deployment加上app以及version類似標(biāo)簽。每個(gè)Deployment都應(yīng)該有一個(gè)有意義的app標(biāo)簽和一個(gè)用于標(biāo)識(shí)Deployment版本的version標(biāo)簽。app標(biāo)簽在分布式跟蹤的過程中會(huì)用于加入上下文信息。Istio還會(huì)用app和version標(biāo)簽給遙測(cè)指標(biāo)數(shù)據(jù)加入上下文信息。不要使用ID(UID)值為1337的用戶來運(yùn)行應(yīng)用。9.2.2Sidecar是否注入為了支持Sidecar自動(dòng)注入,請(qǐng)確保集群符合以下前提條件,包括:·Sidecar的自動(dòng)注入使用了Kubernetes的mutatingwebhookadmissioncontroller功能。Kubernetes1.9以后的版本才具備這一能力?!ひ獧z查kube-apiserver的進(jìn)程,是否具備admission-control參數(shù),并且這個(gè)參數(shù)的值中需要包含MutatingAdmissionWebhook以及ValidatingAdmissionWebhook兩項(xiàng),并且按照正確的順序加載,這樣才能啟用admissionregistrationAPI。如果你的微服務(wù)是部署在kube-system、kube-public或者istio-system這些命名空間,那么就會(huì)被免除Sidecar自動(dòng)注入。請(qǐng)使用其他命名空間替代。是否進(jìn)行Sidecar注入取決于三個(gè)條件,參見表9-3。表9-3Sidecar注入條件9.2.3Istio配置參數(shù)優(yōu)化通過前面章節(jié)可知,Istio的配置參數(shù)非常復(fù)雜,這些參數(shù)的設(shè)置無疑對(duì)系統(tǒng)的性能和穩(wěn)定有極大的幫助。本節(jié)著重從幾個(gè)性能相關(guān)的參數(shù)來介紹Istio的配置參數(shù)優(yōu)化。我們知道,在Istio的數(shù)據(jù)平面的每一個(gè)Sidecar代理,都需要與控制平面的Pilot進(jìn)行通信。隨著Istio訪問量的增大,Pilot的實(shí)例也可以增多,默認(rèn)的Istio設(shè)置中就啟用了HPA擴(kuò)容,即當(dāng)PilotCPU利用率達(dá)到80%時(shí)就會(huì)觸發(fā)Pilot的實(shí)例擴(kuò)容。那么問題來了,當(dāng)Pilot有多個(gè)實(shí)例之后,Sidecar會(huì)在什么時(shí)候連接到新的Polit呢?在Istio的眾多配置參數(shù)中,有一個(gè)名稱為keepaliveMaxServerConnectionAge的參數(shù)描述了Sidecar代理與Pilot連接的最長(zhǎng)時(shí)間。該參數(shù)試圖平衡跨Pilot實(shí)例的負(fù)載,但代價(jià)是增加系統(tǒng)的改動(dòng)。因此,設(shè)置合理的參數(shù)值對(duì)于系統(tǒng)的穩(wěn)定性非常重要。參數(shù)值如果設(shè)置的太小,可能會(huì)由于Sidecar與Polit的頻繁重連接而造成訪問流量的丟失;反之,如果設(shè)置的太大,將會(huì)造成Polit負(fù)載的不均衡。在Istio的默認(rèn)配置中該參數(shù)設(shè)置為30分鐘。讀者可以根據(jù)自身Istio的情況進(jìn)行測(cè)試后設(shè)置合理的值。另外一個(gè)會(huì)影響Sidecar的資源利用率和延遲的參數(shù)是concurrency。它用于設(shè)置Sidecar代理的worker線程數(shù)量,也就是說,如果為Sidecar代理分配的CPU計(jì)算能力越強(qiáng),它的性能就會(huì)越好、應(yīng)用延遲會(huì)越小,當(dāng)然資源消耗也會(huì)越大。默認(rèn)數(shù)值是2,也就是說,兩個(gè)Sidecar代理的worker線程共享一個(gè)CPUcore。如果將其值設(shè)置為0,那么每個(gè)Sidecar代理的worker線程就會(huì)占用一個(gè)CPUcore。9.2.4Envoy無法連接HTTP1.0Envoy要求上游服務(wù)提供HTTP/1.1或者HTTP/2。例如當(dāng)使用Nginx在Envoy之后提供服務(wù)時(shí),就需要在Nginx配置文件中設(shè)置proxy_http_version為1.1,否則就會(huì)使用默認(rèn)值1.0。直接調(diào)用HTTP1.0的服務(wù),會(huì)出現(xiàn)如下的錯(cuò)誤:<HTTP/1.1426UpgradeRequired

此時(shí)就需要在Nginx的配置文件中增加如下變更,以便支持HTTP1.1:upstreamhttp_backend{

server:8080;

keepalive16;

}

server{

...

location/http/{

proxy_passhttp://http_backend;

proxy_http_version1.1;

proxy_set_headerConnection"";

...

}

}

9.2.5檢查Envoy與Pilot狀態(tài)差異proxy-status命令可以獲取Istio的整體狀態(tài),可以用來查看Sidecar是否收到配置或不同步。如果輸出列表信息中缺少一個(gè)Envoy的信息,表示這個(gè)Envoy當(dāng)前沒有連接到Pilot實(shí)例,所以也不會(huì)接收任何配置信息。另外,如果有stale的標(biāo)識(shí),可能意味著存在網(wǎng)絡(luò)問題或者Pilot需要擴(kuò)容。通過執(zhí)行命令“istioctlproxy-status”可以獲取Istio的整體狀態(tài),如下所示:通過提供Proxy作為參數(shù),可以檢查Envoy已加載的配置與Pilot要發(fā)送的配置之間的差異:$istioctlproxy-statusratings-v1-84975bc778-q9s7c.default

ClustersMatch

ListenersMatch

RoutesMatch(RDSlastloadedatSun,29Sep201917:59:34CST)

9.3Istio組件升級(jí)與回滾Istio的組件升級(jí)可以分為三個(gè)方面:Istio自定義資源CRD的升級(jí)、控制平面組件的升級(jí),以及數(shù)據(jù)平面Sidecar代理的升級(jí)。升級(jí)過程可能涉及新的二進(jìn)制文件以及配置和APIschemas等其他更改。注意,升級(jí)過程可能導(dǎo)致一些服務(wù)宕機(jī)。為了最大限度地減少宕機(jī)時(shí)間,請(qǐng)使用多副本以保證Istio控制平面組件和應(yīng)用程序具有高可用性。此外,1.0之前的版本,原則上不支持升級(jí)。Istiov1alpha3路由API具有更多的功能,但不向后兼容,舊的模型升級(jí)需要一次手動(dòng)轉(zhuǎn)換。Istio1.0以后將不再支持RouteRule、DesintationPolicy和EgressRule這些以前的配置資源。Kubernetes用戶可以繼續(xù)使用Ingress配置邊緣負(fù)載均衡器來實(shí)現(xiàn)基本的路由。但是,高級(jí)路由功能(例如,跨兩個(gè)版本的流量分割)則需要使用Gateway(Istio推薦的Ingress替代品)。Istio1.0之后的路由配置相比于0.8有以下變化:·RouteRule->VirtualService·DestinationPolicy->DestinationRule·EgressRule->ServiceEntry·Ingress->GatewayapiVersion也變更為:apiVersion:config.istio.io/v1alpha2->apiVersion:networking.istio.io/v1alpha3以下執(zhí)行是在假設(shè)Istio組件在istio-systemnamespace中安裝和升級(jí)的,如果不是的話,請(qǐng)針對(duì)命名空間做相應(yīng)的替換。9.3.1升級(jí)安裝文件Istio官方網(wǎng)站下載的Istio安裝包使用的鏡像文件均為docker.io/istio或者quay.io等境外提供的鏡像,如果拉取速度慢的話,可以使用國內(nèi)公有云廠商提供的更新后的安裝包,包括Helm安裝包等。下載該文件后,解壓到相應(yīng)的目錄{istio-home},可以看到如下類似的文件結(jié)構(gòu):.

├──Chart.yaml

├──LICENSE

├──README.md

├──charts

│├──certmanager

│├──galley

│├──gateways

│├──grafana

│├──ingress

│├──kiali

│├──mixer

│├──pilot

│├──prometheus

│├──security

│├──servicegraph

│├──sidecarInjectorWebhook

│└──tracing-on-sls

├──requirements.lock

├──requirements.yaml

├──templates

│├──_affinity.tpl

│├──_helpers.tpl

│├──configmap.yaml

│├──crds.yaml

│├──install-custom-resources.sh.tpl

│└──sidecar-injector-configmap.yaml

└──values.yaml

升級(jí)過程可以分為3個(gè)部分:CRD升級(jí)、控制平面升級(jí)、數(shù)據(jù)平面Sidecar升級(jí),下面分別介紹。9.3.2CRD升級(jí)在{istio-home}目錄中可以查看包含的CRD文件;通過kubectlapply升級(jí)Istio的CRD,等待幾秒鐘,讓CRD在kube-apiserver中提交:cd{istio-home}

foriininstall/kubernetes/helm/istio-init/files/crd*yaml;dokubectlapply-f$i;done

或者使用Helm通過以下命令進(jìn)行升級(jí):helmupgrade--install--forceistio-initinstall/kubernetes/helm/istio-init--namespaceistio-system

9.3.3控制平面升級(jí)控制平面組件包括了Citadel、Pilot、MixerPolicy與Telemetry,以及SidecarInjector等組件。如果沒有使用Helm安裝Istio,可以使用Kubernetes的滾動(dòng)更新機(jī)制來升級(jí)控制平面組件。通過執(zhí)行如下命令,生成Istio控制平面需要的yaml文件:helmtemplateinstall/kubernetes/helm/istio--nameistio--namespaceistio-system>install/kubernetes/istio.yaml

如果啟用雙向認(rèn)證mTLS,則需要設(shè)置參數(shù),如下所示:helmtemplateinstall/kubernetes/helm/istio--nameistio--namespaceistio-system--setglobal.mtls.enabled=true>install/kubernetes/istio-auth.yaml

通過kubectl直接應(yīng)用Istio控制平面所需的yaml文件的新版本:kubectlapply-finstall/kubernetes/istio.yaml

或者:kubectlapply-finstall/kubernetes/istio-auth.yaml

如果使用了Helm安裝Istio,可以使用如下命令升級(jí)IstioHelmChart,在values.yaml中進(jìn)行參數(shù)配置之后,運(yùn)行以下命令:helmupgradeistioinstall/kubernetes/helm/istio--namespaceistio-system

如果安裝了IstioCNI,請(qǐng)通過添加--setistio_cni.enabled=true設(shè)置啟用它。滾動(dòng)更新過程會(huì)將所有deployment和configmap升級(jí)到新版本。完成此過程后,你的Istio控制面應(yīng)該會(huì)更新為新版本。使用Envoyv1和v1alpha1路由規(guī)則(routerule)的現(xiàn)有應(yīng)用程序應(yīng)該可以繼續(xù)正常工作而無須任何修改。如果新控制平面存在任何關(guān)鍵問題,你都可以通過應(yīng)用舊版本的yaml文件來回滾更改。9.3.4數(shù)據(jù)平面Sidecar升級(jí)控制平面升級(jí)后,已經(jīng)運(yùn)行Istio的應(yīng)用程序仍將使用舊版本的Sidecar。要想升級(jí)Sidecar,需要重新注入它。1.自動(dòng)Sidecar注入情況下如果使用自動(dòng)Sidecar注入,可以通過對(duì)所有pod進(jìn)行滾動(dòng)升級(jí)來升級(jí)Sidecar,這樣新版本的Sidecar將被自動(dòng)重新注入。可以使用如下腳本通過patch優(yōu)雅結(jié)束時(shí)長(zhǎng)來觸發(fā)滾動(dòng)更新:NAMESPACE=$1

DEPLOYMENT_LIST=$(kubectl-n$NAMESPACEgetdeployment-ojsonpath='{.items[*].

}')

echo"RefreshingpodsinallDeployments:$DEPLOYMENT_LIST"

fordeployment_namein$DEPLOYMENT_LIST;do

TERMINATION_GRACE_PERIOD_SECONDS=$(kubectl-n$NAMESPACEgetdeployment"$deployment_name"-ojsonpath='{.spec.template.spec.terminationGracePeriodSeconds}')

if["$TERMINATION_GRACE_PERIOD_SECONDS"-eq30];then

TERMINATION_GRACE_PERIOD_SECONDS='31'

else

TERMINATION_GRACE_PERIOD_SECONDS='30'

fi

patch_string="{\"spec\":{\"template\":{\"spec\":{\"terminationGracePeriodSeconds\":$TERMINATION_GRACE_PERIOD_SECONDS}}}}"

kubectl-n$NAMESPACEpatchdeployment$deployment_name-p$patch_string

done

echo"done."

2.手動(dòng)Sidecar注入情況下如果使用手動(dòng)注入,可以通過執(zhí)行以下命令來升級(jí)Sidecar:kubectlapply-f<(istioctlkube-inject-f$ORIGINAL_DEPLOYMENT_YAML)

如果Sidecar以前被注入了一些定制的注入配置文件,則需要執(zhí)行以下命令來升級(jí)Sidecar:kubectlapply-f<(istioctlkube-inject--injectConfigFileinject-config.yaml--filename$ORIGINAL_DEPLOYMENT_YAML)

9.3.5升級(jí)中的影響分析1.CRD升級(jí)的影響分析在升級(jí)CRD的過程中,對(duì)于集群內(nèi)服務(wù)之間的調(diào)用、網(wǎng)關(guān)到服務(wù)之間的調(diào)用均沒有產(chǎn)生斷連影響。如圖9-3所示為集群內(nèi)服務(wù)間的調(diào)用在CRD升級(jí)過程中的執(zhí)行情況,執(zhí)行結(jié)果中顯示noerror。圖9-3集群內(nèi)服務(wù)間的調(diào)用在CRD升級(jí)過程中的執(zhí)行情況圖9-4為在CRD升級(jí)過程中,入口網(wǎng)關(guān)ingressgateway到網(wǎng)格內(nèi)的服務(wù)間的調(diào)用情況,執(zhí)行結(jié)果中顯示noerror。2.控制平面升級(jí)在沒有高可用(HA)的情況下,無論是集群內(nèi)服務(wù)之間的調(diào)用,還是通過網(wǎng)關(guān)到集群內(nèi)服務(wù)之間的調(diào)用,QPS均會(huì)下降,也會(huì)出現(xiàn)斷連情況。測(cè)試中發(fā)現(xiàn)集群內(nèi)服務(wù)之間的調(diào)用失敗率為5%左右,網(wǎng)關(guān)到集群內(nèi)服務(wù)之間的調(diào)用會(huì)更糟糕(因?yàn)閕ngressgateway可能會(huì)重新創(chuàng)建),如圖9-5所示。圖9-4在CRD升級(jí)過程中,入口網(wǎng)關(guān)ingressgateway到網(wǎng)格內(nèi)的服務(wù)間的執(zhí)行情況圖9-5網(wǎng)關(guān)到集群內(nèi)服務(wù)之間的調(diào)用情況在啟用高可用HA(例如pilot的replicas為2)的情況下,可以通過istio-pilot/istio-policy/istio-telemetry的HPA設(shè)置:minReplicas:2。此時(shí),在多次變更版本(升級(jí)、回滾)的情況下,測(cè)試結(jié)果顯示:服務(wù)之間的調(diào)用QPS基本不變,維持在1500~2000左右,失敗率基本為0,如圖9-6所示。圖9-6服務(wù)之間的調(diào)用情況而入口網(wǎng)關(guān)ingressgateway到服務(wù)間的調(diào)用QPS基本不變,失敗率基本為<1%。由此可見,啟用高可用HA之后,控制平面的升級(jí)對(duì)應(yīng)用的影響會(huì)大大縮減。3.數(shù)據(jù)平面Sidecar升級(jí)為保證你的服務(wù)在Sidecar升級(jí)的過程中不中斷業(yè)務(wù)流量,首先確保你的服務(wù)實(shí)例數(shù)大于等于2,升級(jí)策略為滾動(dòng)升級(jí)(rollingUpdate)。相關(guān)滾動(dòng)升級(jí)策略如下所示:spec:

replicas:2

selector:

matchLabels:

app:productpage

version:v1

strategy:

rollingUpdate:

maxSurge:1

maxUnavailable:1

type:RollingUpdate

其中,參數(shù)說明如下:·服務(wù)實(shí)例數(shù):deployment.spec.replicas>=2·升級(jí)策略:deployment.spec.strategy.type==RollingUpdate·滾動(dòng)升級(jí)最小存活實(shí)例數(shù):deployment.spec.replicas-deployment.spec.strategy.maxUnavailable>0在滾動(dòng)升級(jí)過程中,首先會(huì)移除舊的服務(wù)實(shí)例pod的endpoint,并將實(shí)例pod的狀態(tài)置為Terminating,這時(shí)Kubernetes會(huì)發(fā)送SIGTERM信號(hào)給pod實(shí)例,并等待優(yōu)雅關(guān)閉時(shí)間后,將pod強(qiáng)制殺掉??梢岳眠@段時(shí)間,處理未完成的請(qǐng)求。具體的優(yōu)雅關(guān)閉時(shí)間參數(shù)為deployment.spec.template.spec.terminationGracePeriodSeconds,默認(rèn)值為30s,可根據(jù)業(yè)務(wù)訴求適當(dāng)調(diào)整。另外,通過添加readiness探針,可以保證新實(shí)例的pod在真正準(zhǔn)備就緒時(shí),才開始接管業(yè)務(wù)流量。這就避免了在新實(shí)例pod未啟動(dòng)時(shí),接管業(yè)務(wù)流量造成的訪問中斷問題。而另外一個(gè)參數(shù)minReadySeconds描述了服務(wù)就緒時(shí)間,即用于標(biāo)識(shí)pod的ready時(shí)間至少保持多久才會(huì)認(rèn)為服務(wù)是運(yùn)行中。具體的服務(wù)就緒時(shí)間參數(shù)為deployment.spec.minReadySeconds,可根據(jù)你業(yè)務(wù)的實(shí)際情況確定。9.4本章總結(jié)眾所周知,穩(wěn)定性是一切能力的核心基礎(chǔ)。毫無疑問,通過了解Istio相關(guān)組件的功能穩(wěn)定性、可能的請(qǐng)求錯(cuò)誤排查情況以及如何使用SDS動(dòng)態(tài)管理證書來提升穩(wěn)定性,可以大大幫助Istio用戶在實(shí)際的環(huán)境中打好穩(wěn)定的基石。而作為Istio最核心的功能之一,流量管理是筆者在日常工作中遇到問題最多的地方,本章節(jié)也重點(diǎn)闡述了Istio流量管理相關(guān)的運(yùn)維及問題排查指南,以供讀者在遇到問題時(shí)參考調(diào)試。第10章Istio定制與擴(kuò)展本章屬于Istio的高級(jí)功能之一,目的是為了針對(duì)現(xiàn)有的Istio進(jìn)行定制與擴(kuò)展。首先重點(diǎn)介紹如何擴(kuò)展Mixer適配器,通過適配器將Mixer與不同的后端基礎(chǔ)設(shè)施集成。除了介紹適配器類型和適配器生命周期之外,還將介紹創(chuàng)建簡(jiǎn)單gRPC適配器的分步說明。之后從多個(gè)角度闡述Istio的定制與擴(kuò)展功能,包括IstioCNI插件擴(kuò)展,從Kubernetes擴(kuò)展到虛擬機(jī)的網(wǎng)格擴(kuò)展,如何擴(kuò)展Envoy過濾器以及如何集成外部Zipkin兼容服務(wù)。10.1Mixer適配器擴(kuò)展Mixer在應(yīng)用程序代碼和后端基礎(chǔ)設(shè)施(如配額系統(tǒng)、訪問控制系統(tǒng)、日志記錄等)之間提供Istio的通用中介層。它是一個(gè)屬性處理引擎,它使用運(yùn)維者提供的配置將來自代理的請(qǐng)求屬性進(jìn)行處理,將其映射到一系列的后端系統(tǒng)調(diào)用中。適配器使Mixer能夠公開單個(gè)一致的API,而與使用的后端基礎(chǔ)設(shè)施無關(guān)。在運(yùn)行時(shí)使用的確切適配器集是通過運(yùn)維人員配置確定的,并且可以輕松擴(kuò)展到目標(biāo)新的或自定義后端基礎(chǔ)設(shè)施。圖10-1為Mixer架構(gòu)框圖。圖10-1Mixer架構(gòu)Mixer使用模板將其傳入屬性構(gòu)建為適用于適配器的形式。模板描述了處理請(qǐng)求時(shí)分配給適配器的數(shù)據(jù)形式以及適配器必須實(shí)現(xiàn)接收此數(shù)據(jù)的gRPC服務(wù)接口。采用Istio的操作符可控制如何構(gòu)造此模板并將其分派給適配器。Mixer提供了一套開箱即用的默認(rèn)模板。我們強(qiáng)烈建議你在實(shí)現(xiàn)適配器時(shí)使用Mixer的默認(rèn)模板。如果你有特定需求,你還可以創(chuàng)建自己的模板以及適配器,以使用相關(guān)數(shù)據(jù)。Mixer默認(rèn)包含一些內(nèi)置樣本gRPC適配器,但用戶可能需要實(shí)現(xiàn)自己的Mixer才能讓Mixer將數(shù)據(jù)發(fā)送到其選擇的后端。模板開發(fā)人員、適配器開發(fā)人員和運(yùn)維人員的角色可以概括為:·模板開發(fā)人員定義了一個(gè)模板,該模板描述了Mixer調(diào)度到適配器的數(shù)據(jù),以及適配器必須實(shí)現(xiàn)的用于處理該數(shù)據(jù)的接口。Mixer中支持的模板集確定了運(yùn)維人員可以配置Mixer以創(chuàng)建和分發(fā)到適配器的各種類型的數(shù)據(jù)。·適配器開發(fā)人員根據(jù)適配器必須提供的功能選擇想要支持的模板。適配器開發(fā)人員的角色是實(shí)現(xiàn)所需的一組特定于模板的接口,以處理Mixer在運(yùn)行時(shí)調(diào)度的數(shù)據(jù)?!み\(yùn)維人員定義應(yīng)收集哪些數(shù)據(jù)(實(shí)例)、可以發(fā)送的數(shù)據(jù)(處理程序)以及何時(shí)發(fā)送(規(guī)則)。1.模板概述要了解適配器如何接收和處理特定于模板的實(shí)例,本節(jié)首先提供有關(guān)適配器開發(fā)相關(guān)模板的各種工件的詳細(xì)信息。正如我們?cè)谏弦还?jié)中看到的,Mixer的構(gòu)建支持一組模板,每個(gè)模板定義一種數(shù)據(jù),在處理請(qǐng)求時(shí)Mixer調(diào)度到適配器,并定義適配器使用該數(shù)據(jù)的接口。圖10-2顯示了模板的各種組件。圖10-2模板中的各種組件2.模板原型文件使用帶有名為的消息的proto文件定義模板'Template'。Template是一個(gè)簡(jiǎn)單的原型消息,沒有相關(guān)的代碼。適配器使用的所有Go工件都是從模板protos自動(dòng)生成的。每個(gè)模板還有兩個(gè)與之關(guān)聯(lián)的附加屬性:·名稱:每個(gè)模板都有唯一的名稱。適配器代碼使用模板的名稱向Mixer注冊(cè),它希望使用與特定模板關(guān)聯(lián)的實(shí)例對(duì)象。模板名稱也在操作符配置中用于向?qū)傩杂成涮峁┨囟ㄓ谀0宓淖侄?,用于?chuàng)建實(shí)例對(duì)象?!つ0孱愋停好總€(gè)模板都有一個(gè)特定的template_variety,可以是檢查(Check)、報(bào)告(Report)、配額(Quota)或?qū)傩陨善鳎ˋttributeGenerator)。模板及其種類決定了適配器必須實(shí)現(xiàn)的方法的簽名,以便使用關(guān)聯(lián)的實(shí)例。該template_variety也決定在其核心調(diào)音臺(tái)的行為,在instances對(duì)模板應(yīng)創(chuàng)建并分發(fā)到適配器。例如:·僅在Mixer的檢查API調(diào)用期間創(chuàng)建和分派檢查模板變量實(shí)例?!H在Mixer的報(bào)告API調(diào)用期間創(chuàng)建和分派報(bào)表模板變量實(shí)例?!ぴ诓樵兣漕~分配時(shí),僅在Mixer的檢查API調(diào)用期間創(chuàng)建和分派配額模板變量實(shí)例?!?chuàng)建屬性生成器模板變體實(shí)例并將其分派給適配器以進(jìn)行檢查、報(bào)告MixerAPI調(diào)用。這些模板的處理發(fā)生在補(bǔ)充屬性生成階段,該階段在處理任何其他種類的模板之前發(fā)生。處理屬性生成器模板的適配器稱為屬性生成適配器。這些適配器負(fù)責(zé)生成由模板決定的輸出數(shù)據(jù),運(yùn)維人員可以使用這些數(shù)據(jù)來創(chuàng)建新屬性。這些新屬性與請(qǐng)求中的屬性組合在一起,形成操作的總屬性集。因此,運(yùn)維人員現(xiàn)在可以使用這些新屬性來配置其他檢查、報(bào)告和配額種類模板的實(shí)例。3.生成Go代碼處理單個(gè)模板以生成五個(gè)Go工件:·InstanceMsg結(jié)構(gòu):它定義在請(qǐng)求時(shí)傳遞給適配器的數(shù)據(jù)。Mixer實(shí)例根據(jù)請(qǐng)求屬性和運(yùn)維人員配置構(gòu)造該類型的對(duì)象?!utputMsg結(jié)構(gòu)(僅適用于ATTRIBUTE_GENERATOR模板):這定義了在屬性生成階段(在調(diào)用其他檢查、報(bào)告、配額處理適配器之前)適配器返回的數(shù)據(jù)。基于操作符配置,Mixer使用該OutputMsg對(duì)象構(gòu)造新屬性?!ぬ幚沓绦蚍?wù):定義了Mixer用于InstanceMsg在請(qǐng)求時(shí)將創(chuàng)建的對(duì)象分派給適配器的gRPC服務(wù)RPC接口。適配器必須為它們支持的所有模板實(shí)現(xiàn)處理程序服務(wù)。·類型結(jié)構(gòu):如果InstanceMsg是dynamic(istio.policy.v1beta1.Value)中字段的數(shù)據(jù)類型,則在請(qǐng)求時(shí)間內(nèi)由運(yùn)維人員提供的配置來確定保留值的數(shù)據(jù)類型。類型結(jié)構(gòu)使用ValueType枚舉表示動(dòng)態(tài)字段的數(shù)據(jù)類型,該類型在Go數(shù)據(jù)類型與其枚舉值之間具有1:1映射。10.2實(shí)現(xiàn)適配器在開始之前,確定已經(jīng)安裝了Docker、Kubernetes和Go語言環(huán)境,并設(shè)置GOPATH環(huán)境變量。下載Mixer代碼倉庫的本地副本,命令如下:mkdir-p$GOPATH/src/istio.io/&&\

cd$GOPATH/src/istio.io/&&\

gitclone/istio/istio

從\h/google/protobuf/releases安裝protoc(版本3.5.1或更高版本)并將其添加到環(huán)境變量PATH中。將MIXER_REPO變量設(shè)置為Mixer代碼存儲(chǔ)庫在本地計(jì)算機(jī)上的路徑。另外,設(shè)置環(huán)境變量$ISTIO,使之指向$GOPATH/src/istio.io。設(shè)置如下環(huán)境變量:exportMIXER_REPO=$GOPATH/src/istio.io/istio/mixer

exportISTIO=$GOPATH/src/istio.io

運(yùn)行如下命令,如果成功運(yùn)行則表明環(huán)境準(zhǔn)備通過:pushd$ISTIO/istio&&makemixs

接下來,開發(fā)一個(gè)簡(jiǎn)單的定制化的OutofProcess(進(jìn)程外)授權(quán)適配器,我們將其用于處理授權(quán)檢查。Istio中已經(jīng)自帶了基本的身份驗(yàn)證和授權(quán)能力,但用戶可以將自定義授權(quán)作為一種定制化的策略適配器直接注入Mixer中。實(shí)現(xiàn)的基本思路是設(shè)置一個(gè)獨(dú)立于Mixer的外部服務(wù),該服務(wù)接受來自入站請(qǐng)求的頭信息,然后做出是否允許請(qǐng)求通過或不通過的決定。此外,可以將定制的外部適配器作為單獨(dú)的Kubernetes服務(wù)運(yùn)行,也可以將其完全運(yùn)行在集群外部。對(duì)于任何一種情況,授權(quán)服務(wù)器都應(yīng)驗(yàn)證入站請(qǐng)求并保護(hù)其端點(diǎn)(此示例僅使用明文未加密的gRPC作為演示)。開發(fā)一個(gè)定制化的適配器包括以下幾個(gè)步驟:·步驟1:編寫基本適配器框架代碼·步驟2:編寫適配器配置·步驟3:鏈接適配器代碼與配置并添加業(yè)務(wù)邏輯·步驟4:編寫示例運(yùn)維配置·步驟5:?jiǎn)?dòng)Mixer并驗(yàn)證適配器步驟1:編寫基本適配器框架代碼創(chuàng)建mygrpcadapter目錄并導(dǎo)航到它,如下所示:cd$MIXER_REPO/adapter

mkdirmygrpcadapter

cdmygrpcadapter

創(chuàng)建名為mygrpcadapter.go的文件。在該文件中,將適配器定義為實(shí)現(xiàn)授權(quán)模板的服務(wù)接口的gRPC服務(wù)。到目前為止,代碼并沒有添加任何關(guān)于驗(yàn)證授權(quán)邏輯的詳細(xì)功能,它是在后面的步驟中完成的。文件的內(nèi)容如下所示:packagemygrpcadapter

import(

"context"

"fmt"

"net"

"/grpc"

"istio.io/api/mixer/adapter/model/v1beta1"

"istio.io/istio/mixer/template/authorization"

)

type(

//Serverisbasicserverinterface

Serverinterface{

Addr()string

Close()error

Run(shutdownchanerror)

}

//MyGrpcAdaptersupportsmetrictemplate.

MyGrpcAdapterstruct{

listenernet.Listener

server*grpc.Server

}

)

var_authorization.HandleAuthorizationServiceServer=&MyGrpcAdapter{}

func(s*MyGrpcAdapter)HandleAuthorization(ctxcontext.Context,r*authorization.

HandleAuthorizationRequest)(*v1beta1.CheckResult,error){

returnnil,nil

}

//Addrreturnsthelisteningaddressoftheserver

func(s*MyGrpcAdapter)Addr()string{

returns.listener.Addr().String()

}

//Runstartstheserverrun

func(s*MyGrpcAdapter)Run(shutdownchanerror){

shutdown<-s.server.Serve(s.listener)

}

//Closegracefullyshutsdowntheserver;usedfortesting

func(s*MyGrpcAdapter)Close()error{

ifs.server!=nil{

s.server.GracefulStop()

}

ifs.listener!=nil{

_=s.listener.Close()

}

returnnil

}

//NewMyGrpcAdaptercreatesanewIBPadapterthatlistensatprovidedport.

funcNewMyGrpcAdapter(addrstring)(Server,error){

ifaddr==""{

addr="0"

}

listener,err:=net.Listen("tcp",fmt.Sprintf(":%s",addr))

iferr!=nil{

returnnil,fmt.Errorf("unabletolistenonsocket:%v",err)

}

s:=&MyGrpcAdapter{

listener:listener,

}

fmt.Printf("listeningon\"%v\"\n",s.Addr())

s.server=grpc.NewServer()

authorization.RegisterHandleAuthorizationServiceServer(s.server,s)

returns,nil

}

為了確保上述代碼準(zhǔn)確無誤,通過以下命令構(gòu)建代碼:gobuild./...

現(xiàn)在我們有了一個(gè)適配器的基本框架,其中包含授權(quán)模板接口的空的實(shí)現(xiàn)。后面的步驟將添加此適配器的核心代碼。步驟2:編寫適配器配置由于此適配器只是對(duì)從Mixer接收的數(shù)據(jù)進(jìn)行校驗(yàn),因此適配器配置將該文件的路徑作為配置字段。在config目錄下創(chuàng)建配置proto文件,如下所示:mkdirconfig

touchto

使用以下內(nèi)容在config目錄中創(chuàng)建新的confto文件:syntax="proto3";

//configformygrpcadapter

packageadapter.mygrpcadapter.config;

import"gogoproto/to";

optiongo_package="config";

//configformygrpcadapter

messageParams{

//headernametocheckforcustomtoken

stringauth_key=1;

}

文件confto可以用來生成相應(yīng)的go文件以及包含適配器信息(配置描述符和名稱)的適配器資源。為此,請(qǐng)?jiān)谶m配器代碼中添加以下gogenerate注釋://nolint:lll

//Generatesthemygrpcadapteradapter'sresourceyaml.Itcontainstheadapter'sconfiguration,name,

//supportedtemplatenames(metricinthiscase),andwhetheritissessionorno-sessionbased.

//go:generate$GOPATH/src/istio.io/istio/bin/mixer_codegen.sh-amixer/adapter/mygrpcadapter/config/to-x"-s=false-nmygrpcadapter-tauthorization"

packagemygrpcadapter

import(

"context"

"fmt"

"net"

"/grpc"

"istio.io/api/mixer/adapter/model/v1beta1"

"istio.io/istio/mixer/template/authorization"

)

gogenerate過程需要拉取鏡像gcr.io/istio-testing/protoc:2018-06-12,由于各種原因不能正常拉取的話,可以將文件$ISTIO/istio/bin/protoc.sh中的代碼gen_img=gcr.io/istio-testing/protoc:2018-06-12替換為:gen_img=osswangxining/gcr.io-istio-testing-protoc:latest

為了確保上述代碼準(zhǔn)確無誤,通過以下命令構(gòu)建代碼:gogenerate./...

gobuild./...

第一次運(yùn)行應(yīng)該會(huì)出現(xiàn)如下類似的結(jié)果:Unabletofindimage'osswangxining/gcr.io-istio-testing-protoc:latest'locally

latest:Pullingfromosswangxining/gcr.io-istio-testing-protoc

ff3a5c916c92:Alreadyexists

dc6fb857355d:Pullingfslayer

f198fee4ce54:Pullingfslayer

faa0691ae748:Pullingfslayer

faa0691ae748:VerifyingChecksum

faa0691ae748:Downloadcomplete

dc6fb857355d:VerifyingChecksum

dc6fb857355d:Downloadcomplete

dc6fb857355d:Pullcomplete

f198fee4ce54:VerifyingChecksum

f198fee4ce54:Downloadcomplete

f198fee4ce54:Pullcomplete

faa0691ae748:Pullcomplete

Digest:sha256:1c492efce28b962c49bb3f2eedcece3c2ce0fd7f7e2752a7568d71f5cdeceec5

Status:Downloadednewerimageforosswangxining/gcr.io-istio-testing-p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論