Cilium 1.3:具有Cassandra和Memcached支持的Envoy Go語言擴展

ServiceMesher2018-11-12 03:32:26

作者:Cilium team 譯者:馬若飛 原文:https://cilium.io/blog/2018/10/23/cilium-13-envoy-go

我們很高興地宣佈Cilium 1.3發佈了。這個版本加入了幾個新特性。主要的亮點是實現了Cassandra和帶有策略執行能力的Memcached協議,作為Envoy的Go語言擴展包。

和往常一樣,整個Cilium社區的開發者貢獻巨大,他們在1.2到1.3版本的這段時間貢獻了785個提交。

什麼是Envoy的Go語言擴展?

從1.0版本開始,我們一直依賴Envoy處理所有的HTTP、gRPC以及HTTP的派生如Elasticsearch的請求。社區討論如何擴大支持7層協議的範圍,Envoy作為推動未來協議補充的首選平臺是顯而易見的。焦點迅速轉移到尋找簡化Envoy可擴展性的方法,並且允許重用現有的開源項目,如CNCF項目Vitess。於是實現Envoy的Go擴展的想法就誕生了。

在Cilium 1.3中,我們引入了Envoy的Go擴展作為其Beta特性。

  • 擴展的透明注入:在Cilium的幫助下,被透明地重定向到Envoy,而不需要修改應用程序或pod。重定向基於目標端口配置,可以根據labels、IPs、DNS以及ingress和egress連接的服務名稱限定到源或目標服務,並通過擴展的名稱將連接映射到擴展。重定向是通過CiliumNetworkPolicy CRD或REST API配置的。Envoy可以被配置為在每個pod中作為sidecar或作為每個node的獨立代理運行。

  • 完全分佈式:Go擴展完全分佈在每個Envoy節點或pod內部,不需要為一個數據處理的集中化控制面板。當然,go擴展本身可以調用任意的外部控制面板組件來報告遙測數據或驗證請求。

  • 動態擴展映射:Go擴展被設計為共享庫提供給Envoy。Cilium可以根據設置好的重定向自動加載相應的Go擴展來配置Envoy,並在連接數據時調用它。未來的版本將支持在運行時更新和重新加載擴展,而無需重啟Envoy並且也不會丟失連接狀態。

  • 通過CRD配置擴展:通過CRD或REST API使用通用鍵值對配置Go擴展。這允許傳遞如安全策略、安全令牌或其他的配置,而無需讓Envoy知道。

  • 通用訪問日誌:與配置類似,擴展可以返回通用鍵值對,這些鍵值對將提取的可見性傳遞到訪問日誌層。

  • 沙盒化:沙盒確保任何解析器的不穩定性都不會破壞Envoy的核心。受Matt Klein發表的文章Exceptional Go啟發,解析器被容許panic或拋出異常。當panic發生時,信息被記錄到訪問日誌中,TCP連接與被關閉的請求關聯。

Cilium是什麼?

Cilium是一個開源軟件,可以透明地提供和保護部署在諸如Kubernetes、Docker和Mesos等Linux容器管理平臺的應用程服務之間的網絡和API連接。

Cilium的基礎是一種新的Linux內核技術BPF,它支持在Linux內部動態的注入安全、可見性和網絡控制邏輯。除了提供傳統的網絡層安全,BPF的靈活性還讓API和流程級別的安全,保護容器或pod間通信成為了可能。因為BPF在Linux內核中運行,Cilium的安全策略可以在不修改程序代碼或容器配置的情況下使用和更新。

有關Cilium更詳細的介紹請參見Introduction to Cilium

Envoy是什麼?

Envoy是一個7層代理和通信總線,被設計用於大型的面向服務的架構。這個項目誕生於以下理念:

網絡應該對應用程序透明。當網絡和應用程序出現問題時,應該很容易確定問題的根源。

你可以通過Envoy的文檔 What is Envoy瞭解更多關於Envoy的內容。

怎樣編寫Envoy的Go語言擴展

編寫Envoy的Go擴展很簡單。為說明這一點,我們將為R2-D2控制協議實現一個基本的協議解析器,並實現過濾邏輯用來排除任何包含字符串”C-3PO”的控制請求。

