在阿里雲容器服務上基於Istio實現東西向流量管理
概述
使用 Ingress 將Kubernetes中的應用暴露成對外提供的服務,針對這個對外暴露的服務可以實現灰度釋出、流量管理等。我們把這種流量管理稱之為南北向流量管理,也就是入口請求到叢集服務的流量管理。
而Istio是側重於叢集內服務之間的東西向流量管理、或者稱之為服務網格之間的流量管理。
Istio是一個用於連線/管理以及安全化微服務的開放平臺,提供了一種簡單的方式用於建立微服務網路,並提供負載均衡、服務間認證以及監控等能力,並且關鍵的一點是並不需要修改服務本身就可以實現上述功能。
該樣例應用由四個單獨的微服務構成,用來演示多種 Istio 特性。該應用模仿某銀行金融產品的一個分類,顯示某一金融產品的資訊。頁面上會顯示該產品的描述、明細,以及針對特定使用者的增值服務。
四個單獨的微服務:
• productpage :productpage 微服務會呼叫 details 和 addedvalues兩個微服務,用來生成頁面。
• details :該微服務包含了金融產品的資訊。
• addedvalues:該微服務包含了針對特定使用者的增值服務。它還會呼叫 styletransfer微服務。
• styletransfer:該微服務提供了轉移照片藝術風格的API功能。
addedvalues微服務有 3 個版本:
• v1 版本不會呼叫 styletransfer 服務,也不會提供風險和投資分析結果。
• v2 版本不會呼叫 styletransfer 服務,但會提供風險和投資分析結果。
• v3 版本會呼叫 styletransfer 服務,提供針對特定使用者的增值服務,即允許使用者上傳圖片進行風格轉換,並返回一張轉換後的圖片。
準備Kubernetes叢集
阿里雲容器服務Kubernetes 1.10.4目前已經上線,可以通過容器服務管理控制檯非常方便地快速建立 Kubernetes 叢集。具體過程可以參考建立Kubernetes叢集。
確保安裝配置kubectl 能夠連線上Kubernetes 叢集。
示例中用到的檔案請參考: 檔案
部署Istio
開啟容器服務控制檯,在左側導航欄中選中叢集,右側點選更多,在彈出的選單中選中 部署Istio。
在開啟的頁面中可以看到Istio預設安裝的名稱空間、釋出名稱;
通過勾選來確認是否安裝相應的模組,預設是勾選前四項;
第5項是提供基於日誌服務的分散式跟蹤能力,本演示中不啟用。
點選 部署Istio 按鈕,幾十秒鐘之後即可完成部署。
自動 Sidecar 注入
檢視namespace:
點選編輯,為 default 名稱空間打上標籤 istio-injection=enabled。
使用 kubectl 部署簡單的服務
kubectl apply -f app.yaml
上面的命令會啟動全部的3個服務,其中也包括了 addedvalues 服務的三個版本(v1、v2 以及 v3)
定義 Ingress gateway
kubectl apply -f gateway.yaml
確認所有的服務和 Pod 都已經正確的定義和啟動
kubectl get svc
kubectl get po
確認閘道器建立完成
kubectl get gateway
應用預設目標規則
kubectl apply -f destination-rule-all.yaml
等待幾秒鐘,等待目標規則生效。這就意味著上述3個微服務已經部署在Istio環境中。 你可以使用以下命令檢視目標規則:
kubectl get destinationrules
檢視Ingress Gateway的地址
點選左側導航欄中的服務,在右側上方選擇對應的叢集和名稱空間,在列表中找到istio-ingressgateway的外部端點地址。
開啟瀏覽器,訪問http://{GATEWAY-IP}/productpage
多次重新整理頁面,會得到如下3種不同的顯示內容,也就是上述提到的 3 個版本的addedvalues微服務。
微服務addedvalues版本v1對應的頁面:
微服務addedvalues版本v2對應的頁面:
微服務addedvalues版本v3對應的頁面:
請求路由
請求路由任務首先會把應用的進入流量導向 addedvalues 服務的 v2 版本。 接下來會把特定使用者(登入名稱以yunqi開頭的)的請求傳送給 v3 版本,其他使用者則不受影響。
kubectl apply -f virtual-service-user-v2-v3.yaml
開啟瀏覽器,訪問http://{GATEWAY-IP}/productpage
不論重新整理多少次頁面,如果沒有登入或者登入名不是以yunqi開頭的,始終得到如下的顯示內容,也就是上述提到的 第2 個版本的addedvalues微服務。
當使用以yunqi開頭的使用者名稱登入時,就會看到如下頁面內容, 也就是上述提到的 第3 個版本的addedvalues微服務。
注意的是,第3 個版本的addedvalues微服務提供的頁面中,按鈕是disabled狀態,無法點選。這是因為預設情況下,Istio 服務網格內的 Pod,由於其 iptables 將所有外發流量都透明的轉發給了 Sidecar,所以這些叢集內的服務無法訪問叢集之外的 URL,而只能處理叢集內部的目標。
下一篇文章中會介紹從叢集內訪問外部服務的出口的流量管理。
總結
本文通過示例演示了Istio針對叢集內服務之間的東西向流量管理、或者稱之為服務網格之間的流量管理。
歡迎大家使用阿里雲上的容器服務,快速搭建微服務的開放治理平臺Istio,比較簡單地整合到自己專案的微服務開發中。
相關文章
- 使用Istio服務網格實現流量映象
- 基於istio實現多叢集流量治理
- 阿里雲Kubernetes容器服務Istio實踐之整合日誌服務Log Service阿里
- Istio流量管理實現機制深度解析
- Istio技術與實踐05:如何用istio實現流量管理
- Istio實踐(2)-流量控制及服務間呼叫
- kubernetes實踐之七十:Istio之流量管理(上)
- Istio中的服務和流量的抽象模型抽象模型
- Laravel 服務容器實現原理Laravel
- 基於阿里雲 ASK 的 Istio 微服務應用部署初探阿里微服務
- Istio最佳實踐:在K8s上透過Istio服務網格進行灰度釋出K8S
- 從零搭建一個基於Istio的服務網格
- 基於ECS搭建FTP服務(阿里雲)FTP阿里
- idou教你學Istio10 : 如何用Istio實現K8S Egress流量管理K8S
- idou老師教你學Istio: 如何用Istio實現K8S Egress流量管理K8S
- React服務端渲染實現(基於Dva)React服務端
- Go實現基於WebSocket的彈幕服務GoWeb
- 基於lua協程的AI服務實現AI
- idou老師教你學Istio 09: 如何用Istio實現K8S Ingress流量管理K8S
- 容器監控—阿里雲&容器內部服務監控阿里
- 基於 ASK + EB 構建容器事件驅動服務事件
- 基於 swoole 的 websocket 服務實現狀態同步Web
- 基於istio實現單叢集地域故障轉移
- 初識 Istio - 服務網格管理工具
- 基於畢昇上線基於大模型對應服務大模型
- 如何實現高效地IT服務管理
- idou老師教你學Istio06: 如何用istio實現流量遷移
- kubernetes實踐之七十一:Istio之流量管理(下)
- Kubernetes基於haproxy實現ingress服務暴露
- 基於 RocketMQ 的 MQTT 服務架構在小米的實踐MQQT架構
- 在騰訊雲容器服務 TKE 中實踐 DevOpsdev
- 手把手教你在容器服務 TKE 上使用 LB 直通 Pod
- 18.基於Consul的服務發現和ConsulManager管理
- Golang在整潔架構基礎上實現事務Golang架構
- 基於容器雲的微服務架構實踐微服務架構
- 新課上線 | 每次 5 分鐘,輕鬆玩轉阿里雲容器服務!阿里
- 基於阿里雲服務搭建的典型技術架構阿里架構
- Istio 運維實戰系列(2):讓人頭大的『無頭服務』-上運維