BookInfo部署了三個版本的reviews服務,因此需要設置VirtualService。否則當多次訪問Service時,會發現請求到不同版本的reviews Service。出現這個現象的原因是沒有設定VirtualService時,Istio會將請求路由隨機分配到不同版本的reviews Service。
在使用Istio控制Bookinfo VirtualService時,你需要設定好Destination Rule。
# 不需要TLS
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
# 需要TLS
kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml
kubectl get destinationrules
NAME HOST AGE
productpage productpage 19s
reviews reviews 19s
ratings ratings 19s
details details 19s
安裝第一個版本的VirtualService
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
kubectl get virtualservices
NAME GATEWAYS HOSTS AGE
bookinfo [bookinfo-gateway] [*] 2d8h
productpage [productpage] 43s
reviews [reviews] 43s
ratings [ratings] 43s
details [details] 43s
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
由於destination rule是通過非同步方式同步到Envoy Proxy的,需要過一段時間後destination rule才會同步到所有pod上。因此需要等幾秒鐘後再嘗試訪問。
因此在訪問 http://localhost:31380/productpage
可以看到 Bookinfo 的 productpage 頁面,顯示的內容不包含帶星的評價信息,這是因為 reviews:v1 服務不會訪問ratings Service,被限定只能訪問review Service v1。
上面我們將現在所有的請求100%設定到reviews Service v1,再來我們設定一條規則,規則基於請求的 header(例如一個用戶cookie)選擇性地將特定的流量路由到了 reviews Service v2。
通過運行如下命令,把來自測試用戶”jason”的請求路由到 reviews:v2,以啟用ratings服務。
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
#v2 begin
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
#v2 end
#v1 begin
- route:
- destination:
host: reviews
subset: v1
#v1 end
在瀏覽器中打開BookInfo應用程序的URL: http://localhost:31380/productpage
以”jason”用戶登錄 productpage 頁面,您可以在每條評價後面看到星級信息。
這裏登錄用戶名為 jason ,密碼隨便輸入即可
我們還可以利用權重或者是前面提到的header去分配現在,訪問的服務
#重新設定VirtualService 將100%流量導到v1
kubectl replace -f samples/bookinfo/networking/virtual-service-all-v1.yaml
#新增設定VirtualService 將50%流量導到v3
kubectl replace -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
在瀏覽器中多次刷新productpage頁面,大約有50%的幾率看到reviews Service v3的畫面。
注意這種方式和Kubernetes的Rolling Update完全不同的。Kubernets使用了scaling來對Pod進行管理。而通過Istio,兩個版本的reviews服務可以獨立地進行scalling,並不會影響這兩個版本Service之間的流量分發。
如果覺得 reviews:v3 的服務已經穩定,你可以通過以下命令,將 virtual service 100%的流量導到 reviews:v3,從而實現一個藍綠部署的功能。
kubectl replace -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v3
今天先講最簡單的Kubernetes Pod and Kubernetes Service,如何跟Istio VirtualService and Istio DestinationRules進行互動,雖然Istio提供這些非常方便的功能,明天我們再介紹更為進階的