Istio Proxy【Envoy擴充套件】詳解

吳德寶AllenWu發表於2018-10-19

[TOC]

Istio Proxy【Envoy擴充套件】詳解

原始碼工程和基本介紹

istio proxy工程概要

istio官方原始碼中有說明,istio專案的倉庫除了istio本身外,還有istio proxy這個倉庫,istio proxy官方原始碼和Envoy一樣,採用C++編寫,注意,這裡的編譯方式,不再是Makefile,也不是CMake,是Google出品的bazel。bazel可以直接在編譯中引入第三方庫,載入第三方原始碼,而不是和以前一樣採用載入動態庫、靜態庫或者乾脆直接引入第三方原始碼到專案中的方式;這個方式有點類似golang的import和包管理機制,只需要引用並且制定第三方庫的位置和版本即可。更多關於Bazel的介紹可以參考Bazel官網

istio proxy和Envoy的關係

istio proxy這個專案工程既包含引用了Envoy的原始碼,還在此基礎上自己做了擴充套件,這個擴充套件是通過Envoy filter(過濾器)的形式來提供,這樣的話就可以使得proxy代理將策略執行決策委託給Mixer,這樣就解釋了為什麼Mixer可以被設計為提供策略和遙測的元件,Mixer->istio proxy->Envoy這種形式來控制。這樣通過這個方式就能:

  • 使用到Envoy的全部功能
  • 基於Envoy做擴充套件,結合istio本身做處理

核心原理和功能說明

在istio-proxy專案中的Envoy BUILD中可以知道,這裡會編譯出name = "Envoy"的二進位制程式,然後start_Envoy會啟動Envoy,同時會根據一些預設引數和配置檔案模板生成一個全新的配置檔案,然後執行。一些關鍵引數如Envoy二進位制的路徑和配置路徑、監聽的埠、mixer的地址如下:

    -a ... backend address
    -c ... Envoy config file path
    -e ... Envoy binary path
    -l ... debug level
    -m ... mixer server address
    -p ... listening port
    -t ... Envoy config template file path
複製程式碼

也即是istio proxy 提供兩大塊:

  • Envoy

    • Envoy 流量相關
  • mixer client

    • 測量和遙測相關,正因為整合了mixer client,所以才能在Envoy流量請求的時候可以進行前置檢查和後置上報

Envoy 相關

istio-proxy原始碼中提供了envoy.conf.template 通用配置模板,這個模板檔案最終會生成一個envoy的配置檔案,然後envoy啟動的時候指定執行。模板配置檔案中已經配置好了Mixer相關的引數如mixer_server,這個Mixer對於Envoy來說就是一個cluster,因此是在cluster_manager裡面進行管理配置。

然後Envoy的官方文件Listener discovery service (LDS)一文中有說明靜態的Listener檔案配置是無法通過LDS API進行修改或刪除的,因此靜態配置會一直生效,istio-proxy原始碼中則提供了Envoy的靜態配置檔案envoy_lds.conf 靜態listeners配置

Envoy Filters

根據Envoy的官方文件中的網路過濾器Network (L3/L4) filters的介紹,有三種 network filters,而在istio-proxy原始碼中剛好有實現Network::ReadFilter 和 Network::WriteFilter 過濾器,這樣就可以通過filter API 繫結到Listener,然後當有資料讀or寫的時候呼叫到對應的filter了,這樣資料流就從Envoy本身轉到了filter中。

然後network filter再轉到Envoy 的 http filter,根據官方文件HTTP filters的介紹也有兩種Filters,為Decoder和Encoder,然後在istio-proxy原始碼中實現了 Http::StreamDecoderFilter和Http::StreamEncoderFilter這兩個Filter,這樣的話整個流程就串起來了。

在具體實現中, Filter還對應有Controller進行管理,這個只是程式碼設計上的優雅風格,和流程無關,但是這個設計風格是可以借鑑參考的。

Mixer client

原有mixer client倉庫是獨立的,現在已經整合到了istio-proxy的程式碼倉庫中,這樣就可以很方便的在Sidecar Envoy代理中實現:

  • 和mixer server互動
  • 新增一級快取
  • 前置檢查
  • 後置批量上報
  • 策略控制
  • 屬性、欄位轉換和傳遞

Envoy呼叫Mixer流程

Istio Proxy【Envoy擴充套件】詳解

Pilot和istio-proxy的關係

istio/istio專案中的pilot會提供Envoy所需的一切介面,istio/proxy專案則是真正Envoy的專案,會訪問Pilot提供的介面。

官方pilot-agent-proxy命令中有詳細說明,pilot-agent啟動的時候,需要指定envoy的配置和二進位制路徑,然後映象中的proxyv2的映象的Dockerfile則參考這裡。pilot-agent是容器中PID為 1 的啟動程式,它啟動時又建立了一個 Envoy 程式。

小結

istio-proxy,這個Envoy的擴充套件,就是在Envoy基礎上,增加了一些Filter,然後通過這些個Filter在利用Mixer Client和 Mixer Server進行通訊,這樣就可以在proxy代理中:

  • 流量代理
  • 策略控制
  • 遙測代理
    • 快取

問題

相關文章