Kafka运维实战 06 - kafka 单机部署指南(混合模式)(KRaft 版本3.7.0)


Kafka KRaft 版本(即 Kafka 3.0 及更高版本)使用 KRaft 模式(Kafka Raft 协议)替代 ZooKeeper 进行集群管理,简化了部署流程。以下是在 Linux 系统上部署 Kafka KRaft 的详细步骤

环境准备

主机:Centos7
IP: 192.168.37.10

JDK安装

下载jdk

https://www.oracle.com/java/technologies/downloads/?er=221886#java21

jdk安装

  1. 解压下载的文件到指定目录
tar xvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/
  1. 设置环境变量 (以 Linux/macOS 为例)
    vim /etc/profile
export JAVA_HOME=/usr/local/jdk-21.0.8
export PATH=$JAVA_HOME/bin:$PATH
  1. 刷新环境变量
source /etc/profile
  1. 验证安装
[root@test-10 bin]# java --version
java 21.0.8 2025-07-15 LTS
Java(TM) SE Runtime Environment (build 21.0.8+12-LTS-250)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.8+12-LTS-250, mixed mode, sharing)

kafka 部署

kafka 下载

地址:https://archive.apache.org/dist/kafka/
在这里插入图片描述
这里展示了历史的kafka各个版本。

本次我们下载 kafka_2.13-3.7.0.tgz 这个版本
https://archive.apache.org/dist/kafka/3.7.0/kafka_2.13-3.7.0.tgz

kafka 版本号结构解析

kafka_<SCALA_VERSION>-<KAFKA_VERSION>.tgz

Kafka 是用 Scala 和 Java 开发的,因此需要特定版本的 Scala 编译。版本号中的 2.13 表示该 Kafka 版本是用 Scala 2.13.x 编译的
3.7.0 是 Kafka 自身的版本号,采用 MAJOR.MINOR.PATCH 格式

kafka 安装

下载和解压安装包
mkdir -p /data/middleware
tar xvf kafka_2.13-3.7.0.tgz -C /data/middleware/
配置 KRaft 模式

编辑 config/kraft/server.properties 文件:

# 配置监听地址
log.dirs=/data/middleware/kafka_2.13-3.7.0/data
controller.quorum.voters=1@192.168.37.10:9093
advertised.listeners=PLAINTEXT://192.168.37.10:9092
格式化存储目录

Kafka KRaft 模式需要生成一个集群 ID 并配置相关参数:

[root@test-10 kafka_2.13-3.7.0]# ./bin/kafka-storage.sh random-uuid
BJODTrqBTbCBnwSG2VszJg

将生成的 UUID 记录下来, 使用生成的集群 ID 格式化存储目录:
./bin/kafka-storage.sh format -t <YOUR_CLUSTER_ID> -c config/kraft/server.properties

[root@test-10 kafka_2.13-3.7.0]# ./bin/kafka-storage.sh format -t  BJODTrqBTbCBnwSG2VszJg  -c config/kraft/server.properties
metaPropertiesEnsemble=MetaPropertiesEnsemble(metadataLogDir=Optional.empty, dirs={/data/middleware/kafka_2.13-3.7.0/data: EMPTY})
Formatting /data/middleware/kafka_2.13-3.7.0/data with metadata.version 3.7-IV4.

# 执行后,data目录自动创建,并生成了两个文件。
[root@test-10 kafka_2.13-3.7.0]# ls data/
bootstrap.checkpoint  meta.properties
[root@test-10 kafka_2.13-3.7.0]# cat data/meta.properties 
#
#Fri Jul 18 11:25:00 CST 2025
cluster.id=BJODTrqBTbCBnwSG2VszJg
directory.id=YE6-pLr4UPcqstWaKaZJFw
node.id=1
version=1

启动kafka

前台启动(方便调试)

./bin/kafka-server-start.sh config/kraft/server.properties

后台启动

./bin/kafka-server-start.sh -daemon config/kraft/server.properties
Kafka 配置为 systemd 服务
[root@test-10 logs]# systemctl cat kafka 
# /etc/systemd/system/kafka.service
[Unit]
Description=Apache Kafka Server (KRaft Mode)
Documentation=https://kafka.apache.org/documentation/
Requires=network.target
After=network.target

