在阿里雲容器服務上基於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。

圖片.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 services
kubectl get pods

確認網關創建完成

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,比較簡單地集成到自己項目的微服務開發中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章