天天看點

Service Mesh新成員:Consul 1.2

本文是 HashiCorp 創始人 Mitchell Hashimoto 在 2018 年 6 月 26 日釋出的關于 Consul 1.2 新功能 Service Mesh 的官方介紹。譯者接觸過的 Hashicorp 的産品有過不少,每款都給人感覺功能強大,設計簡潔,可以說是都是非常優秀的開源産品(當然這與背後的 Hashicorp 公司商業級支撐有關)。譯者有幸見過作者 Mitchell 一面,是個日裔混血,佩服他們取得的成就,期待他們推出的新功能能夠取得市場上的成功。

Service Mesh 是最近很火的微服務新範式,以 Istio 為首的開源項目引領着潮流,其他各大公司也在迅速跟上,包括 Hashicorp 也在 Consul 中加入類似的功能。我們後續也将提供 Service Mesh 這方面更多的技術文章,敬請期待。

Service Mesh新成員:Consul 1.2

我們很激動宣布 HashiCorp Consul 1.2 正式釋出了。這個版本主要新增了一個新的功能叫做 Connect, 它能夠将現有的 Consul 叢集自動轉變為 service mesh (服務網格)的解決方案。Connect 通過自動 TLS 加密和基于鑒權的授權機制支援服務和服務之間的安全通信。

目前全球有數以百萬計的機器上正部署着 Consul。當更新到 Consul 1.2 并打開 Connect 功能後,任何現有的叢集将立刻變身為支援任何包括實體機、雲、容器和排程器等各種平台的 service mesh 方案。

Service Mesh新成員:Consul 1.2

現代服務網絡 Service Mesh

Service mesh 是企業群組織采用微服務以及動态雲計算基礎設施方案的必選方案。傳統的基于主機的網絡安全機制必須被替代為現代的基于服務的安全機制,以适應現代運作時環境的高度動态特性。

Service mesh 提供了以下三個關鍵問題的一種高可用分布式解決方案:

  • 服務發現:服務之間必須能夠互相發現找到彼此。
  • 配置:服務必須能夠從一個中心的配置源接收運作時的配置資訊。
  • 隔離:服務之間的通信必須是被授權和加密的。

直到這個版本釋出之前,Consul 分别用 DNS 解決了服務發現的使用場景,以及 K/V 存儲解決了配置的使用場景。Connect 則将解決隔離的使用場景。這三項功能聯合在一起提供了一種可運作在任何平台的 service mesh 完整解決方案。

Consul Connect

Connect 是 Consul 的一個主要新功能,旨在通過自動 TLS 加密和基于鑒權的授權機制提供服務之間的安全通信。今天宣布的 Connect 的功能是完全免費并且開源的。Consul 1.2 提供 Connect 功能面向公衆的釋出。

Connect 在設計開發時就貫注了易于使用的想法。它可以僅僅通過一個配置參數就打開,在服務注冊時額外添加一行就可以使得任何現存的應用接受基于 Connect 的連接配接。證書更新是自動的,是以不會導緻服務停機。對于所有必須的子系統,Connect 僅僅需要一個二進制檔案就可以支援。後面我們會涵蓋很多其他的功能。

Service Mesh新成員:Consul 1.2