要實現擴展的主要API是 OnData()函數,當Envoy收到通過 CiliumNetworkPolicy映射到擴展連接的數據時,就會調用這個函數。函數必須解析數據並返回下面的斷言之一:

  • MORE:解析器需要更多的字節來繼續解析。

  • PASS:傳遞n字節數據流。

  • DROP:刪除n字節數據流。

  • INJECT:向指定的方向注入n字節的數據。

  • ERROR:發生瞭解析錯誤,連接必須關閉。

  • NOP:什麼也沒發生。

為了註冊擴展,需要創建一個必須實現 Create()函數的解析器工廠。當Envoy建立了一個新的連接並使用解析器時就會調用該函數。

  1. import (

  2.        "github.com/cilium/cilium/proxylib/proxylib"

  3. )

  4. type parser struct{

  5.        connection *proxylib.Connection

  6. }

  7. func (p *parser) OnData(reply, endStream bool, dataArray [][]byte) (proxylib.OpType, int) {

  8.        data := string(bytes.Join(dataArray, []byte{}))

  9.        msgLen := strings.Index(data, "\r\n")

  10.        if msgLen < 0 {

  11.                return proxylib.MORE, 1 // No delimiter, request more data

  12.        }

  13.        msgStr := data[:msgLen]

  14.        msgLen += 2 // Inlcude the "\r\n" in the request

  15.        if reply {

  16.                return proxylib.PASS, msgLen // Pass responses without additional parsing

  17.        }

  18.        if strings.Contains(msgStr, "C-3PO") {

  19.                return proxylib.DROP, msgLen

  20.        }

  21.        return proxylib.PASS, msgLen

  22. }

  23. type factory struct{}

  24. func (f *factory) Create(connection *proxylib.Connection) proxylib.Parser {

  25.        return &parser{connection: connection}

  26. }

  27. func init() {

  28.        proxylib.RegisterParserFactory("r2d2", &factory{})

  29. }

最後,將新的解析器導入到proxylib包中。 libcilium.so將包含解析器並被Envoy加載。編輯文件 proxylib/proxylib.go

  1. import (

  2.        [...]

  3.        _ "github.com/cilium/cilium/proxylib/r2d2"

  4. )

上面的示例省略了擴展配置、集成到策略代碼庫以及訪問日誌等內容。學習如何編寫Go擴展,請參閱指南Envoy Go Extensions。

Cassandra支持(Beta)

Cassandra 是一個流行的NoSQL數據庫管理系統。它通常被多個服務大規模的訪問並在團隊間共享。Cilium 1.3引入了對Apache Cassandra 協議的支持,並提供了可見性和策略執行能力。

Cassandra的Go擴展能夠在以下協議字段上提供可見性和執行能力:

  • query_action: 這個行為在數據庫的 SELECT, INSERT, UPDATE等操作上執行,字段總是精確匹配。

  • query_table: 查詢執行的表,以正則表達式進行匹配。

例子:Empire如何通過表限制Cassandra訪問

下面的示例展示了Empire如何暴露有限的訪問給運行在端口9042的Empire Cassandra集群。Outposts被標籤 app=empire-outpost標識,並具有以下權限:

  • SELECT 操作在表"system.”和”system_schema.“上執行

  • INSERT操作在表"attendance.daily_records"上執行。注意outposts不能從這些表讀取,因此不能從其他outposts讀取每日記錄。

  1. apiVersion: "cilium.io/v2"

  2. kind: CiliumNetworkPolicy

  3. description: "Allow only permitted requests to empire Cassandra server"

  4. metadata:

  5. name: "secure-empire-cassandra"

  6. specs:

  7. - endpointSelector:

  8.  matchLabels:

  9.    app: cass-server

  10. ingress:

  11. - fromEndpoints:

  12.  - matchLabels:

  13.      app: empire-outpost

  14.  toPorts:

  15.  - ports:

  16.    - port: "9042"

  17.      protocol: TCP

  18.    rules:

  19.      l7proto: cassandra

  20.      l7:

  21.      - query_action: "select"

  22.        query_table: "system\\..*"

  23.      - query_action: "select"

  24.        query_table: "system_schema\\..*"

  25.      - query_action: "insert"

  26.        query_table: "attendance.daily_records"

