本文作者:彭澤文,阿里巴巴UC事業部高階開發工程師
原文地址:www.servicemesher.com/blog/dubbo-…
X-protocol 的定位是雲原生、高效能、低侵入性的通用 Service Mesh 落地方案,依託 Kubernetes 基座,利用其原生的服務註冊和服務發現機制,支援各種私有 RPC 協議低成本、易擴充套件的接入,快速享受 Service Mesh 所帶來的紅利。
本文將以 Dubbo 為例,演示 Dubbo on x-protocol 場景下 Service Mesh 路由功能,涵蓋 Version route 、Weighted route 功能。
關於 x-protocol 的介紹請參考 螞蟻金服開源的 SOFAMesh 的通用協議擴充套件解析。
前期準備
- 安裝 Minikube,推薦使用 Minikube v0.28 以上來體驗,請參考 github.com/kubernetes/…
- 安裝 kubectl 命令列工具,請參考 kubernetes.io/docs/tasks/…
- 安裝 VM Driver,推薦安裝 Virtual Box、Mac 使用者也可以選擇 hyperkit
- 瞭解 Istio Traffic Management 相關概念,相關連結:istio.io/zh/docs/tas…
部署
先看部署效果圖:
本示例中dubbo-consumer的部署方式採用直連模式,即不走註冊中心,完全依託kubernetes平臺提供的服務註冊及服務發現能力。
1. 安裝 Kubernetes
安裝 kubectl 命令列工具 推薦使用 Kubernetes 1.10 版本,並使用合適的 VM Driver,推薦使用預設的 VirtualBox。
minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
--extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
--extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key"
複製程式碼
Mac OSX 使用者使用的 hyperkit 需要特別指定:
minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 \
--extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
--extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
--vm-dirver=hyperkit
複製程式碼
等待 Kubernetes 啟動完畢,通過 kubectl 命令檢查
kubectl get pods --namespace=kube-system
複製程式碼
2. 部署 SOFAMesh
本示例演示從原始碼的 master 分支直接安裝最新的 SOFAMesh,安裝過程使用 Helm 完成。
從 GitHub 拉取最新程式碼:
git clone https://github.com/alipay/sofa-mesh.git
cd sofa-mesh
複製程式碼
建立 SOFAMesh 需要的 CRD:
kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml
複製程式碼
使用 Helm 安裝 SOFAMesh:
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
複製程式碼
安裝 istioctl 命令列工具:
# 使用 make 工具安裝 istioctl
make istioctl-install
複製程式碼
3. 建立示例的名稱空間
以下示例都將執行在 e2e-dubbo 名稱空間下,如無 e2e-dubbo 名稱空間,需先建立該名稱空間:
kubectl apply -f samples/e2e-dubbo/platform/kube/e2e-dubbo-ns.yaml
複製程式碼
4. 注入 SOFAMosn
部署 dubbo-consumer 和 dubbo-provider,部署前需要先使用 istioctl 進行 sidecar 注入,以下示例採用手動注入方式,也可以通過 istio namespace inject 功能來自動注入。
# mosn sidecar inject and deploy
kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-consumer.yaml)
kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-provider-v1.yaml)
kubectl apply -f <(istioctl kube-inject -f samples/e2e-dubbo/platform/kube/dubbo-provider-v2.yaml)
複製程式碼
5. 部署示例應用
部署 dubbo consumer service 及 dubbo provider service。
# http service for dubbo consumer
kubectl apply -f samples/e2e-dubbo/platform/kube/dubbo-consumer-service.yaml
# dubbo provider service
kubectl apply -f samples/e2e-dubbo/platform/kube/dubbo-provider-service.yaml
複製程式碼
檢查部署狀態:
#kubectl get pods -n e2e-dubbo
NAME READY STATUS RESTARTS AGE
e2e-dubbo-consumer-589d8c465d-cp7cx 2/2 Running 0 13s
e2e-dubbo-provider-v1-649d7cff94-52gfd 2/2 Running 0 13s
e2e-dubbo-provider-v2-5f7d5ff648-m6c45 2/2 Running 0 13s
#kubectl get svc -n e2e-dubbo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
e2e-dubbo-consumer ClusterIP 192.168.1.7 <none> 8080/TCP 10s
e2e-dubbo-provider ClusterIP 192.168.1.62 <none> 12345/TCP 10s
複製程式碼
e2e-dubbo-consumer 是一個 Dubbo 客戶端應用,它暴露了一個 8080 埠的 HTTP 服務,方便我們進行驗證,e2e-dubbo-provider 是一個 Dubbo 應用。 當 e2e-dubbo-consumer 通過 12345 埠呼叫 e2e-dubbo-provider 時,流量會被 IPtable 規則攔截,導流給 SOFAMosn。
驗證路由能力
本示例將驗證 Version route 和 Weighted route 能力。
1. 驗證 Version Route 能力
本例將演示控制 dubbo-consumer的所有請求指向 dubo-provider-v1 配置DestinationRule:
istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
複製程式碼
dubbo-consumer.destinationrule.yaml
內容如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: e2e-dubbo-provider
namespace: e2e-dubbo
spec:
host: e2e-dubbo-provider
subsets:
- name: v1
labels:
ver: v1
- name: v2
labels:
ver: v2
複製程式碼
配置VirtualService:
istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.version.vs.yaml
複製程式碼
dubbo-consumer.version.vs.yaml
內容如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: e2e-dubbo-provider
namespace: e2e-dubbo
spec:
hosts:
- e2e-dubbo-provider
http:
- route:
- destination:
host: e2e-dubbo-provider
subset: v1
複製程式碼
路由策略已經生效,可以 http 請求 dubbo consumer 來觸發 rpc 請求觀察效果,由於使用 Minikube 的關係,需要啟動一個 Pod 用來測試
# 啟動一個 busybox Pod 並登陸
kubectl run -i -t busybox --image=yauritux/busybox-curl --restart=Never
# 使用 e2e-dubbo-consumer 的域名訪問服務
curl e2e-dubbo-consumer.e2e-dubbo.svc.cluster.local:8080/sayHello?name=dubbo-mosn
複製程式碼
清理路由策略:
istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.version.vs.yaml
複製程式碼
退出 Minikube shell
2. 驗證 Weight Route 能力
本例將演示控制 dubbo-consumer 的請求指向 dubo-provider-v1,dubo-provider-v2。並控制流量分配比例為 v1:20%,v2:80%。
配置DestinationRule:
# 如果在上一示例中已經建立好了,請跳過這一步
istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
複製程式碼
dubbo-consumer.destinationrule.yaml
內容如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: e2e-dubbo-provider
namespace: e2e-dubbo
spec:
host: e2e-dubbo-provider
subsets:
- name: v1
labels:
ver: v1
- name: v2
labels:
ver: v2
複製程式碼
配置 VirtualService:
istioctl create -f samples/e2e-dubbo/platform/kube/dubbo-consumer.weight.vs.yaml
複製程式碼
dubbo-consumer.weight.vs.yaml
內容如下:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: e2e-dubbo-provider
namespace: e2e-dubbo
spec:
hosts:
- e2e-dubbo-provider
http:
- route:
- destination:
host: e2e-dubbo-provider
subset: v1
weight: 20
- destination:
host: e2e-dubbo-provider
subset: v2
weight: 80
複製程式碼
路由策略已經生效,可以 http 請求 dubbo consumer 來觸發 rpc 請求觀察效果:
# 啟動一個 busybox Pod 並登陸
kubectl run -i -t busybox --image=yauritux/busybox-curl --restart=Never
# 使用 e2e-dubbo-consumer 的域名訪問服務
curl e2e-dubbo-consumer.e2e-dubbo.svc.cluster.local:8080/sayHello?name=dubbo-mosn
複製程式碼
清理路由策略:
istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.destinationrule.yaml
istioctl delete -f samples/e2e-dubbo/platform/kube/dubbo-consumer.weight.vs.yaml
複製程式碼
更多功能,敬請期待。
SOFAMesh Github 地址:github.com/alipay/sofa…
參考文件
- 螞蟻金服開源的 SOFAMesh 的通用協議擴充套件解析 - servicemesher.com
- 在 Kubernetes 中快速開始 - istio.io
- 注入 Istio sidecar - istio.io
- Dubbo quick start - dubbo.incubator.apache.org
關於SOFAMesh的更多資訊請訪問 www.sofastack.tech
ServiceMesher社群資訊
微信群:聯絡我入群
Slack:servicemesher.slack.com 需要邀請才能加入
Twitter: twitter.com/servicemesh…
GitHub:github.com/
更多Service Mesh諮詢請掃碼關注微信公眾號ServiceMesher。