雲原生中介軟體 — Kafka Operator 總覽篇

語言: CN / TW / HK

中介軟體的上雲進入到了一個真正的生產落地的過程,Kafka 作為一個高效能,高吞吐能力的訊息系統,被很多系統採用。對於 Kafka 的上雲,是幾乎每一個客戶都會提出的需求。接下來,就來了解社群中在 Kafka 上雲的實踐,以及相關技術分析。本文介紹以 CNCF 的 Strimzi Kafka Operator 專案為例進行分析。對於雲原生的中介軟體一些設計規範和思路,可參見  雲原生中介軟體 — Redis Operator 篇

01

需求分析

首先,先來大概分析一下,客戶對 Kafka 的使用需求大概有哪些。

  • Topic 的管理
  • 使用者的管理
  • 許可權的管理
  • 叢集的高可用
  • 叢集的統一外部訪問入口
  • 叢集的監控和告警
  • 叢集的擴縮容
  • 跨叢集的資料複製
  • 叢集的資料的 Rebalance
  • 叢集的自動化運維能力
  • 雲原生方式提供服務
  • 頁面化管理叢集的能力
  • 大資料元件對接
  • 開放的 API 能力,方便上層能力的建設
  • 儲存的開放性,適配 CSI
  • 部署編排的多樣性
  • 叢集負載智慧分析和擴容計劃的執行
  • 叢集版本的相容和升級
  • 叢集的資料傳輸安全
  • 叢集異構環境的適配能力
  • 租戶隔離

02

相關術語

Strimzi Kafka Operator:社群的 Kafka Operator 的實現。Kafka 還是那個 Kafka,特點是結合了各種技術,為 Kafka 添加了雲原生特色,讓其成為了雲原生 Kafka 系統。

User:Kafka 的客戶端連線 Kafka 叢集,需要設定的認證相關的配置資訊。

ACL:安全訪問控制,定義了哪些 User 可以訪問哪些資源,如 Group,Topic。

Connect:顧名思義理解成連線,用於解決連線到外部資料來源的意思。

Connector:聯結器,用於真正執行連線到資料來源之後,資料的處理能力。

Bridge:橋,指的是連線 http 的 client 到 Kafka 叢集的能力,通過 http 的 api 的方式傳送和消費訊息。

Source:源,指的是源頭,代表被處理的資料所在的位置。

Sink:這裡指的是將什麼放入什麼的意思,比如將從檔案讀出來的資料,處理好之後儲存到資料庫中,那資料庫就是 Sink 的物件。

MirrorMaker:可以理解成流量的複製,從一個叢集複製到另一個叢集。

Exporter:這裡指的是 Prometheus 的 Exporter,用於匯出監控的資料到 Prometheus 這個時序資料庫。

Rebalance:再平衡/重新平衡,在 Kafka 叢集執行一段時間之後,對著對叢集的運維,增加或者刪除節點,分片和副本在機器上分佈不均衡,會導致有的機器負載很高,有的很低,需要再平衡的方式來保持機器的負載都是相對合理的。

Cruise-control:字面意思理解成定速巡航,實際在 Kafka 中,代表著控制 Kafka 叢集的執行狀態,讓其保持穩定,通過 Rebalance 的方式完成。

Broker:Kafka 叢集的真正的工作節點,用於提供客戶端連線,排程分片和副本,接收訊息,儲存訊息,傳遞訊息。

Topic:這是訊息系統中的常見概念。用於定義訊息佇列。

分片:分片定義了訊息儲存和消費的位置。一個 Topic 可以有多個分片,一個分片可以有多個副本。

副本:副本是為了保證訊息的可靠性,使用冗餘的機制,資料的副本資料分佈在不同的機器。

03

能力介紹

以下架構圖介紹了 Strimzi Kafka Operator 提供的圍繞 Kafka 叢集的整體能力,這裡暫不涉及 Strimzi Kafka Operator 本身內部的實現架構,在後面部分會介紹 Strimzi Kafka Operator 本身內部的實現架構。

Kafka Cluster:這裡指的就是 Kafka 叢集的 Broker 節點組成的叢集,可以在建立的時候設定叢集的規模。

