Linkerd 與 Docker EE 平台的整合應用


Service Mesh 指的是在2016年由 Buoyant 公司所提出的 Linkerd 框架當中蘊含的一個核心技術概念,目的在解決微服務架構以及容器化服務所衍生出來的網路和安全問題。它在分散式系統中涵蓋了動態鏈接過程,提供安全,快速,可靠的服務間通訊。

如何設計好服務間通訊在微服務架構中是一項挑戰。分散式系統中,會有許多四處移動的跨多伺服器或主機的服務,軟體元件難免會遭遇異常情況。因為會發生部分失敗甚至導致更大範圍的中斷問題,所以設計微服務架構和服務間通訊的時候,需要將這類分散式系統的常見風險列入考量。

關於服務間通訊常見的實現方法大致會有:一個直接較容易實作的方法是以 HTTP (REST) 為基礎,但有 blocking 以及效能低的缺點;第二,採用非同步通訊協定,例如 AMQP。在應用程式代碼實作上相對比較複雜,並搭配運用側車(sidecar)模式以及大使(Ambassador)模式來處理訊息重送和熔斷訊息斷路機制;最後,運用 Service Mesh 框架。

藉由運用 Service Mesh 框架,開發人員可以專注在自己開發的應用程式碼邏輯,不需要太擔心要如何用代碼處理雲環境或是容器平台上高度複雜的服務間通訊狀況,應用程式代碼不會與通訊代碼過度耦合,而又同時能通過 Service Mesh 框架來管理雲環境或容器平台內部的服務間通訊的正確性,可靠性,以及確保一定程度的通訊效能。當前最常見的分散式系統就是微服務,簡單來說,Service Mesh 就如同是微服務的動態鏈接器(dynamic linker)。

當前常見的 Service Mesh 框架有:Google 主導的 Istio ;以及 Buoyant 公司所提出的 Linkerd , 後來 Buoyant 公司參考 Istio 架構又另外推出一個輕量型的 Service Mesh 框架: Conduit,Conduit 後來再整合到 linnkerd, 作為 Linkerd2。Nginx 也有推出類似的方案。

這裡主要先以 linkerd 為例說明 Service Mesh 框架與 Docker EE 平台的整合。

要在 Docker EE 環境下部署 linkerd 有兩種方式:
一、以 docker run 命令運行 linkerd image, 在本文中介紹這種方式;
二、以預定義好的 K8S yaml 部署 linkerd 在 Docker EE 2.0 平台叢集,通過 docker stack deploy 命令達成,將會在另文介紹,

以下步驟在 UBUNTU 16.04 作業系統中安裝 Docker EE 引擎版本 v17.06.2 的環境下測試過。

在Docker主機內先建立一個目錄,這裡名字叫做 linkerd, 然後在這目錄下,建立如下文件內容,並保存為 config.yml

admin:
port: 9990
ip: 0.0.0.0

routers:
- protocol: http
dtab: /svc => /$/inet/127.1/9990;
servers:
- port: 8080
ip: 0.0.0.0

在同樣的目錄下執行下述命令啟動 linkerd 並讀取 config.yml

docker run --name linkerd -p 9990:9990 -v $(pwd)/config.yml:/config.yml buoyantio/linkerd:1.4.5 /config.yml

測試確認運行結果:

docker exec linkerd curl -s 127.1:8080/admin/ping

執行上述命令後,如果正常會回傳 pong 訊息。

在同樣的 Docker 主機上,打開瀏覽器,輸入 http://localhost:9990 可以看到如下畫面,




【參考資料】

https://linkerd.io/1/getting-started/docker/



留言

這個網誌中的熱門文章

Docker 環境下的 Proxy 配置