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

【剖析 | 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 大規模落地實踐方案, SOFAMosnSOFAMesh 的關鍵組件。目前由於 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)

分享創造快樂

© 2021 知識星球   网站地图