iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
1
DevOps

Kubernetes and Istio 三十天系列 第 21

[Day21] Istio Example BookInfo - Traffic Management I

  • 分享至 

  • xImage
  •  

Istio Example BookInfo Architecture

BookInfo-Architecture

Install Destination Rule

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

Verifying DestinationRules

kubectl get destinationrules

NAME          HOST          AGE
productpage   productpage   19s
reviews       reviews       19s
ratings       ratings       19s
details       details       19s

Install VirtualService

安裝第一個版本的VirtualService

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

Verifying VirtualService

kubectl get virtualservices

NAME          GATEWAYS             HOSTS           AGE
bookinfo      [bookinfo-gateway]   [*]             2d8h
productpage                        [productpage]   43s
reviews                            [reviews]       43s
ratings                            [ratings]       43s
details                            [details]       43s

VirtualService

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 v1

可以看到 Bookinfo 的 productpage 頁面,顯示的內容不包含帶星的評價信息,這是因為 reviews:v1 服務不會訪問ratings Service,被限定只能訪問review Service v1。

Add reviews Service v2

上面我們將現在所有的請求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 ,密碼隨便輸入即可

Blue-Green Deployment

我們還可以利用權重或者是前面提到的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提供這些非常方便的功能,明天我們再介紹更為進階的

圖片來源

Istio BookInfo


上一篇
[Day20] Istio Example BookInfo - Gateway
下一篇
[Day22] Istio Example BookInfo - Traffic Management II
系列文
Kubernetes and Istio 三十天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言