Kafka Connect:這裡指的是通過 Kafka 的 Connect 能力封裝的消費資料來源資料進行處理之後輸出到其它系統的能力,可以用來完成資料的處理和加工。

Kafka Bridge:這裡的 Bridge 提供了基於 http 的 api 的的方式和 Kafka 叢集進行資料通訊的能力。

Kafka Exporter:這裡的 exporter 是 Prometheus 的 exporter 規範的實現,提供了監控 Kafka 叢集的能力。

Kafka MirrorMaker:這裡的 MirrorMaker 是實現了不同的 Kafka 叢集之間,資料進行復制的能力。

ZooKeeper:這裡的 ZooKeeper 主要用於 Kafka 叢集本身的依賴,同時也會儲存 Strimzi Kafka Operator 本身的一些內部的業務資料。

04

業務模型

StrimziKafka Operator 提供的一些常見的能力介紹。

Kafka:這是建立和管理 Kafka 叢集的資源物件,會根據配置建立 Brokers,ZooKeeper 叢集,設定需要的儲存,開啟叢集監控,開啟使用者管理能力,開啟 Topic 管理能力,設定安全通訊,設定對外訪問方式,開啟 Cruise Control 能力。在叢集建立成功之後,會在狀態中展示 Kafka 叢集的連線地址

KafkaTopic:使用者在 Kafka 叢集中創建出 Topic,對應的會在 Kafka 的叢集中創建出 Topic 出來。

KafkaUser:建立使用者,用於在客戶端連線的時候,使用對應的使用者進行連線,同時會為使用者設定對應的許可權,如對哪些 Topic 有 Read 許可權,哪些有 Write 許可權,哪些有 Describe 許可權,哪些有 Create 許可權等等。沒有設定正確的許可權,會影響正常的 Topic 的訪問。

KafkaRebalance:用於定義對 Kafka 叢集的哪些資源的使用情況進行智慧的分析,定義分析的目標,以及根據定義的分析目標,生成推薦的運維提案,以便根據推薦的方式對 Kafka 的叢集進行合理的運維。

KafkaConnect:定義了 Kafka 的 Connect 能力,會啟動一個工作負載,提供 http 的服務。Kafka 本身已經定義了一些開箱即用的 Plugins,用於對外部資料進行消費處理,當然也可以定義開發需要的外掛。KafkaConnect 會建立工作負載,用於執行這些外掛,同時提供 RestAPI 去查詢有哪些 Plugins,以及有哪些 connectors 在執行和處理資料,這個 connector 就是真正處理資料的地方。

KafkaConnector:用於定義真正執行資料處理能力的 connectors。以下例子定義了讀取檔案資料,然後傳送到 Topic 的能力,這裡有一個最大 Task 的定義。

KafkaMirrorMaker / KafkaMirrorMaker2:完成兩個 Kafka 叢集之間資料的複製,舉例來說兩個機房的兩個 Kafka 之間資料保持同步的能力。以下例子定義了源叢集和目標叢集,以及定義了進行復制能力的 Connectors。

Ka fkaBridge: 定義通過 RestAPI 的方式完成訊息的傳送和消費的能力,會啟動工作負載,提供 http 的服務。以下例子定義了啟動一個副本的工作負載,監聽了 8080 埠提供 http 的 API 能力,同時 Kafka Bridge 連線到 Kafka 叢集,最終完成 web client 通過 Kafka Bridge 提供的 RestAPI 去傳送和消費訊息。

05

架構介紹

總體架構:主要包含了以下 Operator 的能力,構建出了 Kafka Operator 的核心能力,其中 MirrorMaker 相關包含 MirrorMaker 和 MirrorMaker2 兩個版本,以及 Kafka Connect 包含 KafkaConnectOperator 、 KafkaConnectorOperator 和 ConnectBuildOperator。

Cluster Operator:包含了 Strimzi Kafka Operator 所需相關的所有的 Operators 的包裝,包括 KafkaOperator、KafkaConnectOperator、KafkaMirrorMakerOperator、KafkaMirrorMaker2Operator、KafkaBridgeOperator、KafkaRebalanceOperator,以及啟動這些 Operators。