在易于使用的基礎上,Connect 暴露了 Consul 的很多新功能。這篇文章接下來會介紹其中一些功能的細節,不過讓我們來先列舉一下具有 Connect 的 Consul 所有主要的新功能:

  • 流量加密: 使用 Connect 建立的所有流量都是使用雙向 TLS 的,這確定了所有流量在傳輸中都是經過加密的。這使得服務可以安全地部署在低信任度的環境中。
  • 連接配接授權: 使用 intentions 建立服務連接配接圖,允許或攔截服務之間的通信。與防火牆使用 IP 位址不同,Connect 使用服務的邏輯命名。這意味着規則可以獨立地進行擴充,無論有一個 web 服務還是 100 個。Intentions 可以通過界面、指令行、API 或者 HashiCorp Terraform 來進行配置。
  • Sidecar 代理: 應用可以使用輕量的 sidecar 代理程序來自動建立進出流量的 TLS 連接配接。這使得現有的應用可以不進行任何修改就可以使用 Connect。Consul 不僅提供了一個不需要任何外部依賴的内置代理,還提供了對例如 Envoy 等第三方代理的支援。
  • 原生內建: 對于性能非常敏感的應用,可以不使用代理,而通過內建原生 Consul Connect API 來建立和接受連接配接,進而獲得更優的性能和安全。
  • 4 層 vs. 7 層: 鑒權是在 4 層實施的。Consul 将 7 層的功能和配置代理給可插拔式的資料層。你可以內建第三方代理,例如 Envoy,來提供諸如基于請求路徑的路由,鍊路追蹤和其他的功能,将 Consul 留作服務發現、鑒權和授權的功能。
  • 證書管理: Consul 使用 CA 生成并分發證書。Consul 提供了一個不依賴外部系統的内置 CA 系統,與 HashiCorp Vault 內建後,還可以擴充支援其他 PKI 系統。
  • 證書更新: Connect 可以自動更新根證書和子證書。根證書更新使用證書交叉簽名來保證新老證書在更新期間可以共存,進而不影響服務。此系統還支援無縫配置新的 CA 提供商。
  • 基于 SPIFFE 的身份認證: Consul 使用 SPIFFE 規範進行身份識别和認證。這使得使用 Connect 的服務可以建立和接受來自其他遵守 SPIFFE 系統的連接配接。
  • 網絡和雲平台無關: Connect 使用基于 TCP/IP 的标準 TLS。這使得 Connect 可以支援任何網絡配置,隻要目标服務廣播的 IP 位址在作業系統中可以通路。而且,服務之間可以進行跨雲通信,而不借助于複雜的 overlay 層級。

自動 Sidecar 代理

應用可以無須進行任何修改,使用代理 sidecar 建立出入連接配接。在使用 Connect 後,僅僅添加如下一行服務注冊配置就可以使得這個服務能夠接受基于 Connect 的連接配接:

  1. {
  2. "service": {
  3. "name": "web",
  4. "port": 8080,
  5. "connect": { "proxy": {} }
  6. }
  7. }

唯一的差別就是由 connect開頭的那行。這一行的存在使得 Consul 可以自動為這個服務啟動和管理一個代理程序。這個代理程序代表了這個特定的服務。它在一個動态配置設定的端口上接受連接配接,驗證并授權這個 TLS 連接配接,然後代理回一個标準的 TCP 連接配接到服務程序。

對于上遊的依賴,可以多添加幾行配置通過 Connect 監聽連接配接并代理到服務。例如,假設我們的 “web” 服務需要和 “db” 服務通過 Connect 進行通信:

  1. {
  2. "service": {
  3. "name": "web",
  4. "port": 8080,
  5. "connect": {
  6. "proxy": {
  7. "config": {
  8. "upstreams": [{
  9. "destination_name": "db",
  10. "local_bind_port": 9191
  11. }]
  12. }
  13. }
  14. }
  15. }
  16. }

上面配置了一個受管代理并設定了監聽本地 9191 端口将請求代理到任何遠端 “db” 服務。通過配置 “web” 服務使用這個本地端口,所有 “web” 和 “db” 之間的通信都将成為加密的和已授權的。

需要注意的是這些例子中,原來的應用 “web” 保持 沒有修改且感覺不到 Connect 的存在。僅僅通過一行到幾行的配置代碼,任何應用都可以使用自動管理的代理 sidecar 來接受和建立 Connect 連接配接。

可以參閱 代理的使用手冊文檔 了解更多内容。如果某個應用有極高的性能需求,那麼它可以 原生地內建Connect。這使得服務可以完全不需要代理。

開發友好的連接配接

為了最佳的安全性,服務應該盡量做到僅僅接受基于 Connect 的連接配接。然而,這給連接配接到服務進行開發或測試帶來了挑戰。Consul 提供了一種簡單的方式通過使用 consul connect proxy指令運作本地代理,進而使用 Connect 建立連接配接到服務。

