Istio流量管理实践之(3): 基于Istio实现流量对比分析
流量鏡像
流量鏡像,也稱為影子流量,流量鏡像提供一種盡可能低的風(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:
版本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:
對(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
version: v1
labels: -
name: v2
version: v2
labels:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mirrorservice-sample
spec:
hosts:
http:
-
route:
-
destination:
host: mirrorservice-sample subset: v1weight: 100
-
搭建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:
spec:
ports:
- name: http-proxy
port: 8880 - name: http-admin
port: 8881 - name: http-console
port: 8888
selector:
app: httpbin-diffyapiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
name: httpbin-diffy-v2
spec:
replicas: 1
selector:
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:
spec:
ports:
- name: http
port: 8080
selector:
app: httpbin version: v1apiVersion: v1
kind: Service
metadata:
name: httpbin-candidate
labels:
spec:
ports:
- name: http
port: 8080
selector:
app: httpbin version: v2apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpbin-v1
spec:
replicas: 1
template:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpbin-v2
spec:
replicas: 1
template:
發(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:
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之在函数中使用列表作为默认参
- 下一篇: 我的VS CODE