iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0

前言

上一篇我們學到如何使用 Istio 輕鬆完成 Canary Deployment,本篇會介紹另一個部署策略 A/B Testing,並且同樣使用 Istio 來實現看看。

什麼是 A/B 測試 (A/B Testing)

應該有聽聞過 Facebook 偶而看到的 GUI 跟平常不一樣,或是 Youtube 播放連續 10 多個廣告的情況,這些應用程式其實就是在做 A/B Testing。使用 A/B Testing 時會先將不同版本的應用程式先部署到正式環境,接著透過特定條件 (Ex: 瀏覽器、Cookie、帳號、語言) 挑選出特定使用者,將他們的流量導入到不同版本,並蒐集在不同版本下的使用數據,像是使用者瀏覽的時間是否延長、點擊次數是否變多,透過 A/B Testing 我們就能搜集不同版本下的使用者行為,藉此決定出更好的商業策略。

https://ithelp.ithome.com.tw/upload/images/20220922/20139235de3Iv1Vevc.png

抽樣特定使用者,將他們的應用程式流量導入不同的版本,並觀察其行為,藉以蒐集版本數據,決定商業策略。

使用 Istio 實現 A/B Testing

本篇實現 A/B Testing 的方式是使用 Virtual ServiceHTTPMatchRequest 功能,可以根據不同的 HTTP Request 決定流量要轉到哪個版本,本次實驗會去檢查 HTTP Header 裡的使用者名稱是否包含 ironman 字串,有的話轉傳到 v3 版本(紅星星),沒有的話則轉傳到 v2 版本(黑星星),至於要怎麼做,就讓我們繼續看下去吧!

https://ithelp.ithome.com.tw/upload/images/20220922/20139235W18ohhcl6o.png

實驗概念圖,根據 User 的名稱來執行 A/B Tesing

請先參考 Day10 - 準備 Istio 實驗環境 的教學,將 Istio 及 Bookinfo Application 環境準備好,接著就可以依照以下步驟實現 A/B Testing。

  1. 建立 destination-rule.yaml 檔案,將 Pod 根據 Label 分群
  • destination-rule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
  1. 使用 kubectl 部署 DestinationRule
kubectl apply -f destination-rule.yaml
kubectl get destinationRule

(輸出結果)

NAME      HOST      AGE
reviews   reviews   177m

接著要如何使用 VirtualService 將流量分流呢?可以在 Yaml 設定 match HTTP 封包的規則,在這裡是設置當 header 存在 end-user: 包含 ironman 的字串就會將流量傳至 v3,反之則會傳送至 v2。

  1. 建立 virtual-service.yaml 檔案
  • virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          regex: .*ironman.*
    route:
    - destination:
        host: reviews
        subset: v3
  - route:
    - destination:
        host: reviews
        subset: v2

正規表達式(regex) 可以描述符合語法資格的字串,而 .*ironman.* 代表只要字串包含 ironman 及符合語法

  1. 使用 kubectl 部署 VirtualService
kubectl apply -f virtual-service.yaml
kubectl get virtualService

(輸出結果)

NAME      GATEWAYS   HOSTS         AGE
reviews              ["reviews"]   178m
  1. 使用 kubectl port-forward 將流量轉入應用程式
kubectl port-forward svc/productpage 8080:9080
  1. 在瀏覽器輸入網址連接至服務
# 在瀏覽器輸入
http://127.0.0.1:8080/productpage

剛進入到應用程式畫面,會發現看到的是 V2 版本,嘗試看看使用右上角的登入按鍵,輸入不包含 ironman 的名稱及任意密碼後按登入。

  1. 進入應用程式,點擊 Sign in -> 輸入完資料後登入

https://ithelp.ithome.com.tw/upload/images/20220922/20139235Q9uA5RZ7Uq.png

可以觀察到 Reviews 部分顯示的還是 v2 版本。

https://ithelp.ithome.com.tw/upload/images/20220922/20139235EUjrrft3N7.png

接著我們登出此使用者帳號,再次點擊右上角的登入按鍵,這次輸入包含 ironman 的名稱及任意密碼後按登入。

  1. 登出後,再次點擊 Sign in -> 輸入完資料後登入

https://ithelp.ithome.com.tw/upload/images/20220922/20139235eLupacc8Qf.png

使用者名稱若包含 ironman,就可以成功觀察到 Reviews 顯示的為 v3 版本,這樣我們的 A/B Testing 就成功了。

https://ithelp.ithome.com.tw/upload/images/20220922/20139235PWOHtELr9a.png

總結

經過兩篇部署策略介紹,相信各位能對 Istio 有進一步的認識。這裡要強調一個重點,如果沒有 Istio 還是有其他方法可以完成 Canary DeploymentA/B Testing,但有了 Istio 你就能輕鬆的做到各式部署策略,只需設定好 Yaml 檔案,不需修改 Application 即可實現。


上一篇
Day12 - 使用 Istio 實現金絲雀部署 (Canary Deployment)
下一篇
Day14 -什麼是 Istio Gateway?與 Kubernetes Ingress 有何不同?
系列文
學會 Kubernetes 然後呢?由 Istio 進入 DevOps 偉大航路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
vicentli
iT邦研究生 4 級 ‧ 2022-10-21 17:42:10

請問一下

  - match:
    - headers:
        end-user:
          regex: .*ironman.*

這邊是不是 Application 的程式碼要做調整,在 Header 裡面放 end-user 才行?
我從範例 Pod 查看 Log 可以看到請求裡有 end-user ironman 字樣
但想確認下就找了一台 WordPress 在登入後,查看請求 Log 裡沒有 end-user
是否得進行程式碼調整,送出請求時加入 end-user

uccuz iT邦新手 1 級 ‧ 2022-10-26 17:59:21 檢舉

在 Productpage Application 有實作把原本放在 session 裡的 user 資料放入 end-user headers 中
https://github.com/istio/istio/blob/master/samples/bookinfo/src/productpage/productpage.py#L176

    if 'user' in session:
        headers['end-user'] = session['user']

Istio 的範例 Code 已經幫你實作好這層邏輯了,若想開發自己的應用也可以參考同樣的方式

vicentli iT邦研究生 4 級 ‧ 2022-10-26 20:48:11 檢舉

了解了,謝謝您的回覆

我要留言

立即登入留言