乐于分享
好东西不私藏

Kafka 4.0 集群部署文档(K8S模式)

Kafka 4.0 集群部署文档(K8S模式)

一、文档介绍

本文档介绍 K8S 集群中部署 Kafka 4.0 集群过程,包含认证配置。

二、部署说明

  • K8S 版本:1.30.8
  • Kafka 版本:4.0.0

三、部署配置

注意:以下配置中,关于namespacevolumeClaimTemplates部分,需要根据实际情况调整。

apiVersion: v1kind: Secretmetadata:  name: kafka-kraft-cluster-id  namespace: middlewaretype: OpaquestringData:  kraft-cluster-id: "Kafka-Middleware"---apiVersion: v1kind: Secretmetadata:  name: kafka-jaas  namespace: middlewaretype: OpaquestringData:  kafka_server_jaas.conf: |    KafkaServer {      org.apache.kafka.common.security.plain.PlainLoginModule required      username="admin"      password="VGliaFdMNVFrSg"      user_admin="VGliaFdMNVFrSg"      user_alice="UTFNbWxuN2xTaA";    };  kafka_client_jaas.conf: |    security.protocol=SASL_PLAINTEXT    sasl.mechanism=PLAIN    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="UTFNbWxuN2xTaA";---apiVersion: v1kind: Servicemetadata:  name: kafka-headless  namespace: middlewarespec:  clusterIP: None  ports:    - name: tcp-interbroker      port: 9094      protocol: TCP      targetPort: interbroker    - name: tcp-client      port: 9092      protocol: TCP      targetPort: client    - name: tcp-controller      protocol: TCP      port: 9093      targetPort: controller  selector:    app: kafka  type: ClusterIP---apiVersion: v1kind: Servicemetadata:  name: kafka  namespace: middlewarespec:  ports:    - name: tcp-client      port: 9092      protocol: TCP      targetPort: client  selector:    app: kafka  type: ClusterIP---apiVersion: apps/v1kind: StatefulSetmetadata:  namespace: middleware  name: kafka  labels:    app.kubernetes.io/version: 4.0.0spec:  replicas: 3  serviceName: kafka-headless  selector:    matchLabels:      app: kafka  template:    metadata:      labels:        app: kafka    spec:      containers:        - name: kafka          image: apache/kafka:4.0.0          imagePullPolicy: IfNotPresent          command:           - /bin/sh          args:            - -ec            - |              export KAFKA_NODE_ID=${KAFKA_NODE_NAME##*-}              exec /__cacert_entrypoint.sh /etc/kafka/docker/run          ports:            - name: controller              containerPort: 9093            - name: client              containerPort: 9092            - name: interbroker              containerPort: 9094          resources:            limits:              cpu: 1000m              memory: 2Gi            requests:              cpu: 100m              memory: 1Gi          env:            - name: KAFKA_NODE_NAME              valueFrom:                fieldRef:                  fieldPath: metadata.name            - name: CLUSTER_ID              valueFrom:                secretKeyRef:                  name: kafka-kraft-cluster-id                  key: kraft-cluster-id            - name: KAFKA_PROCESS_ROLES              value: "controller,broker"            - name: KAFKA_CONTROLLER_QUORUM_VOTERS              value: "0@kafka-0.kafka-headless.middleware.svc.cluster.local:9093,1@kafka-1.kafka-headless.middleware.svc.cluster.local:9093,2@kafka-2.kafka-headless.middleware.svc.cluster.local:9093"            - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP              value: "CLIENT:SASL_PLAINTEXT,INTERNAL:SASL_PLAINTEXT,CONTROLLER:PLAINTEXT"            - name: KAFKA_CONTROLLER_LISTENER_NAMES              value: "CONTROLLER"            - name: KAFKA_INTER_BROKER_LISTENER_NAME              value: "INTERNAL"            - name: KAFKA_LISTENERS              value: "CLIENT://:9092,INTERNAL://:9094,CONTROLLER://:9093"            - name: KAFKA_ADVERTISED_LISTENERS              value: "CLIENT://:9092,INTERNAL://:9094"            # SASL            - name: KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM              value:            - name: KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL              value: PLAIN            - name: KAFKA_SASL_ENABLED_MECHANISMS              value: PLAIN            # Clustering            - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR              value: "3"            - name: KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR              value: "3"            - name: KAFKA_TRANSACTION_STATE_LOG_MIN_ISR              value: "2"            - name: KAFKA_DEFAULT_REPLICATION_FACTOR              value: "3"            - name: KAFKA_MIN_INSYNC_REPLICAS              value: "2"            - name: KAFKA_NUM_PARTITIONS              value: "3"            - name: KAFKA_LOG_DIRS              value: "/opt/kafka/data"            ## 禁用自动创建 Topic            - name: KAFKA_AUTO_CREATE_TOPICS_ENABLE              value: "false"            - name: KAFKA_OPTS              value: "-Djava.security.auth.login.config=/opt/kafka/config/kafka_server_jaas.conf"            - name: KAFKA_HEAP_OPTS              value: "-Xmx2G -Xms2G"          volumeMounts:            - name: kafka-jaas-volume              mountPath: /opt/kafka/config/kafka_server_jaas.conf              subPath: kafka_server_jaas.conf              readOnly: true            - name: kafka-jaas-volume              mountPath: /opt/kafka/config/kafka_client_jaas.conf              subPath: kafka_client_jaas.conf              readOnly: true      volumes:      - name: kafka-jaas-volume        secret:          secretName: kafka-jaas          optional: false          defaultMode: 0644  volumeClaimTemplates:  - metadata:      name: kafka-data      annotations:        volume.beta.kubernetes.io/storage-class: csi-s3    spec:      accessModes:        - ReadWriteOnce      resources:        requests:          storage: 100Gi