[譯] Istio 1.1.0 下的 TCP 流量控制
作者:Venil Noronha(VMWare開源技術中心工程師,關注Istio、Envoy專案)
譯者:馬若飛 原文地址:https://venilnoronha.io/raw-tcp-traffic-shaping-with-istio-1.1.0
Istio通過虛擬服務, 目標規則, Gateway等概念提供了複雜的路由機制。Istio 1.0通過加權路由定義啟用了HTTP流量轉移。我提交的Envoy 和Istio的pull request為TCP/TLS服務提供了類似的特性。這一特性已經在Envoy 1.8.0中釋出了。Istio中的這一特性也會在即將釋出的1.1.0版本中提供使用。
在本文中,我們將用Go編寫的一個簡單的TCP Echo服務,用Docker將其容器化並部署到Kubernetes上,並通過練習Istio的加權TCP路由特性來理解其在生產服務中的行為。
TCP Echo服務
在本文中,我們將建立一個簡單的監聽連線的TCP服務,並在客戶端的請求資料加上一個簡單的字首,將其作為響應返回。圖示如下:
讓我們看一下TCP Echo服務端的Go程式碼:
要測試這個程式,複製上面程式碼並命名為 main.go
,執行命令如下:
我們可以通過 nc
(Netcat)在TCP層面上和這段程式互動。要傳送請求,可以使用BusyBox容器,如下所示:
就像你看到的,在請求“world”前面加上了“hello”,“hello world”作為響應。注意,正在執行的BusyBox容器基於 Docker for Mac,這就是為什麼我訪問Echo服務端時用 docker.for.mac.localhost
代替了 localhost
。
容器化TCP Echo服務
因為我們最終想要在Kubernetes叢集上執行TCP Echo服務,現在讓我們將它容器化併發布映象到 Docker Hub。
首先,用下面的內容建立 Dockerfile
:
構建容器併發布映象到Docker Hub:
部署TCP Echo服務到Kubernetes
服務配置
我們需要部署2個版本的TCP ECHO服務,用不同的字首展示路由行為。建立 service.yaml
,用Kubernetes Service 和2個 Deployments 構建2個版本的TCP ECHO服務。
部署Minikube
Minikube是Kubernetes本地開發的最佳工具。用下面的命令啟動Minikube例項:
安裝 Istio
在撰寫本文時,Istio 1.1.0還沒有釋出。因此我使用了Istio的 Daily Pre-Release來演示這個新特性。請參考Istio文件學習下載和配置Istio。
一旦配置完成,這裡有一個完全部署Istio元件的簡單方法:
使用Istio代理部署TCP Echo服務
為了演示Istio的路由機制,我們以sidecar模式部署 tcp-echo-server
:
通過下面的命令來驗證服務執行:
Istio加權TCP路由
這是本練習的最後一部分,定義 VirtualService
, DestinationRule
和帶有權重路由的 Gateway
,並驗證系統行為。
路由配置
建立帶有兩個 subset
的 DestinationRule
來代表兩個版本的 TCP Echo服務。 Gateway
容許流量通過埠 31400
訪問服務。最後, VirtualService
限定了80%的流量必須被路由到TCP Echo服務的v1版本,20%被路由到v2版本。
部署路由配置
為了讓配置生效,複製上面的配置內容並建立檔案 route-config.yaml
,用下面的命令進行安裝:
驗證Istio的TCP路由行為
先來確定一下Ingress的IP:
現在可以通過Ingress傳送一些請求到加權負載均衡的TCP Echo服務:
如你所見,大約80%的請求帶有“one”字首,剩下20%帶有“two”字首。這證明了加權TCP路由器確實生效了。
下圖能讓你很好地瞭解這個示範的情景:
清理
只需要像下面一樣刪除Minikube的部署:
總結
如本文所示,即將釋出的Istio 1.1.0版本配置加權TCP路由非常容易。本文提供了構建一個加權TCP路由的思路,讓你學會如何從頭開始控制TCP流量。
點選 【閱讀原文】 跳轉 到ServiceMesher網站上瀏覽可以檢視文中的連結。
相關閱讀
-
OA==&mid=2650166316&idx=1&sn=87b8521dd37989500940ebc1df857cc9&chksm=8ec1c865b9b64173ce31bdbdeaa15d2b24bc9052f7185bf479fb9c71c582047763094095dd8e&scene=21#wechat_redirect" target="_blank" rel="nofollow,noindex">教程|使用 SOFAMosn 搭建 Service Mesh 平臺
-
教程|構建生產就緒的Istio Adapter
-
SOFAMesh( https://github.com/alipay/sofa-mesh )基於Istio的大規模服務網格解決方案
-
SOFAMosn( https://github.com/alipay/sofa-mosn )使用Go語言開發的高效能Sidecar代理
合作社區
參與社群
以下是參與ServiceMesher社群的方式,最簡單的方式是聯絡我!
-
加入微信交流群: 關注本微信公眾號後訪問主頁右下角有獲取聯絡方式按鈕,新增好友時 請註明姓名-公司
-
社群網址: http://www.servicemesher.com
-
Slack: https://servicemesher.slack.com (需要邀請才能加入)
-
GitHub: https://github.com/servicemesher
-
Istio中文文件進度追蹤: https://github.com/servicemesher/istio-official-translation
-
Twitter: https://twitter.com/servicemesher
-
提供文章線索與投稿: https://github.com/servicemesher/trans