Istio Proxy【Envoy擴展】詳解

[TOC]html

Istio Proxy【Envoy擴展】詳解

源碼工程和基本介紹

istio proxy工程概要

istio官方源碼中有說明,istio項目的倉庫除了istio自己外,還有istio proxy這個倉庫,istio proxy官方源碼和Envoy同樣,採用C++編寫,注意,這裏的編譯方式,再也不是Makefile,也不是CMake,是Google出品的bazel。bazel能夠直接在編譯中引入第三方庫,加載第三方源碼,而不是和之前同樣採用加載動態庫、靜態庫或者乾脆直接引入第三方源碼到項目中的方式;這個方式有點相似golang的import和包管理機制,只須要引用而且制定第三方庫的位置和版本便可。更多關於Bazel的介紹能夠參考Bazel官網git

istio proxy和Envoy的關係

istio proxy這個項目工程既包含引用了Envoy的源碼,還在此基礎上本身作了擴展,這個擴展是經過Envoy filter(過濾器)的形式來提供,這樣的話就可使得proxy代理將策略執行決策委託給Mixer,這樣就解釋了爲何Mixer能夠被設計爲提供策略和遙測的組件,Mixer->istio proxy->Envoy這種形式來控制。這樣經過這個方式就能:github

  • 使用到Envoy的所有功能
  • 基於Envoy作擴展,結合istio自己作處理

核心原理和功能說明

在istio-proxy項目中的Envoy BUILD中能夠知道,這裏會編譯出name = "Envoy"的二進制程序,而後start_Envoy會啓動Envoy,同時會根據一些默認參數和配置文件模板生成一個全新的配置文件,而後運行。一些關鍵參數如Envoy二進制的路徑和配置路徑、監聽的端口、mixer的地址以下:golang

-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 提供兩大塊:docker

  • Envoy緩存

    • Envoy 流量相關
  • mixer clientbash

    • 測量和遙測相關,正由於集成了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中。tcp

而後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流程

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代理中:

  • 流量代理
  • 策略控制
  • 遙測代理
    • 緩存

【"歡迎關注個人微信公衆號:Linux 服務端系統研發,後面會大力經過微信公衆號發送優質文章"】

個人微信公衆號
相關文章
相關標籤/搜索