考慮一個場景示例,一個 PostgreSQL 資料庫服務僅接受來自 Connect 的連接配接,某運維工程師因為維護需要,想使用 psql連接配接這個資料庫。他可以在本地機器上通過 consul connect proxy指令來使用 psql進行連接配接:

  1. $ consul connect proxy -service mitchellh -upstream postgresql:9191
  2. ==> Consul Connect proxy starting...
  3. Configuration mode: Flags
  4. Service: mitchellh
  5. Upstream: postgresql => :9191
  6. Public listener: Disabled
  7. ...

在另外一個 shell 終端中,可以使用标準 psql用戶端連接配接:

  1. $ psql -h 127.0.0.1 -p 9191 -U mitchellh mydb
  2. >

其中 -service指令參數代表了源服務的認證資訊。服務并不需要存在,但是調用者必須擁有合法的 ACL token 來注冊這個服務,Consul 必須配置為允許源和目标服務之間的連接配接。

對遠端服務進行本地開發和測試是 service mesh 的一個常見工作流挑戰,然而對于 Consul 和 Connect 來說卻極為容易。

使用 Intentions 進行通路控制

服務之間的通路控制通過 “intentions” 進行配置。一個意向(intention)是一條從源到目的服務的允許或攔截規則。Intentions 可以通過 UI 界面、指令行、API 或 Terraform 進行建立。

Service Mesh新成員:Consul 1.2

按照上述示例,允許從 db服務到 web的通路,可以執行:

  1. $ consul intention create -allow web db
  2. Created: web => db (allow)

上述指令允許 “web” 服務同 “db” 服務進行通信。然後這個 intention 可以通過 -deny立刻禁用兩個服務之間的連接配接。

Intentions 也可以通過服務的部署進行單獨管理,可以配置 ACL 規則,使得僅有特定的服務可以修改 intentions 。這使得安全和隔離可以動态并幾乎實時地進行配置和管控。

更多内容 & 未來

我們對于 Consul 1.2 和它所支援的新功能很是激動。由于這個功能和它的影響較大,Consul 1.2 中提供的 Connect 應該被認為是 beta 階段。這個夏天我們将在 Connect 上努力,希望在年底前能去掉 beta 的标簽。

在将來,我們也會圍繞 Connect 建構更多功能,包括新的 UI 增強、對 Envoy 代理的支援,以及同 Nomad 和 Kubernetes 的內建等等。Consul 1.2 中的 Connect 僅僅是個開始。

通路 https://www.consul.io/ 下載下傳 Consul 1.2。

下面的頁面能很好地進一步了解:

  • 功能首頁 - 這是 Consul Connect 的專門首頁,包含對所提供功能的總覽和文檔連結。
  • Connect 使用步驟 - Consul 使用步驟新增了一步 Connect 并包含快速入門的一個浏覽介紹。
  • Connect 互動式教程 - 帶你過一遍運作 Connect 關鍵步驟的互動式教程。
  • Connect 參考手冊 - Connect 的文檔手冊中包含關于 Connect 如何工作、代理、原生內建和證書管理等等的所有細節。在部署 Connect 之前,推薦先閱讀這個文檔手冊。
  • Connect 安全清單 - Connect 和 Consul 其餘的部分相比有不同的安全需求。為了運維的安全性,我們推薦檢視此清單,閱讀并了解 Consul 的安全模型。
  • Connect 生産指引 - 這是生産環境配置 Consul 叢集 Connect 功能的一個完整配置指引,包括配置最大限度安全的必要步驟。
  • Connect 白闆介紹 - 這個視訊是創始人兼聯合 CTO Armon Dadgar 介紹 Connect 關于網絡管理、安全和性能等方面的功能。
本文譯自 HashiCorp 官網關于 Consul 1.2 支援 Service Mesh 釋出的部落格文章。

繼續閱讀