這是一個簡單的例子,更多複雜示例請參閱 Cassandra getting started guide 。

Memcached支持(Beta)

Memcached是一種流行的基於內存的分佈式緩存,通常用於緩存或在服務之間共享數據。隨著memcached解析器的golang擴展加入Envoy,Cilium現在可以執行安全規則去限制memcached客戶端的某些命令,比如讀寫,也可以根據key前綴進行限制。

例子:Rebels如何保護共享的memcached服務

在下面的示例中,Rebels運行了一個標籤為 app=memcached的memcached服務,幾個服務與memcached交互並應用不同的規則:

  • function=fleet-maintenance 標識的維護服務被授予對前綴為 alliance/fleet的所有key的讀寫權限。禁止訪問任何其他key。

  • function=fleet-monitoring標識的監控服務僅對前綴為 alliance/fleet的key授予讀權限。禁止對前綴中的key進行寫入訪問或訪問前綴之外的任何key。

  • 所有Jedis被標籤 role=jedi標識,擁有完整的Memcached服務,可以訪問所有的key。

  1. apiVersion: "cilium.io/v2"

  2. kind: CiliumNetworkPolicy

  3. description: "Secure the Rebel memcached service"

  4. metadata:

  5.  name: "secure-rebel-alliance-memcache"

  6. specs:

  7.  - endpointSelector:

  8.      matchLabels:

  9.        app: memcached

  10.    ingress:

  11.    - fromEndpoints:

  12.      - matchLabels:

  13.          function: fleet-maintanence

  14.      toPorts:

  15.      - ports:

  16.        - port: "11211"

  17.          protocol: TCP

  18.        rules:

  19.          l7proto: memcache

  20.          l7:

  21.          - command: "writeGroup"

  22.            keyPrefix: "alliance/fleet/"

  23.          - command: "get"

  24.            keyPrefix: "alliance/fleet/"

  25.    - fromEndpoints:

  26.      - matchLabels:

  27.          function: fleet-monitoring

  28.      toPorts:

  29.      - ports:

  30.        - port: "11211"

  31.          protocol: TCP

  32.        rules:

  33.          l7proto: memcache

  34.          l7:

  35.          - command: "get"

  36.            keyPrefix: "alliance/fleet/"

  37.    - fromEndpoints:

  38.      - matchLabels:

  39.          role: jedi

  40.      toPorts:

  41.      - ports:

  42.        - port: "11211"

  43.          protocol: TCP

  44.        rules:

  45.          l7proto: memcache

  46.          l7:

  47.          - command:

使用memcached的完整示例,請參閱 Memcached getting started guide。

社區

Linux基金會"Core Infrastructure Initiative"最佳實踐

我們致力於在開放和最好的開源實踐中開發Cilium,包括對安全的堅定承諾。我們很高興地宣佈,我們已經完成了所有工作,獲得了Linux基金會 Core Infrastructure Initiative的 CII Best Practices殊榮 。在 這裡瞭解更多關於獎章的信息。

特別興趣組(SIG)介紹

