本文分享自華為雲社群《Kmesh v0.4釋出!邁向大規模 Sidecarless 服務網格》,作者: 雲容器大未來。
近日 Kmesh 釋出了 v0.4.0 版本,感謝社群的貢獻者在兩個多月的時間裡做出了巨大的努力,使得 Kmesh 取得功能完整度、穩定性、可靠性的多重提升。當前 Kmesh 相較業界其他方案已經具備顯著的資源開銷小和低延時等優勢,後續我們會繼續在核心功能和大規模穩定性等方面重點投入,爭取儘快達到 GA(生產可用)。
Kmesh 背景回顧
儘管服務網格已經在過去幾年持續曝光,獲得了很大的知名度,但是 Sidecar 模式在資源開銷、資料鏈路時延等方面對工作負載產生了很大的影響。所以使用者在落地選型時,還是比較謹慎。除此之外,Sidecar 模式還有一個比較大的缺點是 Sidecar 與業務容器生命週期完全繫結,無法做到獨立升級。
因此 Kmesh 創新性的提出基於核心的 Sidecarless 的流量治理方案,將流量治理下沉到核心以解決 Sidecar 模式使用者關心的一些問題。eBPF 技術非常適合四層的流量治理,加上可程式設計核心模組可以進行七層的流量編排。Kmesh 最早完全透過 eBPF 和核心模組進行 L4-L7 的治理。Kmesh 採用隨流治理的策略,不會額外增加服務通訊過程中的連線跳數,相比 Sidecar 模式,服務之間的通訊連線數從三條減少到一條。
為了豐富七層協議的治理能力,今年 Kmesh 增加了一種新的治理模式 Workload:遠端流量治理,利用 ebpf 將流量轉發到 kmesh-waypoint,進行高階的七層協議治理,這是一種更加靈活的分層治理模型,能夠按需滿足不同使用者的需求。
目前 Kmesh 基於 Istio 控制面,提供了新的服務網格資料面引擎,詳細的架構如下:
Kmesh v0.4版本關鍵特性解析
IPv6支援
以前 Kmesh 只支援採用 IPv4 通訊的服務治理,但是當前 Kubernetes 叢集已經預設支援雙棧叢集,我們不能假設服務只採用 IPv4 協議通訊,因此在 0.4 版本中我們適配了 IPv6 的協議特徵,支援了 IPv6 的服務治理。
值得注意的是:即使在 IPv4 叢集中,Java 應用在通訊時,預設採用 IPv6 地址族進行通訊,所以如果需要採用 Kmesh 對 Java 服務進行治理,請一定要升級 Kmesh 0.4 版本。
IPv6 目前只在 Workload 模式下完整支援。請期待下一個版本中,Kmesh 本地模式(流量治理完全下沉核心)也將完全支援 IPv6 協議族。
細粒度的流量治理
v0.4 版本,除了按照 Namespace 進行服務的納管以外,我們還支援了按照 pod 粒度進行流量的納管治理。一定程度上增加了靈活性,滿足了客戶只針對一個名稱空間下的特定工作負載進行治理的需求。
特定 Pod 納管
kubectl label pod <podName> istio.io/dataplane-mode=kmesh -n {namespace}
整個 Namespace 納管
kubectl label ns <namespace> istio.io/dataplane-mode=kmesh
Kmesh 透過檢查 Pod 及 Namespace 上面標籤,在不同的元件中進行 Pod 的納管。
- 場景一:Pod 建立時已經打上了標籤,那麼 kmesh 透過 Kmesh-cni 在容器網路初始化的時候通知 kmesh eBPF 程式進行納管,保證工作負載啟動之前完成納管,不會遺漏任何資料包的治理。
- 場景二:在 pod 啟動之後,再為 Pod 打上 istio.io/dataplane-mode:kmesh標籤,那麼 Kmesh-daemon 會監聽 Pod 事件,檢查到標籤更新後,通知 kmesh ebpf 程式進行納管。
- 場景三:去掉 istio.io/dataplane-mode:kmesh 標籤,允許 Pod 不被 Kmesh 納管。
這種納管方式更加靈活,也方便了使用者在發現服務訪問故障之後,快速進行故障隔離,定位定界。
支援叢集外部服務治理
在服務網格中,我們可以透過 ServiceEntry 定義網格外部服務,一般為 DNS 型別。
apiVersion: networking.istio.io/v1 kind: ServiceEntry metadata: name: external-svc spec: hosts: - news.google.com location: MESH_EXTERNAL ports: - number: 80 name: http protocol: HTTP resolution: DNS
對於這種服務,控制面為其生成 STRICT_DNS 型別的 Cluster, endpoint 地址為域名。
eBPF 程式不能進行 DNS 解析,因此不能根據域名進行 DNAT。在 Kmesh 0.4 版本中,我們新增了 DNS 解析模組,在使用者態首先進行 DNS 解析,然後重寫 Cluster 將域名替換成IP地址,再重新整理給 eBPF 程式進行 DNAT。典型工作原理如圖所示:
DNS 型別服務的治理,大大擴充了 Kmesh 服務治理的範疇,由 Kubernets 叢集,擴充套件到外部服務。
基於 eBPF 的輕量化可觀測
可觀測性是服務網格中很重要的基礎能力,對於瞭解資料面通訊的狀態具有重大意義,可以基於監控進行告警。Kmesh 採用了分層觀測架構,在治理資料面,核心中存在大量可用於觀測的指標資料,Kmesh 透過 eBPF 以極低的代價將這些微觀、細粒度指標收集起來,並支援鏈路級、Pod 級等多維度資訊採集;並透過 ringbuf map 上報給 kmesh-daemon 元件,daemon 中根據實時訂閱的觀測資料,再組織加工成使用者可理解的可觀測資訊。
當前 Kmesh 已支援以下四種監控指標,每一種指標都透過標籤標識源和目的應用,使用者還可以配置 Prometheus 進行採集。
- kmesh_tcp_connections_opened_total
- kmesh_tcp_connections_closed_total
- kmesh_tcp_received_bytes_total
- kmesh_tcp_sent_bytes_total
接下來,社群將繼續豐富metrics、access log等觀測的採集,並完善與Prometheus、Grafana 等觀測平臺的對接。
線上日誌級別調整
動態日誌級別調整對於故障診斷具有很大的幫助,早期的版本,如果要分析 bpf 資料面的問題,獲取更詳細的定位日誌,你需要修改程式碼並重新構建映象,整個過程非常低效;新版本中被徹底改善,我們支援了線上日誌級別調整,使用者透過 Kmesh 運維命令,可實時調整使用者態 Kmesh-daemon 和 bpf 程式的日誌級別。
使用樣例如下:
#Adjust kmesh-daemon log level (e.g., debug | error | info) kubectl exec -ti -n kmesh-system kmesh-6ct4h -- kmesh-daemon log --set default:debug #Adjust kmesh eBPF data plane log level kubectl exec -ti -n kmesh-system kmesh-6ct4h -- kmesh-daemon log --set bpf:debug
除了新特性的加入,v0.4 版本在可維護性、大規模效能、可測試性等方面也做出了諸多改進。
大規模叢集支援
生產環境中,根據部署業務的不同,叢集規模可大可小,對於 Kmesh 來說,大規模叢集更能展現 Kmesh 架構的優勢,經過評估,Kmesh 需要支援 5000 服務,10萬 pod 級的叢集管理,以滿足絕大多數生產使用訴求。
對於遠端模式,Kmesh 修改了 bpf map 的建立模式,支援按需申請 bpf map 中的記錄,這樣我們可以很容易的支援大規模叢集,且不引入冗餘的記憶體開銷;
對於本地模式, bpf map 更新慢的問題一直困擾著我們,原本重新整理一條規則需要幾十甚至上百毫秒,0.4 版本,我們最佳化了 map-in-map 的初始化邏輯,透過空間換時間的策略,消除了 map-in-map 的重新整理耗時,將規則的重新整理降低到 ms 以內,這為後續支援大規模奠定了堅實的基礎。
E2E測試
Kmesh 當前正處於快速膨脹的成長期,新特性正源源不斷的加入到 Kmesh 中,如何保障社群的整體質量,確保 Kmesh 平穩有序的向前發展是社群面臨的重要挑戰;雖然社群已經有 UT test 做功能防護,但我們還缺少黑盒視角、叢集級的功能防護;為此社群引入了 E2E 測試框架,並將其部署在 PR 門禁中,這樣,每個新 PR 提交時,就可以及時檢查新提交對於已有功能的影響,這對於 Kmesh 非常有用,當前 E2E 測試框架已經部署上線,並增加了部分測試用例,後續將不斷豐富測試集,也歡迎社群的小夥伴們共同完善Kmesh測試防護網。詳細的執行E2E測試請參考https://kmesh.net/en/docs/developer/e2e-guide/
加入社群貢獻
我們希望藉助在 Istio 社群長期的積累,始終以開放中立的態度發展 Kmesh,打造 Sidecarless 服務網格業界標杆方案,服務千行百業,促進服務網格健康有序的發展。Kmesh 當前正處於高速發展階段,我們誠邀廣大有志之士加入!
參考連結
[1] Kmesh Website:https://kmesh.net/
[2] Kmesh Release v0.4.0:https://github.com/kmesh-net/kmesh/releases/tag/v0.4.0
[3] 可觀測性設計:https://github.com/kmesh-net/kmesh/blob/main/docs/proposal/observability.md
點選關注,第一時間瞭解華為雲新鮮技術~