[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk-21.0.8" 
ExecStart=/data/middleware/kafka_2.13-3.7.0/bin/kafka-server-start.sh -daemon  /data/middleware/kafka_2.13-3.7.0/config/kraft/server.properties
ExecStop=/data/middleware/kafka_2.13-3.7.0/bin/kafka-server-stop.sh
Restart=on-failure
RestartSec=5
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

重新加载 systemd 并启动服务

sudo systemctl daemon-reload
sudo systemctl start kafka
sudo systemctl enable kafka  # 设置开机自启

注意事项

调整 JVM 内存参数

可以在Service文件中增加

Environment=“KAFKA_HEAP_OPTS=-Xmx4G -Xms4G”

不覆盖修改,则启动的JVM参数采用bin/kafka-server-start.sh 默认
在这里插入图片描述

在Kraft模式下,Kafka有如下三个配置文件可以配置。

  • config/kraft/broker.properties 当节点作为[broker]角色运行时,会去读该文件中的配置项启动。
  • config/kraft/controller.properties 当节点作为[controller]角色运行时,会去读该文件中的配置项启动。
  • config/kraft/server.properties 当节点同时作为[broker, controller]角色运行时,会去读该文件中的配置项启动。
<think>嗯,用户想了解如何在Kubernetes(K8S)上部署一个带有认证的单机Kafka实例。首先,我需要确定Kafka在K8S中的常见部署方式,通常会用StatefulSet,但单机的话可能用Deployment也可以。然后认证部分,Kafka支持多种认证机制,比如SASL/SCRAM或者SSL/TLS。用户可能希望的是相对简单的认证方式,比如SASL/SCRAM,因为SSL需要证书管理更复杂。 接下来,我需要考虑如何配置Kafka的认证。可能需要生成用户凭证,创建Kubernetes Secret来存储这些凭证。然后修改Kafka的server.properties文件,启用SASL_PLAINTEXT监听器,并配置JAAS文件。同时,Zookeeper是否需要认证?如果用户只是单机部署,可能Zookeeper和Kafka部署在同一个Pod里,或者使用Kafka的内置KRaft模式,但KRaft可能复杂度更高,用户可能还是用Zookeeper更熟悉。 然后,需要编写Kubernetes的部署文件,包括Deployment、Service、ConfigMap和Secret。ConfigMap用于存放Kafka和Zookeeper的配置文件,Secret存储用户和密码。Service需要暴露Kafka的端口,比如9092和2181(如果是Zookeeper)。 测试部分,用户可能需要验证认证是否生效,可以使用kafka-console-producer和consumer命令,指定JAAS配置。另外,需要注意Kafka和Zookeeper的存储,使用持久卷(PV)来保存数据,避免Pod重启后数据丢失。 可能遇到的错误点包括配置文件错误,Secret未正确挂载,或者认证参数配置不正确。需要检查Kafka日志来排查问题。另外,SASL_PLAINTEXT是明文传输,生产环境可能需要用SASL_SSL,但用户要求单机可能接受这一点。 总结步骤:准备配置文件,创建Secret,部署Zookeeper和Kafka,验证认证。需要确保所有组件配置一致,特别是监听器和安全协议部分。最后,提供测试命令和注意事项,比如持久化存储和安全性建议。</think>以下是分步骤的Kubernetes单节点Kafka认证部署指南(使用SASL/SCRAM认证): 一、准备工作 1. 生成认证凭证 ```bash # 创建SCRAM用户 kubectl create secret generic kafka-user --from-literal=username=admin --from-literal=password=admin-secret ``` 二、创建配置文件 ```yaml # kafka-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: kafka-config data: server.properties: | broker.id=0 listeners=SASL_PLAINTEXT://:9092 advertised.listeners=SASL_PLAINTEXT://kafka:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256 sasl.enabled.mechanisms=SCRAM-SHA-256 authorizer.class.name=kafka.security.authorizer.AclAuthorizer super.users=User:admin zookeeper.connect=localhost:2181 jaas.conf: | KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret" user_admin="admin-secret"; }; ``` 三、部署ZooKeeper ```yaml # zookeeper.yaml apiVersion: apps/v1 kind: Deployment metadata: name: zookeeper spec: replicas: 1 selector: matchLabels: app: zookeeper template: metadata: labels: app: zookeeper spec: containers: - name: zookeeper image: zookeeper:3.8 ports: - containerPort: 2181 --- apiVersion: v1 kind: Service metadata: name: zookeeper spec: selector: app: zookeeper ports: - port: 2181 targetPort: 2181 ``` 四、部署Kafka ```yaml # kafka-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kafka spec: replicas: 1 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: bitnami/kafka:3.6 ports: - containerPort: 9092 env: - name: KAFKA_CFG_ZOOKEEPER_CONNECT value: "zookeeper:2181" volumeMounts: - name: config mountPath: /opt/bitnami/kafka/config/server.properties subPath: server.properties - name: jaas-config mountPath: /opt/bitnami/kafka/config/kafka_jaas.conf subPath: jaas.conf command: - /bin/bash - -c - | export KAFKA_OPTS="-Djava.security.auth.login.config=/opt/bitnami/kafka/config/kafka_jaas.conf" /opt/bitnami/kafka/bin/kafka-server-start.sh /opt/bitnami/kafka/config/server.properties volumes: - name: config configMap: name: kafka-config items: - key: server.properties path: server.properties - name: jaas-config configMap: name: kafka-config items: - key: jaas.conf path: jaas.conf --- apiVersion: v1 kind: Service metadata: name: kafka spec: selector: app: kafka ports: - port: 9092 targetPort: 9092 ``` 五、验证部署 ```bash # 创建测试topic kubectl exec -it kafka-pod -- bash -c "export KAFKA_OPTS=&#39;-Djava.security.auth.login.config=/opt/bitnami/kafka/config/kafka_jaas.conf&#39;; kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --command-config /opt/bitnami/kafka/config/producer.properties" # 生产消息 kubectl exec -it kafka-pod -- bash -c "export KAFKA_OPTS=&#39;-Djava.security.auth.login.config=/opt/bitnami/kafka/config/kafka_jaas.conf&#39;; kafka-console-producer.sh --topic test --bootstrap-server localhost:9092 --producer.config /opt/bitnami/kafka/config/producer.properties" # 消费消息 kubectl exec -it kafka-pod -- bash -c "export KAFKA_OPTS=&#39;-Djava.security.auth.login.config=/opt/bitnami/kafka/config/kafka_jaas.conf&#39;; kafka-console-consumer.sh --topic test --from-beginning --bootstrap-server localhost:9092 --consumer.config /opt/bitnami/kafka/config/consumer.properties" ``` 关键注意事项: 1. 持久化存储:建议为Kafka添加PVC保证数据持久性 2. 安全增强:生产环境应使用SASL_SSL替代SASL_PLAINTEXT 3. ACL管理:需要配合kafka-acls.sh设置访问控制规则 4. 监控:建议集成Prometheus监控指标 5. 资源限制:根据实际情况配置CPU/Memory资源限制 此配置实现了: - 基于SCRAM-SHA-256的认证机制 - 单节点Kafka+ZooKeeper部署 - 基础ACL访问控制 - 客户端/服务端双向认证 - 明文传输(适合测试环境)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值