Kafka集群部署(docker容器方式)SASL认证(kafka和zookeeper)

一、服务器环境

序号

部署版本

版本

备注

1

操作系统

CentOS Linux release 7.9.2009 (Core)

2

docker

Docker version 20.10.6, build 370c289

3

docker-compose

docker-compose version 1.28.2, build 67630359

二、服务规划

序号

服务

名称

端口

1

zookeeper

zookeeper

2181,2888,3888

2

kafka

kafka1

9092:9092

3

kafka

kafka2

9093:9092

4

kafka

kafka3

9094:9092

三、部署kafka

1、创建/opt/beidousky/kafka-zk目录,添加docker-compose.yaml文件

version: "3"
services:
  zookeeper:
    image: zookeeper:3.6.3
    container_name: zookeeper
    user: root
    restart: always
    ports:
      - 2181:2181
      - 2888:2888
      - 3888:3888
    environment:
      ZOO_MY_ID: 1
      TZ: Asia/Shanghai
    volumes:
      - ./zk-conf/zoo.cfg:/conf/zoo.cfg
      - ./zk-conf/zookeeper_server_jaas.conf:/conf/zookeeper_server_jaas.conf
      - ./zk-conf/java.env:/conf/java.env
      - ./zk-data/data:/data
      - ./zk-data/datalog:/datalog
      - ./zk-data/logs:/logs

  kafka1:
    image: wurstmeister/kafka:2.13-2.8.1
    container_name: kafka1
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    volumes:
      - ./kafka-data1:/kafka
      - ./kafka-conf:/opt/kafka/secrets/
    environment:
      KAFKA_BROKER_ID: 0
      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://192.168.1.214:9092
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_LISTENERS: SASL_PLAINTEXT://0.0.0.0:9092
      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
      KAFKA_PORT: 9092
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
      KAFKA_SUPER_USERS: User:admin
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true" #设置为true,ACL机制为黑名单机制,只有黑名单中的用户无法访问,默认为false,ACL机制为白名单机制,只有白名单中的用户可以访问
      KAFKA_ZOOKEEPER_CONNECT: 192.168.1.244:2181
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: "-Xmx512M -Xms16M"
      KAFKA_OPTS: -Djava.security.auth.login.config=/opt/kafka/secrets/server_jaas.conf
    restart: always


  kafka2:
    image: wurstmeister/kafka:2.13-2.8.1
    container_name: kafka2
    depends_on:
      - zookeeper
    ports:
      - 9093:9092
    volumes:
      - ./kafka-data2:/kafka
      - ./kafka-conf:/opt/kafka/secrets/
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://192.168.1.214:9093 #宿主机IP
      KAFKA_ADVERTISED_PORT: 9093
      KAFKA_LISTENERS: SASL_PLAINTEXT://0.0.0.0:9092
      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
      KAFKA_PORT: 9092
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
      KAFKA_SUPER_USERS: User:admin
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true" #设置为true,ACL机制为黑名单机制,只有黑名单中的用户无法访问,默认为false,ACL机制为白名单机制,只有白名单中的用户可以访问
      KAFKA_ZOOKEEPER_CONNECT: 192.168.1.244:2181
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: "-Xmx512M -Xms16M"
      KAFKA_OPTS: -Djava.security.auth.login.config=/opt/kafka/secrets/server_jaas.conf
    restart: always

  kafka3:
    image: wurstmeister/kafka:2.13-2.8.1
    container_name: kafka3
    depends_on:
      - zookeeper
    ports:
      - 9094:9092
    volumes:
      - ./kafka-data3:/kafka
      - ./kafka-conf:/opt/kafka/secrets/
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ADVERTISED_LISTENERS: SASL_PLAINTEXT://192.168.1.214:9094 #宿主机IP
      KAFKA_ADVERTISED_PORT: 9094
      KAFKA_LISTENERS: SASL_PLAINTEXT://0.0.0.0:9092
      KAFKA_SECURITY_INTER_BROKER_PROTOCOL: SASL_PLAINTEXT
      KAFKA_PORT: 9092
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
      KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.auth.SimpleAclAuthorizer
      KAFKA_SUPER_USERS: User:admin
      KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "true" #设置为true,ACL机制为黑名单机制,只有黑名单中的用户无法访问,默认为false,ACL机制为白名单机制,只有白名单中的用户可以访问
      KAFKA_ZOOKEEPER_CONNECT: 192.168.1.244:2181
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: "-Xmx512M -Xms16M"
      KAFKA_OPTS: -Djava.security.auth.login.config=/opt/kafka/secrets/server_jaas.conf
    restart: always

2、创建/opt/beidousky/kafka-zk/zk-conf目录,添加zoo.cfg文件

dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
quorumListenOnAllIPs=true

