參考
- Istio
- Istio 中文
- Istio 1.1 官方中文檔案
- Istio流量管理實作機制深度決議
4. 金絲雀部署
金絲雀部署:在發布新版本時,部署的新版本并不對外開放,而選擇一小部分用戶為測驗目標,這部分用戶對服務的訪問會指向特定的版本,通過對這些金絲雀用戶的使用情況的觀察,來確定新版本服務的發布效果,在確定結果之前,所有其他用戶都繼續使用原有版本,
4.1 金絲雀部署
- yaml
cat flaskapp-default-vs-canary.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp
spec:
hosts:
- flaskapp.default.svc.cluster.local
http:
- match:
- headers:
lab:
exact: canary
route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v2
- route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v1
- 注意點:
- match 欄位提供來豐富的匹配功能,匹配范圍不僅包括
http header, 還包含uri,scheme,method,authority,埠,來源標簽及gateway等; - exact 代表完全匹配,另有 prefix 代表前綴, regex 代表正則運算式的匹配方式
- match 欄位提供來豐富的匹配功能,匹配范圍不僅包括
4.2 驗證
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp.default/env/version lab:canary ; done
5. 根據來源服務進行路由
- yaml
cat flaskapp-default-vs-src.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp
spec:
hosts:
- flaskapp.default.svc.cluster.local
http:
- match:
- sourceLabels:
app: sleep
version: v1
route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v1
- route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v2
# 應用
kubectl apply -f flaskapp-default-vs-src.yaml
- 測驗
# 驗證
# sleep v1
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath='{.items..metadata.name}') /bin/bash
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp.default/env/version; done
# sleep v2
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v2 -o jsonpath='{.items..metadata.name}') /bin/bash
bash-4.4# for i in `seq 10` ; do http --body http://flaskapp.default/env/version; done
6. 對URI進行重定向
6.1 redirect
- yaml
cat flaskapp-default-vs-uri.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp
spec:
hosts:
- flaskapp.default.svc.cluster.local
http:
- match:
- sourceLabels:
app: sleep
version: v1
uri:
exact: "/env/HOSTNAME"
redirect:
uri: "/env/version"
- route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v2
# 應用
kubectl apply -f flaskapp-default-vs-uri.yaml
- 測驗
# 驗證 sleep v2,正常回傳
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v2 -o jsonpath='{.items..metadata.name}') -- \
http http://flaskapp.default/env/HOSTNAME
HTTP/1.1 200 OK
content-length: 28
content-type: text/html; charset=utf-8
date: Wed, 12 Jun 2019 08:05:25 GMT
server: envoy
x-envoy-upstream-service-time: 1
flaskapp-v2-59b5b6cb94-jdfp4
# 驗證 sleep v1
# 回傳 "301" 重定向代碼
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath='{.items..metadata.name}') -- \
http http://flaskapp.default/env/HOSTNAME
HTTP/1.1 301 Moved Permanently
content-length: 0
date: Wed, 12 Jun 2019 08:06:17 GMT
location: http://flaskapp.default/ev/version
server: envoy
# "--follow" 跟隨重定向指令,重驗證
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath='{.items..metadata.name}') -- \
http --follow http://flaskapp.default/env/HOSTNAME
HTTP/1.1 200 OK
content-length: 2
content-type: text/html; charset=utf-8
date: Wed, 12 Jun 2019 08:09:26 GMT
server: envoy
x-envoy-upstream-service-time: 2
v2
- 注意點:
redirect指令會把 URI 整體替換,靈活性不高;301指令無法支持Post方法, istio 提供了rewrite方式來提供這種在呼叫前進行 URI 重寫的支持,
6.2 rewrite
- yaml
cat httpbin-default-vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- httpbin.default.svc.cluster.local
http:
- match:
- uri:
exact: "/get"
rewrite:
uri: "/post"
route:
- destination:
host: httpbin.default.svc.cluster.local
- route:
- destination:
host: httpbin.default.svc.cluster.local
- 測驗
# 訪問測驗
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v2 -o jsonpath='{.items..metadata.name}') -- http -f POST http://httpbin:8000/get data=https://www.cnblogs.com/netonline/p/nothing
# 回傳資訊
HTTP/1.1 405 Method Not Allowed
access-control-allow-credentials: true
access-control-allow-origin: *
allow: GET, OPTIONS, HEAD
content-length: 178
content-type: text/html
date: Wed, 12 Jun 2019 12:39:28 GMT
server: envoy
x-envoy-upstream-service-time: 5
405 Method Not Allowed
Method Not Allowed
The method is not allowed for the requested URL.
- 注意點:
rewrite方法與redirect方法的不同之處在于: 在rewrite方法的match欄位必須包含對目標的定義;rewrite方法與redirect方法不能共存,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2244.html
標籤:其他
