作者:Cilium team
譯者:馬若飛
原文:cilium.io/blog/2018/1…
我們很高興地宣佈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建立了一個新的連線並使用解析器時就會呼叫該函式。
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: 這個行為在資料庫的
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讀取每日記錄。
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 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
ServiceMesher社群資訊
微信群:聯絡我入群
Slack:servicemesher.slack.com 需要邀請才能加入
Twitter: twitter.com/servicemesh…
GitHub:github.com/
更多Service Mesh諮詢請掃碼關注微信公眾號ServiceMesher。