Service Mesh 是對一個不斷變動的網路環境(連接各種類型的工作負載),這個網路環境會因為各種狀況/條件/網路topology/資源/configuration等等的變動等提供一個Policy-based, network services。主要是希望這個網路環境中所有的traffic照著你所設計的方式來運行,並能持續確定網路運行的方式是如你所希望的。有人會說 : 我的服務是定義好的,所有的network routing 都已經設定了很少需要去修改。若你的環境全部是一般傳統Server的方式,可能是這樣運作的,但在微服務或是微服務混合傳統伺服器傳統的網路環境,一般網路管理方式可能會讓你管理負擔變很重。
Service Mesh 的基礎概念
Service Mesh 是定義在Infra layer,可以讓你同時管理傳統的monolithic的程式並整合微服務的的程式.雖然Service Mesh可以整合一般monolithic的服務,但我們會把重點擺在讓Service Mesh崛起的因素上 — Microservices and containers上。傳統上我們將所有的功能寫在一起(monolithic),所有的功能/服務在同一台機器上運作。開發人員可能只需要定義不同的服務/功能走不同的local machine RPC port(remote procedure calls)就好。但Microservices and containers卻改變了這個狀況,原來本機local port的各種服務被分配到不同的Containers/Microservices(你可以把它看成是小小VM,通常這個小小VM是無法變動的)。哪麼本來在同一台機器的internal communication就變成需要透過一到機制來控制了。但container/microservice是cloud native的,具有cloud native的特性(scalable/independently),所以要控制cloud native的網路就會很複雜了。
然而網路的世界也是很複雜的(網路的OSI Model),很多事都需要被take care。而Service Mesh 則趨向於開發者導向的,程式服務連結優先的網路。一個開發人員可能會特別注意一些網路上的問題(不過有些則會認為哪是infra team的事),像是網路的可用性及可靠性等等問題並把這一類的問題對應(error handling)寫進他們的code中。在Service Mesh架構中也能讓維運人員有能力去根據我們想要的policy來定義整個Service Mesh的網路的traffic該怎麼走/每個節點的確認等。這聽起來像是SDN(software-defined network),不過Service Mesh跟SDN不同的點在於前者偏向開發人員可以理解與操作的,後者是偏向於network administrator。另外Service Mesh目前來說是software based的(目前還是),是虛擬的摸不到的。而看的見摸得的的實體網路設備則是屬於intent-based networking, Service Mesh 會比SDN提供更細微的網路連結控制(根據我們所需要的各個服務之間網路連結與行為的policy來run)。
上圖為簡單的Service Mesh架構圖。我們從control plane可以看到Service Mesh是使用Proxies的概念來架構的,網路traffic是由Data plane來傳送的。
這種統一的基礎架構層與服務部署相結合,通常稱為Service Mesh. Istio通過在所有network path之間系統性的注入一個proxy,使每個proxy互相認識,並使它們處於集中控制之下,將完全不同的Microservices轉變為一個集中式並且從而形成Service Mesh(如下圖)。
上圖我們可以看到每一個Application服務與網路服務是分開的,也就是說開發人員只要專注在Application的功能其他非Application需要注意的網路問題全部都交給Service Proxy來處理。這樣的好處是開發人員可以專注功能面的開發而不需要像以前一樣在寫程式時還需要考慮到網路的問題。
也許有人會說我已經有container orchestrator 為什麼還需要加一層infra layer(service mesh)的東西呢?應該這麼說, container orchestrator 負責的大都是整個cluster(nodes and containers,如k8s)之間的需求。它比較注重在大一點的infra structure layer 層面,像是scheduling, discovery, 與healthy. 在microservice這一個層面少了service-levle 的需求,Service Mesh是注重在service-to-service之間的溝通連結(可以有快速/安全/可靠等功能)。另外若是你的服務是需要跨出 k8s cluster或連結其他服務,conatiner orchestrator 通常無法滿足這一項的需求。上圖(Service Mesh Architecture)的control plane就可以獨立出來將data plane放置在各個k8s cluster或其他server中,將服務串接起來。下圖可以比較一下container orchestrator 與Service Mesh著重不同的部份,container orchestrator 是Lower layer Network而Service Mesh是Service Layer Networking.
另外Service Mesh主要提供網路的observability(可視性)來量測整個Service Mesh的網路狀況(不過這個網路的可視性跟一般有network administrator管理經驗看的metric是不一樣的)。
API gateway and Service Mesh
在整個平台/組織/服務中, API gateway負責與外面的世界溝通而Service Mesh 是負責整個平台/組織/服務內部的服務。換句話說API gateway是負責north-south traffic(南北向網路),Service Mesh是負責east-west traffic(東西向網路)。所以這兩種服務經常需要搭配在一起來使用,但由於這兩種都是網路服務的東西但負責的面向不一樣若要統一管理也是一大問題。所以你會發現市面上越來越多的產品或服務可以把這兩個面向的服務整合再一起了。
重要但可能有問題的網路
由於我們將整體的功能拆分成需多的Microservices,而它們需要靠網路連結溝通。可想而知若網路有問題的話哪麼整體的服務面無法提供,在這一層面上Service Mesh注重的就是網路的reliability and latency.為了增強網路可靠性降低網路的延遲性,我們需要讓整個Service Mesh盡可能的夠聰明與有彈性,這樣就需要有以下的特點
1.使網路流量不走有問題網路路徑,以提高群集的整體可靠性(這個類似有network administrator經驗的人會用的Network protocol,像BGP/OSPF等)
2.避免不必要的網路overhead,像是有high-latency routes或是有cold cache的Server(Network protocol — like BGP/OSPF大都可以做到前者,但後者做不到)
3.確保services之間traffic flow的流量安全,以防小規模攻擊.
4.有能力highlight沒有預期到的services之間的dependencies與提供service之間溝通失敗的主因,讓你有能力回頭檢討整個架構
5.讓你的network polciy有granularity level 的service behaviors而不是只有connection level
以上這些都由Service Mesh,你在Application就不用再把這些規則寫入你的code了。
Service Mesh的價值
現在Service Mesh提供了一致化的方式讓microservices之間能夠連結,具安全性,統一管理,與監控。
Obseravility可視性
Service Mesh提供網路的visibility/resiliency/traffic control/ security control,並且將這些功能部屬在Application旁邊(proxy mode)達成可視性的目的。
Traffic Control 網路流量控制
Service Mesh提供細緻化與宣告式的網路控制。例如我們要實行一個canary 的測試,將部分網路流量導入這一個canary的軟體版本中。網路建立這一個連結的過程中通常包含circuit-breaking, latency-aware load balancing,最終會有一致的service discovery, retries, timeouts, and deadlines。
Security安全性
Service Mesh提供了整個網路的security/policy/compliance。大部分的Service Mesh會有a certificate authority (CA)的功能來提供service-to-service之間的keys and certificates的管理。有一個中控系統提供每一個單一服務的獨立憑證,所以在每一個service-to-service之間的網路連結都是加密的。並由這個中控機制管理所有的憑證。
以上為Service Mesh簡單的介紹