參考
- Istio
- Istio 中文
- Istio 1.1 官方中文檔案
- Istio流量管理實作機制深度決議
1. 定義目標與規則
- istio 服務網格中對服務進行了進一步抽象:
- 可以使用 Pod 標簽對具體的服務行程進行分組;
- 可以定義服務的負載均衡策略;
- 可以為服務指定 TLS 要求;
- 可以為服務設定連接池大小,
- istio 中,同一服務不同組別的后端被稱為
子集(Subset),也經常被稱為服務版本, - 在 istio 中,建議為每個網格都設定明確的目標訪問規則,在通過 istio 流量控制之后,會選擇明確的子集,根據規則或在子集中規定的流量策略來進行訪問,這種規則被稱為
DestinationRule,樣例如下:
規則需要注意的地方如下:cat flaskapp-destinationrule.yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: flaskapp spec: host: flaskapp.default.svc.cluster.local trafficPolicy: loadBalancer: simple: LEAST_CONN subsets: - name: v1 labels: version: v1 trafficPolicy: loadBalancer: ROUND_ROBIN - name: v2 labels: version: v2- host: 必要欄位,代表1個
Service資源,或1個ServiceEntry定義的外部服務,- 建議:為防止不同命名空間服務重名,可以使用完全限定名,
- trafficPolicy: 流量策略,在
DestinationRule與Subset都可以定義,Subset中的級別更高, - subsets: 該欄位使用標簽選擇器定義不同的子集,
- host: 必要欄位,代表1個
2. 定義默認路由
2.1 定義默認路由
- 建議每個服務都創建1個默認路由,在沒有特定的路由規則時,使用默認路由規則訪問指定子集,一以此確保服務在默認情況下的行為穩定性,樣例如下:
cat flaskapp-default-vs.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: flaskapp spec: hosts: - flaskapp.default.svc.cluster.local http: - route: - destination: host: flaskapp.default.svc.cluster.local subset: v1 - VirtualService: istio 流量控制程序中的樞紐,負責對流量進行甄別與轉發,
- 針對主機名作業,但
hosts欄位是一個陣列內容,可以針對多個主機名進行作業, - 可以為多種協議的流量提供服務,如
http,tcp,tls等,
- 針對主機名作業,但
- 在
http的下一級,即具體的路由規則,- 支持多條路由,
2.2 驗證
# 應用目標規則與默認路由
kubectl apply -f flaskapp-destinationrule.yaml
kubectl apply -f flaskapp-default-vs.yaml
# 驗證,可同步觀察 kiali & Jaeger 等
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 100` ; do http --body http://flaskapp.default/env/version ; done
2.3 總結
在 istio 中部署1個業務應用時,建議:
- 使用
app標簽表明應用身份; - 使用
version標簽表明應用版本; - 創建目標規則;
- 創建默認路由規則,默認路由得配置清單應該成為服務網格環境下的必要部署內容,
3. 流量拆分與遷移
3.1 權重
cat flaskapp-default-vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp
spec:
hosts:
- flaskapp.default.svc.cluster.local
http:
- route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v1
weight: 70
- destination:
host: flaskapp.default.svc.cluster.local
subset: v2
weight: 30
# 應用
kubectl apply -f flaskapp-default-vs.yaml
# 驗證,可同步觀察 kiali & Jaeger 等
# 因是權重的原因,驗證時樣本量需要大一些
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 100` ; do http --body http://flaskapp.default/env/version ; done | awk -F "v1" '{print NF-1}'
注意點:
- 流量分配是有權重的,且權重總和必須是
100; - 如果不顯示宣告權重,則默認值是
100,
3.2 獲取 istio 物件
kubectl get,kubectl api-resources列出當前集群支持的所有物件型別- Kiali --> Istio Config
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/31209.html
標籤:其他
下一篇:人工神經網路實踐
