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