目前,行業内基于雲原生思想的開源項目,重點在于管理、控制微服務以及微服務架構下服務之間的通信問題。它們有效的解決了“服務異構化”、“動态化”、“多協定”場景所帶來的east/west流量的管控問題,而針對north/south的流量控制僅僅提供了ingress/egress做流量入口,出口的管理。
為了解決雲原生環境下的north/south流量控制問題,Ambassador開始走入大家的視線。Ambassador是一個網關,其中以Enovy作為具體政策的執行者,Ambassador抽象到控制平面,下發一些的網關控制指令。具體架構如下所示:

從架構圖能夠清晰的看到,Ambassador以Enovy基礎擴充而來,實作思路上同樣采取“控制平面”、資料平面想分離的設計思想。在容器生态環境下,無論是對kubernetes的traefik,還是istio下的Ingress-gateway都是強有力的擴充。
Ambassador有哪些特性呢?
異構化服務支撐
雲原生架構下各個服務要求隻要遵循相同的通信規範即可,是以不再強調語言,架構等一緻性問題。Ambassador恰好能夠有效的把請求流量導入到異構下的各個服務,并且完成服務的請求的管理控制。
支援基于各個服務的配置,更能夠進一步實作“逾時”,“速率限制”,“身份驗證政策”等網關級别的細粒度控制。
能夠支援不同層級的通信協定,L7協定包括HTTP、HTTP/2、grpc、trpc-web、websocket,L4協定TCP。
動态服務
服務更新會導緻應用程式不斷變化。Ambassador能夠友好的支撐雲原生應用的動态特性,具備如下特性:
- 允許在生産測試,支援不同的灰階釋出政策
- 細化可觀察性名額,有力管控服務行為
- 配置資訊的無感之變更,不會對最終使用者産生影響
分散工作流程
雲原生的應用下,允許不同的服務開發針對其自身的服務進行優化。
Ambassador為了滿足這個特性,能夠允許各個開發團隊自身維護自己的服務,并且獨立接入和使用Ambassador的配置資訊,一改之前網關層統一配置變更思路,進而避免影響其他運作服務。
Ambassador部署
Ambassador提供了多種不同的部署方式來滿足使用者需求。包括kubernetes yaml部署,helm部署,docker image部署以及docker compose部署等。既可以作為獨立的程式運作提供網關能力,同樣能夠與kubernetes,istio等雲原生的架構內建,來充當入口流量的管理者。
以docker image部署說明Ambassador的部署配置。
docker run -it -d -p 8080:8080 --name=ambassador --rm quay.io/datawire/ambassador:0.73.0 --demo
檢視Ambassador日志,确定運作情況。
AMBASSADOR: using '/ambassador/ambassador-demo-config' for configuration
AMBASSADOR: not watching for Kubernetes config
2019-07-17 08:22:55 kubewatch [9 TMainThread] 0.73.0 INFO: No K8s
2019-07-17 08:22:55 kubewatch [9 TMainThread] 0.73.0 DEBUG: cluster ID URL is d6e_id://00000000-0000-0000-0000-000000000000/default
2019-07-17 08:22:55 kubewatch [9 TMainThread] 0.73.0 DEBUG: Kubernetes is not available, so not doing CRD check
2019-07-17 08:22:55 kubewatch [9 TMainThread] 0.73.0 DEBUG: cluster ID is 07eb43c8-1166-5145-a060-45e4dd907e10 (from hardcoded ID)
AMBASSADOR: starting with environment:
====
AMBASSADOR_CLUSTER_ID=07eb43c8-1166-5145-a060-45e4dd907e10
AMBASSADOR_CONFIG_BASE_DIR=/ambassador
AMBASSADOR_NAMESPACE=default
AMBASSADOR_NO_KUBEWATCH=no_kubewatch
AMBASSADOR_ROOT=/ambassador
====
AMBASSADOR: launching worker process: 'env' 'PORT=5050' 'python3' 'demo-services/auth.py'
AMBASSADOR: launching worker process: 'python3' 'demo-services/qotm.py'
AMBASSADOR: starting ads
…………
08:24:00] "GET /auth/v0//ambassador/v0/favicon.ico HTTP/1.1" 200 -
ACCESS [2019-07-17T08:23:59.084Z] "GET /ambassador/v0/diag/ HTTP/1.1" 200 - 0 17012 69 62 "10.20.50.164" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" "7481ee18-307e-4d23-9c82-e0a623389655" "10.20.1.180:8080" "127.0.0.1:8877"
ACCESS [2019-07-17T08:24:00.254Z] "GET /ambassador/v0/favicon.ico HTTP/1.1" 401 UAEX 0 57 4 - "10.20.50.164" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" "0013e864-1128-4e03-8814-49ed6e498d11" "10.20.1.180:8080" "-"
ACCESS [2019-07-17T08:24:00.259Z] "GET /ambassador/v0/favicon.ico HTTP/1.1" 200 - 0 1150 8 4 "10.20.50.164" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" "9b0702c0-3800-4447-90aa-6bebb5a711fb" "10.20.1.180:8080" "127.0.0.1:8877"
基于docker image啟動時,ambassador采用預設的config配置資訊完成初始化工作。
通路Ambassador:
http://{ip}:8080/ambassador/v0/diag/
初始化預設使用者名admin,密碼admin。能夠正常的看到通路頁面