新聞中心
本篇文章為大家展示了基于Istio實(shí)現(xiàn)流量對(duì)比分析是怎樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出莒縣免費(fèi)做網(wǎng)站回饋大家。
流量鏡像
流量鏡像,也稱為影子流量,流量鏡像提供一種盡可能低的風(fēng)險(xiǎn)為生產(chǎn)帶來變化的強(qiáng)大功能。鏡像會(huì)將實(shí)時(shí)流量的副本發(fā)送到鏡像服務(wù)。鏡像流量發(fā)生在主服務(wù)的關(guān)鍵請(qǐng)求路徑之外。
在非生產(chǎn)或者測(cè)試環(huán)境中,嘗試訪問一個(gè)服務(wù)所有可能的測(cè)試用例組合是個(gè)非常不現(xiàn)實(shí)的任務(wù)。 在某些情況下,編寫這些用例的所有工作也可能與實(shí)際生產(chǎn)所需的用例不匹配。在理想情況下,可以使用實(shí)時(shí)的生產(chǎn)用例和流量來幫助完善在測(cè)試環(huán)境中錯(cuò)過的功能區(qū)域。
一旦我們能夠可靠地鏡像流量,就可以開始做一些有價(jià)值的事情,例如通過請(qǐng)求流量對(duì)比工具Diffy,可以將引入測(cè)試集群的流量與生產(chǎn)集群中的預(yù)期行為進(jìn)行比較。例如,我們可能想比較請(qǐng)求結(jié)果與預(yù)期結(jié)果間的偏差,或是API協(xié)議中的數(shù)據(jù)損壞情況,以便更好地兼容。
除此之外,需要注意:
當(dāng)流量鏡像到不同的服務(wù)時(shí),會(huì)發(fā)生在請(qǐng)求的關(guān)鍵路徑之外;
忽略對(duì)任何鏡像流量的響應(yīng); 流量被視為“即發(fā)即忘”;
流量對(duì)比
此處,插入一個(gè)代理就可以負(fù)責(zé)此類流量的協(xié)調(diào),并對(duì)其進(jìn)行有趣的比較。Diffy就是一款這樣的代理工具。Diffy啟動(dòng)一個(gè)代理服務(wù)(例如監(jiān)聽端口8880),再根據(jù)用戶設(shè)置的primary、secondary兩個(gè)舊服務(wù)地址(primary和secondary代碼完全相同,目的是為了減少噪音干擾)、candidate新服務(wù)地址。
它還能夠檢測(cè)結(jié)果中的噪音,并通過先調(diào)用兩個(gè)實(shí)時(shí)服務(wù)的實(shí)例來忽略它們(例如時(shí)間戳,單調(diào)遞增計(jì)數(shù)器等提示),總結(jié)來說就是檢測(cè),然后在測(cè)試服務(wù)中忽略掉這部分。
Diffy還提供了一個(gè)不錯(cuò)的頁(yè)面可以用來查看調(diào)用結(jié)果、對(duì)比情況、和基于某些特征的過濾。它還有一個(gè)很好的管理控制臺(tái),可以查看有關(guān)調(diào)用比較結(jié)果的功能指標(biāo)(metrics)和統(tǒng)計(jì)數(shù)據(jù)(statistics)。
創(chuàng)建用于Istio流量鏡像的服務(wù)
在此任務(wù)中,將首先強(qiáng)制所有流量到 v1 版本的服務(wù)。然后,將使用規(guī)則將一部分流量鏡像到 v2版本。
首先部署兩個(gè)版本的示例服務(wù)。
版本1的部署使用了Docker鏡像httpbin,提供常見的http請(qǐng)求訪問:
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mirrorservice-sample-v1 spec: replicas: 1 template: metadata: labels: app: mirrorservice-sample version: v1 spec: containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: mirrorservice-sample command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:44134", "httpbin:app"] ports: - containerPort: 44134
版本2的部署使用了自定義的Docker鏡像,對(duì)應(yīng)的Dockerfile如下:
FROM nginx:latest COPY default.conf /etc/nginx/conf.d/ EXPOSE 80
所需的nginx 配置文件:
server { listen 44134; server_name localhost; location / { proxy_pass http://httpbin-diffy.diffy:8880/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
版本2的部署作為Istio的流量鏡像目標(biāo),在接收到流量之后會(huì)轉(zhuǎn)發(fā)到Diffy的代理中。當(dāng)前沒有直接將Diffy代理作為Isito流量鏡像目標(biāo),原因是Diffy代理與Envoy代理目前本身有沖突,無法正常流量轉(zhuǎn)發(fā),因此需要此部署中轉(zhuǎn)一下。
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: mirrorservice-sample-v2 spec: replicas: 1 template: metadata: labels: app: mirrorservice-sample version: v2 spec: containers: - name: mirrorservice-sample image: registry.cn-beijing.aliyuncs.com/wangxining/mirrorservice:0.1 imagePullPolicy: Always ports: - containerPort: 44134
對(duì)應(yīng)的Kubernetes service:
apiVersion: v1 kind: Service metadata: name: mirrorservice-sample spec: type: ClusterIP ports: - name: http port: 44134 selector: app: mirrorservice-sample
創(chuàng)建流量鏡像的Istio策略
默認(rèn)情況下,Kubernetes 在服務(wù)的兩個(gè)版本之間進(jìn)行負(fù)載均衡。創(chuàng)建如下流量鏡像規(guī)則將 100% 的流量發(fā)送到 v1, 同時(shí)指定流量鏡像到v2。當(dāng)流量被鏡像時(shí),請(qǐng)求將通過其主機(jī)/授權(quán)報(bào)頭發(fā)送到鏡像服務(wù)附上 -shadow 。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: mirrorservice-sample spec: host: mirrorservice-sample subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: mirrorservice-sample spec: hosts: - mirrorservice-sample http: - route: - destination: host: mirrorservice-sample subset: v1 weight: 100 #- destination: # host: mirrorservice-sample # subset: v2 # weight: 0 mirror: host: mirrorservice-sample subset: v2
搭建Diffy用于請(qǐng)求流量對(duì)比
Diffy可以作為代理,截取請(qǐng)求并發(fā)送至所有運(yùn)行的服務(wù)實(shí)例,通過對(duì)比響應(yīng)結(jié)果來發(fā)現(xiàn)每次迭代代碼中可能存在的問題。其中,Diffy上運(yùn)行了三類代碼實(shí)例:
線上穩(wěn)定版本:一個(gè)運(yùn)行線上穩(wěn)定版本代碼的節(jié)點(diǎn)
線上穩(wěn)定版本備份:同樣運(yùn)行了線上的穩(wěn)定版本,用于消除噪音
測(cè)試版本:待上線的測(cè)試版本,用于和線上環(huán)境代碼進(jìn)行對(duì)比
在實(shí)際Diffy測(cè)試中,會(huì)發(fā)現(xiàn)大部分的接口都會(huì)有一定差異,原因是這些響應(yīng)中存在了噪音,噪音可能包括:
server響應(yīng)中生成的時(shí)間戳
隨機(jī)生成的數(shù)字
系統(tǒng)服務(wù)間的有條件競(jìng)爭(zhēng)
Diffy能夠通過一定的方式,清除這類噪音,保證分析結(jié)果不被影響。
創(chuàng)建Diffy及示例服務(wù)
通過以下YAML創(chuàng)建Diffy服務(wù):
apiVersion: v1 kind: Service metadata: name: httpbin-diffy labels: app: httpbin-diffy spec: ports: - name: http-proxy port: 8880 - name: http-admin port: 8881 - name: http-console port: 8888 selector: app: httpbin-diffy --- apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: httpbin-diffy version: v2 name: httpbin-diffy-v2 spec: replicas: 1 selector: matchLabels: app: httpbin-diffy version: v2 template: metadata: labels: app: httpbin-diffy version: v2 spec: containers: - image: lordofthejars/diffy:1.0 imagePullPolicy: IfNotPresent livenessProbe: exec: command: - curl - localhost:8888 initialDelaySeconds: 10 periodSeconds: 60 timeoutSeconds: 1 name: httpbin-diffy args: ["-candidate=httpbin-candidate:8080", "-master.primary=httpbin-master:8080", "-master.secondary=httpbin-master:8080", "-service.protocol=http", "-serviceName=httpbin", "-proxy.port=:8880", "-admin.port=:8881", "-http.port=:8888", "-rootUrl='localhost:8888'"] ports: - containerPort: 8888 name: http-console protocol: TCP - containerPort: 8880 name: http-proxy protocol: TCP - containerPort: 8881 name: http-admin protocol: TCP readinessProbe: exec: command: - curl - localhost:8888 initialDelaySeconds: 10 periodSeconds: 60 timeoutSeconds: 1 securityContext: privileged: false
通過以下YAML創(chuàng)建示例所用的primary、secondary(當(dāng)前示例中與primary相同)與candidate服務(wù):
apiVersion: v1 kind: Service metadata: name: httpbin-master labels: app: httpbin-master spec: ports: - name: http port: 8080 selector: app: httpbin version: v1 --- apiVersion: v1 kind: Service metadata: name: httpbin-candidate labels: app: httpbin-candidate spec: ports: - name: http port: 8080 selector: app: httpbin version: v2 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpbin-v1 spec: replicas: 1 template: metadata: labels: app: httpbin version: v1 spec: containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:8080", "httpbin:app"] ports: - containerPort: 8080 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpbin-v2 spec: replicas: 1 template: metadata: labels: app: httpbin version: v2 spec: containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin command: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:8080", "httpbin:app"] ports: - containerPort: 8080
發(fā)送流量進(jìn)行鏡像驗(yàn)證
啟動(dòng) sleep 服務(wù),這樣就可以使用 curl 來提供負(fù)載:
cat <進(jìn)入到SLEEP_POD, 具體POD名稱根據(jù)實(shí)際賦值。
kubectl exec -it $SLEEP_POD -c sleep sh發(fā)送流量:
curl -v http://mirrorservice-sample:44134/headers可以查看 v1的訪問日志記錄,如下所示創(chuàng)建的請(qǐng)求100%指向了v1。
與此同時(shí),查看Diffy的Web界面,可以看到創(chuàng)建的請(qǐng)求也被鏡像到Diffy Proxy:
Diffy能夠通過一定的方式,清除這類噪音,保證分析結(jié)果不被影響。
結(jié)論
流量鏡像提供一種盡可能低的風(fēng)險(xiǎn)為生產(chǎn)帶來變化的強(qiáng)大功能。鏡像會(huì)將實(shí)時(shí)流量的副本發(fā)送到鏡像服務(wù),鏡像流量發(fā)生在主服務(wù)的關(guān)鍵請(qǐng)求路徑之外。一旦我們能夠可靠地鏡像流量,就可以開始做一些有價(jià)值的事情,例如通過請(qǐng)求流量對(duì)比工具Diffy,可以將引入測(cè)試集群的流量與生產(chǎn)集群中的預(yù)期行為進(jìn)行比較。
支持流量鏡像只是 Istio 的眾多功能之一,它將使基于大型微服務(wù)的應(yīng)用程序的生產(chǎn)部署與管理變得更加簡(jiǎn)單。歡迎大家使用阿里云上的容器服務(wù),快速搭建微服務(wù)的開放治理平臺(tái)Istio,比較簡(jiǎn)單地集成到自己項(xiàng)目的微服務(wù)開發(fā)中。
上述內(nèi)容就是基于Istio實(shí)現(xiàn)流量對(duì)比分析是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標(biāo)題名稱:基于Istio實(shí)現(xiàn)流量對(duì)比分析是怎樣的
轉(zhuǎn)載來于:http://www.dlmjj.cn/article/pesccc.html