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

做者:Cilium team 
譯者:馬若飛 
原文: cilium.io/blog/2018/1…

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

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

什麼是Envoy的Go語言擴展?

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

在Cilium 1.3中,咱們引入了Envoy的Go擴展做爲其Beta特性。golang

  • 擴展的透明注入:在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而且也不會丟失鏈接狀態。docker

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

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

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

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創建了一個新的鏈接並使用解析器時就會調用該函數。

import (        "github.com/cilium/cilium/proxylib/proxylib")​type parser struct{        connection *proxylib.Connection}​func (p *parser) OnData(reply, endStream bool, dataArray [][]byte) (proxylib.OpType, int) {        data := string(bytes.Join(dataArray, []byte{}))        msgLen := strings.Index(data, "\r\n")        if msgLen < 0 {                return proxylib.MORE, 1 // No delimiter, request more data        }​        msgStr := data[:msgLen]        msgLen += 2 // Inlcude the "\r\n" in the request​        if reply {                return proxylib.PASS, msgLen // Pass responses without additional parsing        }​        if strings.Contains(msgStr, "C-3PO") {                return proxylib.DROP, msgLen        }​        return proxylib.PASS, msgLen}​type factory struct{}​func (f *factory) Create(connection *proxylib.Connection) proxylib.Parser {        return &parser{connection: connection}}​func init() {        proxylib.RegisterParserFactory("r2d2", &factory{})}複製代碼

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

import (        [...]        _ "github.com/cilium/cilium/proxylib/r2d2")複製代碼

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

Cassandra支持(Beta)

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

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

  • query_action: 這個行爲在數據庫的SELECTINSERTUPDATE等操做上執行,字段老是精確匹配。

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

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

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

  • SELECT 操做在表"system.

    」和」system_schema.
    「上執行

  • INSERT操做在表"attendance.daily_records"上執行。注意outposts不能從這些表讀取,所以不能從其餘outposts讀取每日記錄。

apiVersion: "cilium.io/v2"kind: CiliumNetworkPolicydescription: "Allow only permitted requests to empire Cassandra server"metadata:name: "secure-empire-cassandra"specs:- endpointSelector:  matchLabels:    app: cass-serveringress:- fromEndpoints:  - matchLabels:      app: empire-outpost  toPorts:  - ports:    - port: "9042"      protocol: TCP    rules:      l7proto: cassandra      l7:      - query_action: "select"        query_table: "system\\..*"      - query_action: "select"        query_table: "system_schema\\..*"      - query_action: "insert"        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。

apiVersion: "cilium.io/v2"kind: CiliumNetworkPolicydescription: "Secure the Rebel memcached service"metadata:  name: "secure-rebel-alliance-memcache"specs:  - endpointSelector:      matchLabels:        app: memcached    ingress:    - fromEndpoints:      - matchLabels:          function: fleet-maintanence      toPorts:      - ports:        - port: "11211"          protocol: TCP        rules:          l7proto: memcache          l7:          - command: "writeGroup"            keyPrefix: "alliance/fleet/"          - command: "get"            keyPrefix: "alliance/fleet/"    - fromEndpoints:      - matchLabels:          function: fleet-monitoring      toPorts:      - ports:        - port: "11211"          protocol: TCP        rules:          l7proto: memcache          l7:          - command: "get"            keyPrefix: "alliance/fleet/"    - fromEndpoints:      - matchLabels:          role: jedi      toPorts:      - ports:        - port: "11211"          protocol: TCP        rules:          l7proto: memcache          l7:          - command:複製代碼

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

社區

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

咱們致力於在開放和最好的開源實踐中開發Cilium,包括對安全的堅決承諾。咱們很高興地宣佈,咱們已經完成了全部工做,得到了Linux基金會 Core Infrastructure InitiativeCII 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

ServiceMesher社區信息

微信羣:聯繫我入羣

社區官網:www.servicemesher.com

Slack:servicemesher.slack.com 須要邀請才能加入

Twitter: twitter.com/servicemesh…

GitHub:github.com/

更多Service Mesh諮詢請掃碼關注微信公衆號ServiceMesher。

相關文章
相關標籤/搜索