server.1=192.168.1.244:2888:3888;2181
#server.2=192.168.1.xxx:2888:3888;2181
#server.3=192.168.1.xxx:3888;2181

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
sessionRequireClientSASLAuth=true
#requireClientAuthScheme=sasl
jaasLoginRenew=3600000

3、在/opt/beidousky/kafka-zk/zk-conf目录下,添加java.env文件

# 指定jaas文件的位置
SERVER_JVMFLAGS="-Djava.security.auth.login.config=/conf/zookeeper_server_jaas.conf"

4、在/opt/beidousky/kafka-zk/zk-conf目录下,添加zookeeper_server_jaas.conf文件

数据格式为user_用户名="用户密码"或者username="用户名" password="用户密码"

Server {
       org.apache.zookeeper.server.auth.DigestLoginModule required
       user_admin="admin123"
       user_kafka="kafka123"
       ;
};

Client {
       org.apache.zookeeper.server.auth.DigestLoginModule required
       username="kafka"
       password="kafka123"
       ;
};

5、创建/opt/beidousky/kafka-zk/kafka-conf目录,添加server_jaas.conf文件

Server {
       org.apache.zookeeper.server.auth.DigestLoginModule required
       user_admin="admin123"
       user_kafka="kafka123"
       ;
};

Client {
       org.apache.zookeeper.server.auth.DigestLoginModule required
       username="kafka"
       password="kafka123"
       ;
};

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    user_admin="123456";
};

KafkaClient {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="123456";
};

6、启动kafka集群服务

cd /opt/beidousky/kafka-zk
docker-compose up -d

7、创建Topic主题验证kafka集群服务

cd /opt/beidousky/kafka-zk
docker exec -it kafka1 /bin/bash
kafka-topics.sh --zookeeper 192.168.1.244:2181 --create --topic topic-test --partitions 3 --replication-factor 3
kafka-topics.sh --zookeeper 192.168.1.244:2181 --describe --topic topic-test

如图:

四、SpringBoot项目连接kafka集群

application.yml文件

  spring:    
    kafka:
      bootstrap-servers: 192.168.1.214:9092,192.168.1.214:9093,192.168.1.214:9094
      #=============== producer  =======================
      producer:
        #如果该值大于零时,表示启用重试失败的发送次数
        retries: 0
        #每当多个记录被发送到同一分区时,生产者将尝试将记录一起批量处理为更少的请求,默认值为16384(单位字节)
        batch-size: 16384
        #生产者可用于缓冲等待发送到服务器的记录的内存总字节数,默认值为3355443
        buffer-memory: 33554432
        #key的Serializer类,实现类实现了接口org.apache.kafka.common.serialization.Serializer
        key-serializer: org.apache.kafka.common.serialization.StringSerializer
        #value的Serializer类,实现类实现了接口org.apache.kafka.common.serialization.Serializer
        value-serializer: org.apache.kafka.common.serialization.StringSerializer
      #=============== consumer  =======================
      consumer:
        #用于标识此使用者所属的使用者组的唯一字符串
        group-id: consumer-group
        #当Kafka中没有初始偏移量或者服务器上不再存在当前偏移量时该怎么办,默认值为latest,表示自动将偏移重置为最新的偏移量
        #可选的值为latest, earliest, none
        auto-offset-reset: earliest
        #消费者的偏移量将在后台定期提交,默认值为true
        enable-auto-commit: true
        #如果'enable-auto-commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
        auto-commit-interval: 100
        #密钥的反序列化器类,实现类实现了接口org.apache.kafka.common.serialization.Deserializer
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        #值的反序列化器类,实现类实现了接口org.apache.kafka.common.serialization.Deserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      #认证相关配置
      properties:
        security:
          protocol: SASL_PLAINTEXT
        sasl:
          mechanism: PLAIN
          jaas:
            config: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="123456";'

