跳至內容

使用 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

為了在您的開發環境(例如 kindminikube)上建立 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,以及 controllerwebhook 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 叢集進行開發。

所述設定的安裝腳本可以在這裡找到。

我們使用分析和 Cookie 來了解網站流量。 您使用我們網站的資訊會與 Google 分享以達到此目的。了解更多。