社區的關注點越來越多樣化。為了確保項目的可伸縮性,我們正式引入了特殊興趣組(SIGs)來幫助提供一些組織結構。已經創建了以下的SIGs:

  • Datapath: (#sig-datapath) 所有BPF和Linux內核相關的數據通路代碼擁有者。

  • Documentation: (#sig-docs) 所有文檔相關的討論。

  • Envoy: (#sig-envoy) Envoy, Istio和所有7層協議解析器的維護。

  • Policy: (#sig-policy) 所有策略相關的主題。這個SIG負責所有與安全相關的API和實現邏輯。

  • Release Management: (#launchpad) 負責發佈管理和向後移植的過程。

任何人都可以建立額外的SIGs。這個過程很簡單有文檔說明

1.3 版本新特性

  • Envoy的Go語言擴展

  • 令人興奮的全新的Envoy Go擴展API,包括通用配置和訪問日誌API(Beta版本)

  • Cassandra和Memcached 協議支持

  • 使用新的Envoy Go擴展實現了Cassandra和Memcached的新協議解析器。這兩個解析器都使用精確匹配、前綴匹配和正則表達式為操作類型和鍵/表名提供可見性和強制安全策略。(Beta)

  • 安全性

  • 為DNS/FQDN策略規則提供TTLs支持。

  • 引入kube-dns、coredns和etcd操作符的標識。

  • 新的安全標識"unmanaged"代表沒有被Cilium管理的pod。

  • 改進的安全實體“集群”,允許為集群中的所有pod定義策略(已管理、未管理和主機網絡的)。

  • 額外的遙測指標和監控

  • 新的"cilium metrics list"命令通過CLI查看metrics列表。

  • 許多額外的metrics:連接跟蹤垃圾回收,Kubernetes資源事件,IPAM, 再生節點,服務,錯誤和警告計數器。

  • 具有更高效的編解碼協議的新監控接口。默認情況下用於較老的客戶端。

  • 網絡改進

  • 將連接跟蹤表劃分為TCP和非TCP,以更好地處理每個協議的長短連接的混合。

  • 通過ConfigMap描述連接表大小的能力。

  • 通過NodePort和HostPort更好的偽裝流量行為,容許pods可以查看原始源IP。

  • 全鍵值存儲彈性

  • 引入了在任何狀態丟失後立即重新構造鍵值存儲內容的能力。允許從備份中恢復etcd,或者在運行的集群中完全刪除它,並影響最小。(Beta)

  • 效率和擴展

  • 在計算獨立endpoint策略的成本方面有重大改進。關於這方面的工作還在繼續。

  • 新的寬限期,通過工作負載更改身份最小化連接影響。

  • 更高效的安全身份分配算法。

  • 新的通用框架檢測和忽略Kubernetes事件通知,Cilium不需要動作。

  • 在避免不必要的BPF編譯方面的改進,以減少由此導致的CPU負載。初始化BPF模板以避免全編譯。

  • Kubernetes

  • 增加對Kubernetes 1.12的支持

  • 為CiliumEndpoints CRD自定義列 (需要Kubernetes 1.11支持)

  • 為ulibc的兼容性從cilium-cni移除cgo

  • 移除對Kubernetes 1.7的支持

  • 文檔

  • 新的Ubuntu 18.04手冊

  • 對最新的BPF運行時特性的覆蓋,例如BTF(BPF Type Format)

  • 針對運行多主機網絡的虛擬機/主機防火牆需求的文檔

  • 長期穩定版本(LTS)

  • 1.3已經聲明為LTS版本,在後續的6個月將作為向後移植的版本繼續支持

更新指導

請查閱upgrade guide去更新你的Cilium部署,可以隨時在Slack上聯繫我們。

發佈

  • 發佈記錄和二進制文件 1.3.0

  • 容器鏡像: docker.io/cilium/cilium:v1.3.0

點擊【閱讀原文】跳轉到網站上瀏覽可以查看文中的鏈接。

新聞

Kubernetes兩位聯合創始人創辦的Heptio公司被VMWare收購

Istio

IBM Istio

  • 111 Istio

  • 118 週四晚8點Istio系列第二講:上手Istio: 基本概念,安裝並使用istio進行微服務流量管控

  • 1115 Istio

  • 1122 Envoy

  • 1129 使Istio

  • 126 Istio mixer -

  • 1213 Istio

  • 1220 Istio使Serverless knative

  • IBMIstio


  • SOFAMesh(https://github.com/alipay/sofa-mesh)基於Istio的大規模服務網格解決方案

  • SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go語言開發的高性能Sidecar代理

合作社區

參與社區

以下是參與ServiceMesher社區的方式,最簡單的方式是聯繫我!

  • 加入微信交流群:關注本微信公眾號後訪問主頁右下角有獲取聯繫方式按鈕,添加好友時請註明姓名-公司

  • 社區網址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀請才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文檔進度追蹤:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章線索與投稿:https://github.com/servicemesher/trans



閱讀原文

TAGS: