在阿里雲容器服務上基於Istio實現東西向流量管理

osswangxining發表於2018-09-14

概述

使用 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。

圖片.png

在開啟的頁面中可以看到Istio預設安裝的名稱空間、釋出名稱;
通過勾選來確認是否安裝相應的模組,預設是勾選前四項;
第5項是提供基於日誌服務的分散式跟蹤能力,本演示中不啟用。
圖片.png

點選 部署Istio 按鈕,幾十秒鐘之後即可完成部署。

自動 Sidecar 注入

檢視namespace:

圖片.png

點選編輯,為 default 名稱空間打上標籤 istio-injection=enabled。

圖片.png

使用 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對應的頁面:
圖片.png

微服務addedvalues版本v2對應的頁面:
圖片.png

微服務addedvalues版本v3對應的頁面:
圖片.png

請求路由

請求路由任務首先會把應用的進入流量導向 addedvalues 服務的 v2 版本。
接下來會把特定使用者(登入名稱以yunqi開頭的)的請求傳送給 v3 版本,其他使用者則不受影響。

kubectl apply -f virtual-service-user-v2-v3.yaml

開啟瀏覽器,訪問http://{GATEWAY-IP}/productpage

不論重新整理多少次頁面,如果沒有登入或者登入名不是以yunqi開頭的,始終得到如下的顯示內容,也就是上述提到的 第2 個版本的addedvalues微服務。

圖片.png

圖片.png

當使用以yunqi開頭的使用者名稱登入時,就會看到如下頁面內容, 也就是上述提到的 第3 個版本的addedvalues微服務。
圖片.png

注意的是,第3 個版本的addedvalues微服務提供的頁面中,按鈕是disabled狀態,無法點選。這是因為預設情況下,Istio 服務網格內的 Pod,由於其 iptables 將所有外發流量都透明的轉發給了 Sidecar,所以這些叢集內的服務無法訪問叢集之外的 URL,而只能處理叢集內部的目標。

下一篇文章中會介紹從叢集內訪問外部服務的出口的流量管理。

總結

本文通過示例演示了Istio針對叢集內服務之間的東西向流量管理、或者稱之為服務網格之間的流量管理。

歡迎大家使用阿里雲上的容器服務,快速搭建微服務的開放治理平臺Istio,比較簡單地整合到自己專案的微服務開發中。


相關文章