Kafka Operator:主要完成整個 Kafka 叢集的建立,包含 Kafka 的 Brokers,Kafka 依賴的 ZooKeeper 叢集,負責建立 UserOperator 和 TopicOperator 的 Entity Operator,監控 Kafka 叢集的 Kafka Exporter,用於智慧分析 Kafka 實際執行負載的 Cruise Control,Kafka 對內/對外的安全通訊的 TLS,以及 Kafka 對外提供訪問的方式。

Entity Operator:這裡的 Entity 可以理解成 Kafka 叢集的業務實體,對於 User 和 Topic 就是業務實體,每一套的 Kafka 叢集的 User 和 Topic 都是獨立管理的。Entity Operator 負責創建出 UserOperator 和 TopicOperator 例項,用於管理單個 Kafka 叢集的 User 和 Topic 的業務處理。每一套 Kafka 叢集都有獨立的 Entity Operator。

User Operator:負責創建出 User,這裡的 User 的表現形式主要包括 Mutual TLS client 客戶端證書形式的 User 定義,SASL SCRAM-SHA-512 形式的 User 定義,OAuth 的 User 形式。同時根據使用者的許可權的配置生成對應的鑑權配置,控制使用者對 Topic 以及 Group 等 Kafka 的能力進行安全訪問控制。

每一套 Kafka 叢集都有獨立的 User Operator。

Topic Operator:複雜根據期望的 Topic 的配置在 Kafka 中建立 Topic,包括分割槽數,副本數,retention.ms 的時間,segment.bytes 的大小等 Topic 相關的配置。每一套 Kafka 叢集都有獨立的 Topic Operator。

KafkaConnect Operator:KafkaConnect 資源物件負責建立 Kafka Connect 服務,用於管理 Kafka Connector。

KafkaConnector Operator:Kafka Connector 資源物件會使用 Kafka 的外掛,啟動對應的 connector task 去消費資料,處理資料和傳輸資料到外部儲存系統。

ConnectBuild Operator:負責根據外掛的原始碼去構建出新的 connectors 映象,根據構建出來的這些新的能力,去處理資料。 在 Kubernetes 平臺上使用 Kaniko, 在 OpenShift 使用 BuildConfig 去完成映象的構建。

KafkaBridge Operator:負責啟動 Bridge 的服務,Bridge 服務提供 RestAPI 的方式接受客戶端的傳送訊息請求和消費訊息的請求。

Kafka MirrorMaker Operator:完成 Kafa 叢集之間的資料的複製工作,可以是單向的複製,也可以是雙向的複製,可以用來搭建 Kafka 叢集的災備方案。

06

監控

07

社群

Strimzi Kafka Operator 是基於 Kubernetes 容器技術來解決 Kafka 上雲的開源專案,現託管於 CNCF 中。

專案地址:

https://github.com/strimzi/strimzi-kafka-operator

官網地址:

https://strimzi.io/

08

總結

Strimzi Kafka Operator 是通過使用 java 語言開發一套 Operator 框架,基於此框架,設計和實現的 Kafka Operator。隨著 Kafka 上雲的需求不斷提出,相信 Strimzi Kafka Operator 會得到很好的發展。

本文作者 : 熊中祥

「DaoCloud 道客」技術合夥人

雲原生技術專家

DaoCloud 公司簡介:「DaoCloud 道客」雲原生領域的創新領導者,成立於 2014 年底,擁有自主智慧財產權的核心技術,致力於打造開放的雲原生作業系統為企業數字化轉型賦能。產品能力覆蓋雲原生應用的開發、交付、運維全生命週期,並提供公有云、私有云和混合雲等多種交付方式。成立迄今,公司已在金融科技、先進製造、智慧汽車、零售網點、城市大腦等多個領域深耕,標杆客戶包括交通銀行、浦發銀行、上汽集團、東風汽車、海爾集團、屈臣氏、金拱門(麥當勞)等。目前,公司已完成了 D 輪超億元融資,被譽為科技領域準獨角獸企業。公司在北京、武漢、深圳、成都設立多家分公司及合資公司,總員工人數超過 400 人,是上海市高新技術企業、上海市“科技小巨人”企業和上海市“專精特新”企業,併入選了科創板培育企業名單。