【Kafka】docker 中配置带 Kerberos 认证的 Kafka 环境(全过程)

1. 准备 docker

  • 下载镜像 docker pull centos/systemd,该镜像是基于 centos7 增加了 systemd 的功能,可以更方便启动后台服务

  • 启动镜像

    • 使用 systemd 功能需要权限,如果是模拟 gitlab services 就不要使用 systemd 的方式启动

    • 如果不使用 systemd 功能 docker run -itd --name kafka_kerberos -p 9092:9092 centos/systemd

    • 如果使用 systemd 功能 docker run -itd --name kafka_kerberos -p 9092:9092 --privileged=true centos/systemd /usr/sbin/init

  • 根据需求清空 /etc/resolv.conf,内网环境中自动添加的 8.8.8.8 会影响网络

  • 启动 sshd /usr/sbin/sshd -D &

2. 配置 kerberos

服务端
  • 安装服务端 yum install krb5-server

  • 配置 /etc/hosts

    • 根据需要配置,配置下面 /etc/krb5.conf 文件中 TEST.COM 里的域名对应的 IP
  • 配置 /etc/krb5.conf

    • 对下面的行进行修改,其它行不变

      default_realm = TEST.COM
      default_ccache_name = /tmp/krb5cc_%{uid}
      dns_lookup_realm = false
      dns_lookup_kdc = false
      rdns = false
      # 这行注释掉
      # renew_lifetime=...
      
      [realms]
      TEST.COM = {
          kdc = kafka_kerberos
          admin_server = kafka_kerberos
      }
      
      [domain_realm]
      .test.com = TEST.COM
      test.com = TEST.COM
      
  • 配置 /var/kerberos/krb5kdc/kdc.conf,将 EXAMPLE.COM 修改为 TEST.COM

  • 配置 /var/kerberos/krb5kdc/kadm5.acl,配置对 Kerberos 数据库的访问权限的,我只将 EXAMPLE.COM 改为了 TEST.COM,有权限需要可以找资料学习配置

  • 初始化 Kerberos 数据库

    • kdb5_util create -s -r TEST.COM

    • 键入密码,个人输入 kerberos,记录在此,以免忘记

  • 启动 kerberos 服务

    • 不使用 systemd 启动 (不带 systemd 的 docker 镜像需要用这种方式启动)

      /usr/sbin/krb5kdc -P /var/run/krb5kdc.pid -r TEST.COM
      /usr/sbin/kadmind -P /var/run/kadmind.pid -r TEST.COM
      
    • 使用 systemd 启动

      systemctl start krb5kdc
      systemctl start kadmin
      
  • kerberos 服务端使用 kadmin.local 进行管理,创建 root 的 principal (默认是 {当前用户}/admin@TEST.COM)

    • kadmin.local -q "add_principal root/admin@TEST.COM"
    • 输入密码,个人输入密码 root,记录在此,以免忘记
客户端
  • 安装客户端 yum install krb5-workstation

  • 配置 /etc/krb5,将服务端的文件拷贝覆盖

  • 在客户端使用 kadmin 管理

  • 认证用户

    kinit root/admin@TEST.COM

  • 查看当前认证的用户

    klist

  • 清空当前认证缓存

    kdestroy

3. 配置 kafka 环境

在 kafka 官网下载一个可用版本
在服务端生成认证所需的密钥
# 创建 principal
kadmin.local -q "add_principal -randkey zookeeper/kafka_kerberos@TEST.COM"
kadmin.local -q "add_principal -randkey kafka/kafka_kerberos@TEST.COM"
kadmin.local -q "add_principal -randkey kafka-client@TEST.COM"

# 生成密钥前必须要建立密钥放置的目录
mkdir /root/keytabs

# 生成密钥文件
kadmin.local -q "xst -k /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM"
kadmin.local -q "xst -k /root/keytabs/kafka-server.keytab kafka/kafka_kerberos@TEST.COM"
kadmin.local -q "xst -k /root/keytabs/kafka-client.keytab kafka-client@TEST.COM"

# 测试是否能够认证成功
kinit -kt /root/keytabs/zookeeper-server.keytab zookeeper/kafka_kerberos@TEST.COM
klist
配置 java 环境
# 安装JDK安装包(先查,再下载development环境的)
yum install openjdk-devel

# 配置JAVA的真实位置
which java # 找到java位置
ls -lr /usr/bin/java # 找到java链接的文件(上面执行的结果)
ls -lrt /etc/alternatives/java # 找到链接文件的真实地址(上面执行的结果)

