本文做者:彭澤文,阿里巴巴UC事業部高級開發工程師html
原文地址:www.servicemesher.com/blog/dubbo-…git
X-protocol 的定位是雲原生、高性能、低侵入性的通用 Service Mesh 落地方案,依託 Kubernetes 基座,利用其原生的服務註冊和服務發現機制,支持各類私有 RPC 協議低成本、易擴展的接入,快速享受 Service Mesh 所帶來的紅利。github
本文將以 Dubbo 爲例,演示 Dubbo on x-protocol 場景下 Service Mesh 路由功能,涵蓋 Version route 、Weighted route 功能。shell
關於 x-protocol 的介紹請參考 螞蟻金服開源的 SOFAMesh 的通用協議擴展解析。apache
先看部署效果圖:api
本示例中dubbo-consumer的部署方式採用直連模式,即不走註冊中心,徹底依託kubernetes平臺提供的服務註冊及服務發現能力。bash
安裝 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 須要特別指定:app
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 命令檢查curl
kubectl get pods --namespace=kube-system
複製代碼
本示例演示從源代碼的 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
複製代碼
如下示例都將運行在 e2e-dubbo 命名空間下,如無 e2e-dubbo 命名空間,需先建立該命名空間:
kubectl apply -f samples/e2e-dubbo/platform/kube/e2e-dubbo-ns.yaml
複製代碼
部署 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)
複製代碼
部署 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 能力。
本例將演示控制 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
本例將演示控制 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的更多信息請訪問 www.sofastack.tech
微信羣:聯繫我入羣
Slack:servicemesher.slack.com 須要邀請才能加入
Twitter: twitter.com/servicemesh…
GitHub:github.com/
更多Service Mesh諮詢請掃碼關注微信公衆號ServiceMesher。