日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Istio流量管理实践之(3): 基于Istio实现流量对比分析

發(fā)布時(shí)間:2024/4/13 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Istio流量管理实践之(3): 基于Istio实现流量对比分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

流量鏡像
流量鏡像,也稱為影子流量,流量鏡像提供一種盡可能低的風(fēng)險(xiǎn)為生產(chǎn)帶來(lái)變化的強(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)用例和流量來(lái)幫助完善在測(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í)例來(lái)忽略它們(例如時(shí)間戳,單調(diào)遞增計(jì)數(shù)器等提示),總結(jié)來(lái)說(shuō)就是檢測(cè),然后在測(cè)試服務(wù)中忽略掉這部分。

Diffy還提供了一個(gè)不錯(cuò)的頁(yè)面可以用來(lái)查看調(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-sampleversion: v1 spec:containers:- image: docker.io/kennethreitz/httpbinimagePullPolicy: IfNotPresentname: mirrorservice-samplecommand: ["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代理目前本身有沖突,無(wú)法正常流量轉(zhuǎn)發(fā),因此需要此部署中轉(zhuǎn)一下。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mirrorservice-sample-v2
spec:
replicas: 1
template:

metadata:labels:app: mirrorservice-sampleversion: v2 spec:containers:- name: mirrorservice-sampleimage: registry.cn-beijing.aliyuncs.com/wangxining/mirrorservice:0.1imagePullPolicy: Alwaysports:- 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-samplesubset: v2

搭建Diffy用于請(qǐng)求流量對(duì)比
Diffy可以作為代理,截取請(qǐng)求并發(fā)送至所有運(yùn)行的服務(wù)實(shí)例,通過對(duì)比響應(yīng)結(jié)果來(lái)發(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-diffyversion: v2

template:

metadata:labels:app: httpbin-diffyversion: v2 spec:containers:- image: lordofthejars/diffy:1.0imagePullPolicy: IfNotPresentlivenessProbe:exec:command:- curl- localhost:8888initialDelaySeconds: 10periodSeconds: 60timeoutSeconds: 1name: httpbin-diffyargs: ["-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: 8888name: http-consoleprotocol: TCP- containerPort: 8880name: http-proxyprotocol: TCP- containerPort: 8881name: http-adminprotocol: TCPreadinessProbe:exec:command:- curl- localhost:8888initialDelaySeconds: 10periodSeconds: 60timeoutSeconds: 1securityContext: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: httpbinversion: v1 spec:containers:- image: docker.io/kennethreitz/httpbinimagePullPolicy: IfNotPresentname: httpbincommand: ["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: httpbinversion: v2 spec:containers:- image: docker.io/kennethreitz/httpbinimagePullPolicy: IfNotPresentname: httpbincommand: ["gunicorn", "--access-logfile", "-", "-b", "0.0.0.0:8080", "httpbin:app"]ports:- containerPort: 8080

發(fā)送流量進(jìn)行鏡像驗(yàn)證
啟動(dòng) sleep 服務(wù),這樣就可以使用 curl 來(lái)提供負(fù)載:

cat <<EOF | istioctl kube-inject -f - | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
template:

metadata:labels:app: sleep spec:containers:- name: sleepimage: tutum/curlcommand: ["/bin/sleep","infinity"]imagePullPolicy: IfNotPresent

EOF
進(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)帶來(lái)變化的強(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ā)中。

總結(jié)

以上是生活随笔為你收集整理的Istio流量管理实践之(3): 基于Istio实现流量对比分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。