SOFA
Scalable Open Financial Architecture
是螞蟻金服自主研發的金融級分散式中介軟體,包含了構建金融級雲原生架構所需的各個元件,是在金融場景裡錘煉出來的最佳實踐。
本文為《剖析 | SOFAMosn》第二篇。
《剖析 | SOFAMosn》系列由 SOFA 團隊和原始碼愛好者們出品,
專案代號:
,今天開啟共建招募,加入方式見底部。 SOFAMosn: https://github.com/alipay/sofa-mosn
本文將介紹如何使用 SOFAMosn 在 SOFAMesh 框架下搭建 Service Mesh 的開發環境,並驗證 SOFAMosn 的一些基礎路由能力、負載均衡能力等。(點選底部閱讀原文,建議 PC 端開啟獲得更好地閱讀體驗)
本文介紹的內容將包括 :
-
SOFAMosn 與 SOFAMesh 的關係
-
準備工作
-
原始碼方式部署 SOFAMesh
-
Bookinfo 實驗
SOFAMosn 與 SOFAMesh 的關係
在上文《【剖析 | SOFAMosn 系列】之 SOFAMosn 的誕生和特性》中,我們介紹過,SOFAMosn 是一款採用 Golang 開發的 Service Mesh 資料平面代理,功能定位類似於 Envoy,而 SOFAMesh 則是基於 Istio 改進和擴充套件而來的 Service Mesh 大規模落地實踐方案, SOFAMosn 是 SOFAMesh 的關鍵元件。目前由於 SOFAMosn 相比 Envoy 做了一些改造,無法在 Istio 下直接使用,所以本文的實驗需要在 SOFAMesh 體系中進行。下圖是 SOFAMesh 整體框架下,SOFAMosn 的工作示意圖。
一、準備工作
本文以 macOS 為例 ,其他環境可以安裝對應版本的軟體。
1. 安裝 hyperkit
先安裝 docker-for-mac,之後安裝驅動
1.1 安裝 docker
-
下載軟體包安裝,或者使用如下的命令安裝
$ brew cask install docker
1.2 安裝驅動
2. 安裝 Minikube(也可以購買商業的 k8s 叢集)
-
推薦使用 Minikube v0.28 以上來體驗,請參考 https://github.com/kubernetes/minikube
$ brew cask install minikube
3. 啟動 Minikube
-
註意,pilot 至少需要 2G 記憶體,所以在啟動的時候,可以透過加引數的方法給 minikube 新增分配的資源,如果你機器的資源不夠,推薦使用商業版本的 k8s 叢集。
$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 --vm-driver=hyperkit
4. 安裝 kubectl 命令列工具
-
kubectl 是用於針對 k8s 叢集執行命令的命令列介面,安裝參考 https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl
$ brew install kubernetes-cli
5. 安裝 Helm
-
Helm 是一個 k8s 的包管理工具,安裝參考 https://docs.helm.sh/using_helm/#installing-helm
$ brew install kubernetes-helm
二、原始碼方式部署 SOFAMesh
1. 下載 SOFAMesh 原始碼
$ git clone git@github.com:alipay/sofa-mesh.git
$ cd sofa-mesh
2. 透過 Helm 安裝 SOFAMesh
-
使用 Helm 安裝之前,需要先檢視 Helm 的版本
$ helm version
如果版本在 2.10 之前,需要手動 安裝 istio 的 CRD,否則不需要。(在筆者寫此文的時候,安裝的 helm 已經是v2.11.0,所以下麵的步驟可以直接跳過)
$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
$ kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml
-
之後 使用 Helm 安裝 ISTIO 有兩種方式,這裡推薦使用第一種,如果第一種不 work,可以嘗試第二種
方式一:使用 helm template
安裝
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml
$ kubectl create namespace istio-system
$ kubectl apply -f $HOME/istio.yaml
如果安裝成功後,需要解除安裝的話:
$ kubectl delete -f $HOME/istio.yaml
方式二:使用 helm install 安裝
$ kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
$ helm init --service-account tiller
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system
如果安裝成功後,需要解除安裝的話:
$ helm delete --purge istio
3. 驗證安裝
istio-system 名稱空間下的 pod 狀態都是 Running 時,說明已經部署成功
三、BookInfo 實驗
BookInfo 是一個類似豆瓣的圖書應用,它包含四個基礎服務
-
Product Page:主頁,由 python 開發,展示所有圖書資訊,它會呼叫 Reviews 和 Details 服務
-
Reviews:評論,由 java 開發,展示圖書評論,會呼叫 Ratings 服務
-
Ratings:評分服務,由 nodejs 開發
-
Details:圖書詳情,由 ruby 開發
1. 部署 BookInfo 應用並註入 SOFAMosn
詳細過程可以參考 https://istio.io/docs/examples/bookinfo/
-
註入 SOFAMosn
$ kubectl label namespace default istio-injection=enabled
-
部署 Bookinfo
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
-
驗證部署是否成功
-
等待所有的 pods 等成功執行起來
2. 訪問 BookInfo 服務
-
開啟 gateway 樣式
-
驗證 gateway 是否生效
-
觀察頁面情況
訪問 http://$GATEWAY_URL/productpage ,正常的話透過掃清會看到如下所示 BookInfo 的介面,其中 Book Reviews 有三個版本,掃清後依次會看到(可以檢視 samples/bookinfo/platform/kube/bookinfo.yaml 中的配置發現為什麼是這三個版本)
-
版本一 的介面
-
版本二 的介面
-
版本三 的介面
3. 驗證 MOSN 按 version 路由能力
首先為 BookInfo 的 service 建立一系列的 destination rules
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
指定 reviews 服務只訪問 v1 版本
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
再次訪問 http://$GATEWAY_URL/productpage
發現 reviews 固定在如下版本一的頁面不再變化
4. 驗證 MOSN 按 weight 路由能力
我們透過下麵操作將 v1 和 v3 版本各分配 50% 的流量
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
再次訪問 http://$GATEWAY_URL/productpage
這次 v1 和 v3 各有 1/2 機率出現
5. 驗證 MOSN 按照特定 essay-header 路由能力
BookInfo 系統右上角有一個登陸的入口,登陸以後請求會帶上 end-user
這個自定義,值是 user name,Mosn 支援根據這個 essay-header 的值來做路由。比如,我們嘗試將 jason 這個使用者路由到 v2 版本,其他的路由到 v1 版本 (使用者名稱和密碼均是:jason,為什麼是這個使用者可以檢視對應的 yaml 檔案)
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
訪問 http://$GATEWAY_URL/productpage 時:
-
以 jason 身份登陸,會看到 v2 版本
-
以其他身份登陸,始終在 v1 版本
歡迎加入 ,參與 SOFAMosn 原始碼解析
我們會逐步詳細介紹每部分的程式碼設計和實現,預計會按照如下的目錄進行:
-
【已完成】使用 SOFAMosn 搭建 Service Mesh 平臺
-
【已領取】TLS 支援
-
【已領取】網路層,協議層擴充套件點
-
【已領取】負載均衡原理剖析
-
【已領取】網路通訊與 IO 處理
-
【待領取】配置檔案解析與API模型
-
【待領取】Istio 對接
-
【待領取】協議處理及多協議擴充套件機制
-
【待領取】跨協議轉發引擎機制實現原理剖析
-
【待領取】後端連結管理,健康檢查
-
【待領取】路由支援及擴充套件機制剖析
-
【待領取】無損重啟/升級
-
【待領取】記憶體復用剖析
領取方式:
直接回覆本公眾號想認領的文章名稱,我們將會主動聯絡你,確認資質後,即可加入
相關連結:
SOFA 檔案: http://www.sofastack.tech/
SOFA: https://github.com/alipay
SOFAMosn:
https://github.com/alipay/sofa-mosn
延伸閱讀:
開源 | Service Mesh 資料平面 SOFAMosn 深層揭秘
【剖析 | SOFAMosn】系列之 SOFAMosn 的誕生和特性總覽
長按關註,獲取分散式架構乾貨
歡迎大家共同打造 SOFAStack https://github.com/alipay