歡迎光臨
每天分享高質量文章

【剖析 | SOFAMosn 系列】之使用 SOFAMosn 搭建 Service Mesh 平臺

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 對接

  • 【待領取】協議處理及多協議擴充套件機制

  • 【待領取】跨協議轉發引擎機制實現原理剖析

  • 【待領取】後端連結管理,健康檢查

  • 【待領取】路由支援及擴充套件機制剖析

  • 【待領取】無損重啟/升級

  • 【待領取】記憶體復用剖析

領取方式:

直接回覆本公眾號想認領的文章名稱,我們將會主動聯絡你,確認資質後,即可加入Lab/>,It's your show time!


相關連結:

SOFA 檔案: http://www.sofastack.tech/

SOFA: https://github.com/alipay

SOFAMosn:

https://github.com/alipay/sofa-mosn

延伸閱讀:

大規模微服務架構下的 Service Mesh 探索之路

開源 | Service Mesh 資料平面 SOFAMosn 深層揭秘

【剖析 | SOFAMosn】系列之 SOFAMosn 的誕生和特性總覽

長按關註,獲取分散式架構乾貨

歡迎大家共同打造 SOFAStack https://github.com/alipay

贊(0)

分享創造快樂

© 2026 知識星球   網站地圖