使用 Apache Kafka 進行本地 Knative 開發 ¶
發布於:2023-01-12 , 修訂於:2024-01-17
使用 Apache Kafka 進行本地 Knative 開發¶
作者:Matthias Weßendorf,Red Hat 首席軟體工程師
在這篇部落格文章中,您將學習如何為您的本地開發使用類似生產環境的 Knative Broker 和 Apache Kafka。
用於 Apache Kafka 的 Knative Broker 實作是 Knative Broker API 的 Kafka 原生實作,相較於使用基於 Channel 的 Knative Broker 實作,提供了改進,例如減少網路躍點、支援任何 Kafka 版本,以及更好地與 Apache Kafka 整合以用於 Broker 和 Trigger 模型。
選擇本地開發環境¶
在每個專案開始時,一個重要的方面始終是保持開發過程盡可能簡單且實際。
當使用 Knative Broker API 時,開發環境的第一個想法可能是使用 MTChannelBasedBroker
參考 Broker(由 InMemoryChannel
支援)作為開發的主要工具,因為它不需要額外的系統即可運作。
然而,雖然 Knative Broker 的 API 是通用的,而且對於任何 Broker 實作當然是相同的,但不同的 Broker 實作之間仍然存在一些行為差異。當然,像 Apache Kafka 這樣的系統與「記憶體內」儲存相比有很大的不同。
從頭到尾使用 Apache Kafka¶
當以 Apache Kafka 為目標時,您也應該直接將其用於開發環境,雖然使用 Apache Kafka 進行操作會有一些小的額外開銷,但好消息是,使用 Strimzi operator 和 Apache Kafka 3+ 版本,非常容易使用單節點 Kafka 叢集進行開發,同時又接近實際環境。
不需要 Apache Zookeeper!¶
這一切都是因為 Kafka 的 KRaft
功能。它在過去幾年中被開發出來,最近被宣布為 生產功能,屬於 Apache Kafka 3.3.1。
Strimzi operator 提供了一個 FeatureGate 來使用它,自其 0.29 版本以來。KRaft
本身是 Raft 共識演算法的實作,直接位於 Apache Kafka 中,無需像 Zookeeper 這樣的第三方工具。
在 Kubernetes 上使用 Strimzi 設定 Apache Kafka¶
為了在您的開發環境(例如 kind 或 minikube)上建立 Apache Kafka 叢集,您需要先安裝 Strimzi operator
kubectl create namespace kafka
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
完成後,您需要 patch
Operator 的 Deployment
以啟用所需的 FeatureGates
kubectl -n kafka set env deployment/strimzi-cluster-operator STRIMZI_FEATURE_GATES=+UseStrimziPodSets,+UseKRaft
一旦 operator 的 pod 啟動並執行,您可以使用如下的 YAML 片段定義單節點 Apache Kafka 叢集
cat <<-EOF | kubectl -n kafka apply -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.3.1
replicas: 1
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
config:
offsets.topic.replication.factor: 1
transaction.state.log.replication.factor: 1
transaction.state.log.min.isr: 1
default.replication.factor: 1
min.insync.replicas: 1
inter.broker.protocol.version: "3.3"
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 100Gi
deleteClaim: false
# With KRaft not relevant:
zookeeper:
replicas: 1
storage:
type: persistent-claim
size: 100Gi
deleteClaim: false
EOF
注意:
Kafkas.kafka.strimzi.io
CR 目前確實需要您描述zookeeper
欄位,但當啟用UseKRaft
FeatureGate 時會被忽略。若要了解更多關於UseKRaft
的資訊,您可以觀看此簡報。
上面的配置配置了一個單節點 Apache Kafka,完全不需要 Zookeeper 實例
kubectl get pods -n kafka
NAME READY STATUS RESTARTS AGE
my-cluster-kafka-0 1/1 Running 0 2h1m
strimzi-cluster-operator-6d94c67fd8-wfmvl 1/1 Running 1 (1h46m ago) 2h1m
安裝 Knative Eventing 和用於 Apache Kafka 的 Knative Broker¶
當 Apache Kafka 在我們的開發實例上啟動並執行時,我們安裝 Knative Eventing 和用於 Apache Kafka 的 Knative Broker 實作。
Eventing 核心¶
當使用 Knative Kafka Broker 時,我們只需要 Knative Eventing 的最小設定,其 eventing-core
manifest,因為它提供了所有 API,以及 controller
和 webhook
pod
kubectl apply --filename https://github.com/knative/eventing/releases/download/knative-v1.8.4/eventing-core.yaml
完成後,將有兩個 pod 正在為 Knative Eventing 執行
kubectl get pods -n knative-eventing
NAME READY STATUS RESTARTS AGE
eventing-controller-7b95f495bf-dkqtl 1/1 Running 0 2h1m
eventing-webhook-8db49d6cc-4f847 1/1 Running 0 2h1m
Knative Kafka Broker 安裝¶
作為下一步,我們需要安裝 Knative Kafka Broker 的控制平面和資料平面
kubectl apply --filename https://github.com/knative-extensions/eventing-kafka-broker/releases/download/knative-v1.8.4/eventing-kafka-controller.yaml
kubectl apply --filename https://github.com/knative-extensions/eventing-kafka-broker/releases/download/knative-v1.8.4/eventing-kafka-broker.yaml
之後,我們的 knative-eventing
命名空間中將有四個新的 pod,用於我們的 Knative Kafka Broker
kubectl get pods -n knative-eventing
NAME READY STATUS RESTARTS AGE
eventing-controller-7b95f495bf-dkqtl 1/1 Running 0 2h4m
eventing-webhook-8db49d6cc-4f847 1/1 Running 0 2h4m
kafka-broker-dispatcher-859d684d7d-frw6p 1/1 Running 0 2h4m
kafka-broker-receiver-67b7ff757-rk9b6 1/1 Running 0 2h4m
kafka-controller-7cd9bd8649-d62dh 1/1 Running 0 2h4m
kafka-webhook-eventing-f8c975b99-vc969 1/1 Running 0 2h4m
將 Kafka broker 類別設定為預設值¶
為了使 Knative Kafka broker 的使用更加直接,我們將其設定為預設的 broker。首先,我們指定一個全域設定,指向我們的單節點 Apache Kafka 叢集。
cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: kafka-broker-config
namespace: knative-eventing
data:
default.topic.partitions: "10"
default.topic.replication.factor: "1"
bootstrap.servers: "my-cluster-kafka-bootstrap.kafka:9092"
EOF
請務必注意,副本因子與系統上的 Kafka pod 數量有關。由於我們運行的是單節點 Apache Kafka 叢集,因此我們使用 1
。
最後,我們更新 Knative Eventing 的 config-br-defaults
ConfigMap,以反映 Knative Kafka broker 應為系統的預設 broker。
cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: config-br-defaults
namespace: knative-eventing
data:
default-br-config: |
clusterDefault:
brokerClass: Kafka
apiVersion: v1
kind: ConfigMap
name: kafka-broker-config
namespace: knative-eventing
EOF
除了將 brokerClass
設定為 Kafka
之外,我們還參考了上述的 kafka-broker-config
設定,以便所有新的 broker 物件都依賴此設定。至此,我們已完成與安裝和設定相關的任務,可以簡單地建立一個新的 Knative Broker 物件,利用我們的 Knative Kafka Broker 實作。
cat <<-EOF | kubectl apply -f -
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: my-demo-kafka-broker
spec: {}
EOF
在叢集上建立了一個最小資源,代表一個 Knative Kafka broker 物件。
kubectl get brokers.eventing.knative.dev
NAME URL AGE READY REASON
my-demo-kafka-broker http://kafka-broker-ingress.knative-eventing.svc.cluster.local/default/my-demo-kafka-broker 2h6m True
結論¶
借助 Apache Kafka 上的 KRaft
功能和 Strimzi operator,我們可以輕鬆在 Kubernetes 上運行單節點 Apache Kafka 叢集,使我們的本地開發流程能夠提早使用真正的持久化系統,而不是記憶體中的儲存。KRaft 確實減少了 Apache Kafka 的佔用空間,並讓使用者可以順暢地針對一個真實但規模較小的 Apache Kafka 叢集進行開發。
所述設定的安裝腳本可以在這裡找到。