<think>好的,我现在需要帮助用户解决在Docker环境中部署带有SASL安全认证机制的Kafka集群以及ZooKeeper配置的问题。首先,我得仔细分析用户的需求。用户提到了dockerkafkazookeepersasl部署教程、安全认证集群配置,所以需要覆盖这些方面。 首先,我应该回忆一下相关的知识。Kafka通常依赖ZooKeeper进行集群管理,而SASL是一种认证机制,可以用于KafkaZooKeeper之间的通信安全。用户需要的是通过Docker Compose来部署这样的集群,并且配置SASL认证,确保通信的安全性。 接下来,我需要参考用户提供的引用内容。引用[1]提到了ZooKeeperSASL配置,包括认证提供者JAAS配置。引用[2][3]则涉及使用Docker Compose部署KafkaZooKeeper集群,并配置SASL认证。因此,我需要将这些信息整合起来,形成一个完整的部署步骤。 接下来,我需要考虑具体的步骤。首先,Docker Compose文件的编写是关键,需要定义ZooKeeperKafka的服务,并配置它们的网络、环境变量等。然后,生成必要的配置文件,比如JAAS配置文件、Kafka的server.propertiesZooKeeper的zoo.cfg。这些文件需要挂载到容器内的正确位置。 另外,SASL的配置涉及到生成用户凭证,比如创建kafka_server_jaas.confzookeeper_server_jaas.conf,并在Docker环境中正确设置这些文件的路径。同时,KafkaZooKeeper的配置文件需要启用SASL认证,并指定相关的协议机制。 还需要注意集群的配置,比如Kafka的broker.id、advertised.listeners,以及ZooKeeper集群配置,比如server.1、server.2等,确保各个节点能够正确通信。此外,数据卷的配置也很重要,确保数据持久化。 可能遇到的问题包括环境变量的正确传递,文件路径的权限问题,以及SASL配置中的细节,比如PLAIN机制的使用用户列表的配置。需要确保所有服务在启动时加载了正确的JAAS配置,并且网络配置允许节点间通信。 最后,测试步骤也是必要的,比如使用kafka-console-producerconsumer验证消息的发送接收,确保认证机制生效。同时,要提醒用户根据实际Docker版本调整Compose文件的版本,以及根据安全需求可能需要的进一步配置,比如SSL加密。 总结一下,步骤大致分为准备Docker Compose文件、生成配置文件、配置SASL认证、设置集群参数、处理数据持久化、启动服务并进行测试。需要详细解释每个步骤,确保用户能够按部就班地完成部署,并理解各个配置项的作用。</think>### Docker环境下部署SASL认证Kafka集群ZooKeeper配置指南 #### 一、基础环境准备 1. 创建专用网络目录结构 ```bash mkdir -p kafka-cluster/{config,zk-data,kafka-data} cd kafka-cluster ``` 2. 生成SASL凭证文件 ```bash echo "admin:admin-secret" > config/kafka_server_jaas.conf echo "zkadmin:zkadmin-secret" > config/zookeeper_server_jaas.conf ``` #### 二、核心配置文件 1. ZooKeeper配置文件 `config/zoo.cfg` ``` tickTime=2000 dataDir=/data clientPort=2181 authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=3600000 server.1=zookeeper1:2888:3888 server.2=zookeeper2:2888:3888 server.3=zookeeper3:2888:3888 ``` 2. Kafka配置文件 `config/server.properties` ``` broker.id=1 listeners=SASL_PLAINTEXT://:9092 advertised.listeners=SASL_PLAINTEXT://kafka1:9092 security.inter.broker.protocol=SASL_PLAINTEXT sasl.mechanism.inter.broker.protocol=PLAIN sasl.enabled.mechanisms=PLAIN authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer ``` #### 三、Docker Compose文件 ```yaml version: '3.8' services: zookeeper1: image: zookeeper:3.8 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zookeeper1:2888:3888;2181 server.2=zookeeper2:2888:3888;2181 server.3=zookeeper3:2888:3888;2181 volumes: - ./config/zoo.cfg:/conf/zoo.cfg - ./zk-data/zookeeper1:/data networks: - kafka-net kafka1: image: confluentinc/cp-kafka:7.3.0 environment: KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf" KAFKA_ZOOKEEPER_CONNECT: "zookeeper1:2181,zookeeper2:2181,zookeeper3:2181" volumes: - ./config/server.properties:/etc/kafka/server.properties - ./config/kafka_server_jaas.conf:/etc/kafka/kafka_server_jaas.conf networks: - kafka-net networks: kafka-net: driver: bridge ``` #### 四、SASL认证配置要点 1. ZooKeeper JAAS配置: ``` Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_zkadmin="zkadmin-secret"; }; ``` 2. Kafka JAAS配置: ``` KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret"; }; ``` #### 五、集群验证步骤 1. 启动服务: ```bash docker-compose up -d --scale zookeeper=3 --scale kafka=3 ``` 2. 测试消息生产/消费: ```bash # 生产者 docker exec -it kafka1 kafka-console-producer \ --topic test-topic \ --bootstrap-server kafka1:9092 \ --producer.config /etc/kafka/producer.properties # 消费者 docker exec -it kafka1 kafka-console-consumer \ --topic test-topic \ --from-beginning \ --bootstrap-server kafka1:9092 \ --consumer.config /etc/kafka/consumer.properties ``` [^1]: 引用[1]中的SASL配置参数已应用在ZooKeeper服务配置中 [^2]: KafkaSASL/PLAIN认证机制参考了引用[2]的实现方法 [^3]: 集群部署架构设计基于引用[3]的分布式协调方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hoking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值