# 配置JAVA_HOME (上面执行的结果,截取到系统版本号)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64
export CLASSPATH=$JAVA_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATH
开始配置 kafka 环境
  • 配置 zookeeper 相关文件

    • 创建 config/kerberos/zookeeper-server-jaas.conf 文件,注意下面内容有两个分号

      Server {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          storeKey=true
          useTicketCache=false
          keyTab="/root/keytabs/zookeeper-server.keytab"
          principal="zookeeper/kafka_kerberos@TEST.COM";
      };
      
    • 拷贝 config/zookeeper.properties 到 config/zookeeper-kerberos.properties,在末尾添加以下内容

      # 根据需要配置 dataDir
      dataDir=/root/kafka_data/zookeeper
      
      authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
      jaasLoginRenew=3600000
      sessionRequireClientSASLAuth=true
      
    • 创建启动脚本 zookeeper_start.sh

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/zookeeper-server-jaas.conf'
      ./bin/zookeeper-server-start.sh -daemon config/zookeeper-kerberos.properties
      
    • 创建停止脚本 zookeeper_stop.sh

      ./bin/zookeeper-server-stop.sh config/zookeeper.properties
      
  • 配置 kafka 相关文件

    • 创建 config/kerberos/kafka-server.jaas.conf 文件,注意下面内容有两个分号

      KafkaServer {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          storeKey=true
          useTicketCache=false
          keyTab="/root/keytabs/kafka-server.keytab"
          principal="kafka/kafka_kerberos@TEST.COM";
      };
      
      Client {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          storeKey=true
          useTicketCache=false
          keyTab="/root/keytabs/kafka-server.keytab"
          principal="kafka/kafka_kerberos@TEST.COM";
      };
      
    • 拷贝 config/server.properties 到 config/server-kerberos.properties,在末尾添加以下内容

      # 根据需要配置 log.dirs
      log.dirs=/root/kafka_data/kafka-logs
      
      # 这里要将 localhost 改为 principal 中的值,与 zookeeper/kafka_kerberos 对应
      zookeeper.connect=kafka_kerberos:2181
      listeners=SASL_PLAINTEXT://0.0.0.0:9092
      advertised.listeners=SASL_PLAINTEXT://kafka_kerberos:9092
      security.inter.broker.protocol=SASL_PLAINTEXT
      sasl.mechanism.inter.broker.protocol=GSSAPI
      sasl.enabled.mechanisms=GSSAPI
      
      # 需要和 principal 相同
      sasl.kerberos.service.name=kafka
      
    • 创建启动脚本 kafka_start.sh

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-server-start.sh -daemon config/server-kerberos.properties
      
    • 创建停止脚本 kafka_stop.sh

      ./bin/kafka-server-stop.sh config/server-kerberos.properties
      
    • 创建 topic_list.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-topics.sh --zookeeper kafka_kerberos:2181 --list
      
    • 创建 create_topic.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-topics.sh --create --zookeeper kafka_kerberos:2181 --replication-factor 1 --partitions 1 --topic $1
      
    • 创建 delete_topic.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-server-jaas.conf'
      ./bin/kafka-topics.sh --delete --zookeeper kafka_kerberos:2181 --topic $1
      
  • 配置 kafka 客户端相关文件

    • 创建 config/kerberos/kafka-client-jaas.conf 文件,注意下面内容有两个分号

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          storeKey=true
          useTicketCache=false
          keyTab="/root/keytabs/kafka-client.keytab"
          principal="kafka-client@TEST.COM";
      };
      
    • 创建 config/client-kerberos.properties 文件

      security.protocol=SASL_PLAINTEXT
      sasl.mechanism=GSSAPI
      sasl.kerberos.service.name=kafka
      
    • 创建 producer.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf'
      ./bin/kafka-console-producer.sh --broker-list kafka_kerberos:9092 --topic $1 --producer.config config/client-kerberos.properties
      
    • 创建 consumer.sh 脚本

      export KAFKA_OPTS='-Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/root/kafka_2.13-2.7.1/config/kerberos/kafka-client-jaas.conf'
      ./bin/kafka-console-consumer.sh --bootstrap-server kafka_kerberos:9092 --topic $1 --from-beginning --consumer.config config/client-kerberos.properties
      
过程中报错处理
  • 报错 Server not found in Kerberos database

    • 查看 /var/log/krb5kdc.log 中报错,找不到 zookeeper/localhost@TEST.COM

    • 原因:配置 server-kerberos.properties 文件时,需要更改连接 zookeeper 的 host

### 安装和配置 KafkaDocker 环境中 在 Docker 环境中安装和配置 Kafka 需要以下几个步骤,包括创建自定义网络、启动 Kafka 容器以及进行相关配置以确保 Kafka 能够正常运行并与其他服务(如 Spark 或 ZooKeeper)通信。 #### 创建自定义网络 为了使 Kafka 容器能够与其他容器(例如 ZooKeeper 或 Spark 容器)进行通信,需要创建一个自定义的 Docker 网络。这可以通过以下命令完成: ```bash docker network create airflow-kafka ``` 此命令创建了一个名为 `airflow-kafka` 的网络,该网络可以用于连接 Kafka 容器和其他相关服务容器[^1]。 #### 启动 Kafka 容器 接下来,可以使用 Docker 命令来启动 Kafka 容器。假设已经有一个可用的 Kafka 镜像,并且希望将其连接到之前创建的 `airflow-kafka` 网络中。示例命令如下: ```bash docker run -d --name kafka-container --network airflow-kafka -p 9092:9092 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-container:9092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 confluentinc/cp-kafka ``` 此命令启动了一个 Kafka 容器,并将其加入到 `airflow-kafka` 网络中。同时设置了与 ZooKeeper 的连接地址、监听器地址以及偏移量主题的复制因子等参数[^2]。 #### 配置 Kafka Kafka配置文件通常位于 `/etc/kafka/` 目录下,主要的配置文件包括 `server.properties` 和 `zookeeper.properties`。对于基本的 Kafka 设置,重点在于 `server.properties` 文件中的配置项。例如,确保 `broker.id` 是唯一的,并且 `zookeeper.connect` 指向正确的 ZooKeeper 地址。 此外,如果计划使用 Kerberos 认证,则需要按照特定的安全指南进行配置,并获取相应的主体信息[^4]。 #### 测试 Kafka 连接性 一旦 Kafka 容器启动并且配置正确,就可以通过创建一个测试生产者和消费者来验证 Kafka 是否正常工作。这可以通过编写简单的 Java 或 Python 脚本来实现,或者直接使用 Kafka 提供的命令行工具来进行测试。 以上步骤提供了在 Docker 环境中安装和配置 Kafka 的基础框架。根据具体的业务需求和技术栈,可能还需要进一步调整和优化这些设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值