0


【Docker】Kafka 容器化部署

Kafka docker 容器化部署

Kafka标准软件基于Bitnami Kafka 构建。当前版本为3.6.1

你可以通过轻云UC 部署工具直接安装部署,也可以手动按如下文档操作
部署配置文件获取地址: https://gitee.com/qingplus/qingcloud-platform

配置

可以使用以下环境变量通过 Bitnami Apache Kafka Docker 设置配置:

  • KAFKA_CERTIFICATE_PASSWORD:证书的密码。没有默认值。
  • KAFKA_HEAP_OPTS:Apache Kafka 的 Java 堆大小。默认值:-Xmx1024m -Xms1024m。
  • KAFKA_ZOOKEEPER_PROTOCOL:Zookeeper 连接的身份验证协议。允许的协议:PLAINTEXT、SASL、SSL和SASL_SSL。默认值:纯文本。
  • KAFKA_ZOOKEEPER_USER:用于 SASL 身份验证的 Apache Kafka Zookeeper 用户。没有默认值。
  • KAFKA_ZOOKEEPER_PASSWORD:用于 SASL 身份验证的 Apache Kafka Zookeeper 用户密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD:Apache Kafka Zookeeper密钥库文件密码和密钥密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD:Apache Kafka Zookeeper 信任库文件密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME:验证 TLS 证书上的 Zookeeper 主机名。默认值:true。
  • KAFKA_ZOOKEEPER_TLS_TYPE:选择要使用的 TLS 证书格式。允许值:JKS, PEM. 默认值:JKS。
  • KAFKA_CFG_LISTENERS:Kafkalisteners配置覆盖。没有默认值。
  • KAFKA_CFG_ADVERTISED_LISTENERS:Kafkaadvertised.listeners配置覆盖。没有默认值。
  • KAFKA_CFG_SASL_ENABLED_MECHANISMS:将 SASL 用于客户端、代理间或 Zookeeper 通信时允许的机制。允许的值:PLAIN、SCRAM-SHA-256或SCRAM-SHA-512这些值的逗号分隔组合。默认值:PLAIN、SCRAM-SHA-256、SCRAM-SHA-512。注意:KRaft <= 3.4 尚不支持 SCRAM 机制,因此此列表将自动缩减为仅PLAINSASL 机制。
  • KAFKA_TLS_CLIENT_AUTH:设置 的值ssl.client.auth。允许值:required, requested, none. 默认值:必填。
  • KAFKA_TLS_<uppercase_listener_name>_CLIENT_AUTHlistener.name..ssl.client.auth:设置用于通过 SASL 配置 mTLS的值。允许值:required, requested, none.
  • KAFKA_TLS_TYPE:选择要使用的 TLS 证书格式。允许值:JKS, PEM. 默认值:JKS。
  • KAFKA_CLIENT_USERS:使用 SASL 进行客户端通信时将在 Zookeeper 中创建的用户。被逗号隔开。默认:用户
  • KAFKA_CLIENT_PASSWORDS:在 处指定的用户的密码KAFKA_CLIENT_USERS。被逗号隔开。默认值:bitnami
  • KAFKA_CFG_MAX_PARTITION_FETCH_BYTES:服务器将返回的每个分区的最大数据量。没有默认值。
  • KAFKA_CFG_MAX_REQUEST_SIZE:请求的最大大小(以字节为单位)。没有默认值。
  • KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL:用于代理间通信的 SASL 机制。没有默认值。注意:KRaft <= 3.4 尚不支持 SCRAM 机制,因此 KRaft 模式下唯一支持的 SASL 机制是PLAIN.
  • KAFKA_INTER_BROKER_USER:Apache Kafka 代理间通信用户。默认值:用户。
  • KAFKA_INTER_BROKER_PASSWORD:Apache Kafka 代理间通信密码。默认值:bitnami。
  • KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:用于控制器通信的 SASL 机制。没有默认值。注意:KRaft <= 3.4 尚不支持 SCRAM 机制,因此 KRaft 模式下唯一支持的 SASL 机制是PLAIN.
  • KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用户。默认值:controller_user。
  • KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密码。默认值:bitnami。
  • KAFKA_CFG_PROCESS_ROLES:KRaft 模式下运行时的节点角色。没有默认值。
  • KAFKA_CFG_NODE_ID:唯一的节点id,在KRaft模式下运行时需要。没有默认值。
  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:使用 Apache Kafka 安全协议映射每个侦听器。如果节点设置了controller角色,则需要此设置才能为CONTROLLER LISTENER. 例如:PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT。没有默认值。
  • KAFKA_CFG_CONTROLLER_QUORUM_VOTERS:以逗号分隔的 {id}@{host}:{port} 条目列表中的控制器仲裁投票者集的 id/端点信息映射。没有默认值。
  • KAFKA_CFG_CONTROLLER_LISTENER_NAMES:控制器使用的侦听器名称的逗号分隔列表。如果在 KRaft 模式下运行,这是必需的。没有默认值。
  • KAFKA_KRAFT_CLUSTER_ID:使用Kafka Raft(KRaft)时的Kafka集群ID。没有默认值。 此外,任何以KAFKA_CFG_开头的环境变量都将映射到其相应的 Apache Kafka 键。例如,使用KAFKA_CFG_BACKGROUND_THREADS设置background.threads或KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE配置auto.create.topics.enable。
docker run --name kafka -e KAFKA_CFG_PROCESS_ROLES ... -e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest

或者通过修改docker-compose.yml此存储库中存在的文件:

kafka:...environment:- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
  ...

Apache Kafka 开发设置示例

要在开发设置中使用 Apache Kafka,请创建以下docker-compose.yml文件:

version:"3"services:kafka:image:'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest'ports:-'9092:9092'environment:- KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER

要部署它,请在文件所在目录中运行以下命令docker-compose.yml:

docker-compose up -d

kafka 与zookeeper配置

Apache Kafka Raft (KRaft) 在 Kafka 中使用了新的仲裁控制器服务,该服务取代了之前的控制器,并使用了 Raft 共识协议的基于事件的变体。这极大地简化了 Kafka 的架构,将元数据整合到 Kafka 本身,而不是将其拆分到两个不同的系统:ZooKeeper 和 Kafka。

如果您想继续使用ZooKeeper,可以使用以下配置:

version:"3.9"services:zookeeper:image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/zookeeper:3.9ports:-"2181:2181"volumes:-"zookeeper_data:/bitnami"environment:- ALLOW_ANONYMOUS_LOGIN=yes
  kafka:image: registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:3.6.1
    ports:-"9092:9092"volumes:-"kafka_data:/bitnami"environment:- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181depends_on:- zookeeper
volumes:zookeeper_data:driver: local
  kafka_data:driver: local

使用内部和外部客户端访问 Apache Kafka

为了使用内部和外部客户端访问 Apache Kafka 代理,您需要为每个客户端配置一个侦听器。

为此,请将以下环境变量添加到 docker-compose 中:

    environment:
      - KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@<your_host>:9093
+     - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
+     - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
+     - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER

并暴露外部端口:

内部客户端仍然可以在docker网络内使用

    ports:
-     - '9092:9092'
+     - '9094:9094'

注意:要从外部进行连接,请将localhost上面的内容更改为主机的外网IP/主机名并包含EXTERNAL://0.0.0.0:9093在内KAFKA_CFG_LISTENERS以允许远程连接。

使用外部客户端的生产者和消费者

这些来自同一主机的客户端将用于localhost连接到 Apache Kafka。

kafka-console-producer.sh --producer.config /opt/bitnami/kafka/config/producer.properties --bootstrap-server 127.0.0.1:9094 --topic test
kafka-console-consumer.sh --consumer.config /opt/bitnami/kafka/config/consumer.properties --bootstrap-server 127.0.0.1:9094 --topic test --from-beginning

如果从另一台计算机运行这些命令,请相应地更改地址。

使用内部客户端的生产者和消费者

这些来自同一 Docker 网络上其他容器的客户端将使用 kafka 容器服务主机名连接到 Apache Kafka。

kafka-console-producer.sh --producer.config /opt/bitnami/kafka/config/producer.properties --bootstrap-server kafka:9092 --topic test
kafka-console-consumer.sh --consumer.config /opt/bitnami/kafka/config/consumer.properties --bootstrap-server kafka:9092 --topic test --from-beginning

同样,应用程序代码需要使用bootstrap.servers=kafka:9092

安全

为了配置身份验证,您必须正确配置 Apache Kafka 侦听器。让我们看一个示例,为 Apache Kafka 配置SASL_SSL与客户端通信的身份验证以及SASL与控制器相关的通信的身份验证。

定义以下环境变量,以及用于客户端通信的 SASL 凭据:

KAFKA_CFG_LISTENERS=SASL_SSL://:9092,CONTROLLER://:9093
KAFKA_CFG_ADVERTISED_LISTENERS=SASL_SSL://localhost:9092
KAFKA_CLIENT_USERS=user
KAFKA_CLIENT_PASSWORDS=password
KAFKA_CLIENT_LISTENER_NAME=SASL_SSL
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
KAFKA_CONTROLLER_USER=controller_user
KAFKA_CONTROLLER_PASSWORD=controller_password

必须使用自己的 SSL 证书。您可以将 Java 密钥存储或 PEM 文件放入/opt/bitnami/kafka/config/certs. 如果 JKS 或 PEM 证书受密码保护(推荐),您将需要提供它才能访问密钥库:

KAFKA_CERTIFICATE_PASSWORD=myCertificatePassword

如果相关证书安装在/opt/bitnami/kafka/config/certs/kafka.truststore.jks、/opt/bitnami/kafka/config/certs/kafka.truststore.pem,/bitnami/kafka/config/certs/kafka.truststore.jks,/bitnami/kafka/config/certs/kafka.truststore.pem,请设置该KAFKA_TLS_TRUSTSTORE_FILE变量。

以下脚本可以帮助您创建 JKS 和证书:

  • kafka-generate-ssl.sh

请记住以下注意事项:
当提示输入密码时,请为所有节点使用相同的密码。

  • 将 Common Name 或 FQDN 值设置Apache Kafka 容器主机名,例如kafka.example.com。输入此值后,当提示“您的名字和姓氏是什么?”时,也输入此值。
  • 作为替代方案,您可以禁用主机名验证,将环境变量设置KAFKA_CFG_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM为空字符串。
  • 设置 Apache Kafka 集群时(请查看“设置 Apache Kafka 集群”以获取更多信息),每个 Apache Kafka 代理和逻辑客户端都需要自己的密钥库。您必须对集群中的每个代理重复该过程。
  • 以下 docker-compose 文件是一个示例,显示如何挂载受密码保护的 JKS 证书certificatePassword123。此外,它还指定 Apache Kafka 容器主机名以及客户端和 Zookeeper 用户的凭据。
version:'2'services:kafka:image:'registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest'hostname: kafka.example.com
    ports:-'9092'environment:- KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093- KAFKA_CFG_LISTENERS=SASL_SSL://:9092,CONTROLLER://:9093- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
      - KAFKA_CFG_ADVERTISED_LISTENERS=SASL_SSL://:9092- KAFKA_CLIENT_USERS=user
      - KAFKA_CLIENT_PASSWORDS=password
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
      - KAFKA_CONTROLLER_USER=controller_user
      - KAFKA_CONTROLLER_PASSWORD=controller_password
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=SASL_SSL
      - KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
      - KAFKA_INTER_BROKER_USER=controller_user
      - KAFKA_INTER_BROKER_PASSWORD=controller_password
      - KAFKA_CERTIFICATE_PASSWORD=certificatePassword123
      - KAFKA_TLS_TYPE=JKS # or PEMvolumes:# Both .jks and .pem files are supported# - './kafka.keystore.pem:/opt/bitnami/kafka/config/certs/kafka.keystore.pem:ro'# - './kafka.keystore.key:/opt/bitnami/kafka/config/certs/kafka.keystore.key:ro'# - './kafka.truststore.pem:/opt/bitnami/kafka/config/certs/kafka.truststore.pem:ro'-'./kafka.keystore.jks:/opt/bitnami/kafka/config/certs/kafka.keystore.jks:ro'-'./kafka.truststore.jks:/opt/bitnami/kafka/config/certs/kafka.truststore.jks:ro'

为了获得使用和生成消息所需的凭据,您需要在客户端中提供凭据。如果您的 Apache Kafka 客户端允许,请使用您提供的凭据。

在使用bitnami/kafka image生成和使用消息时,您需要指向consumer.properties和/或producer.properties文件,其中包含工作所需的配置。您可以在该目录中找到该文件/opt/bitnami/kafka/config。

生成消息:

kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 --topic test --producer.config /opt/bitnami/kafka/config/producer.properties

消费消息:

kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --consumer.config /opt/bitnami/kafka/config/consumer.properties

使用其他工具来使用 Apache Kafka 集群,则需要提供所需的信息。您可以在位于目录的文件中找到所需的信息/opt/bitnami/kafka/config。

Inter-Broker 通信

当部署具有多个代理的 Apache Kafka 集群时,可以使用以下变量SASL配置代理间通信:SASL_SSL

  • KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL:Apache Kafka 代理间通信协议。
  • KAFKA_INTER_BROKER_USER:Apache Kafka 代理间通信用户。
  • KAFKA_INTER_BROKER_PASSWORD:Apache Kafka 代理间通信密码。 注意:在 KRaft 模式下运行时,KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL 仅支持PLAINKafka 版本 <= 3.4 中的机制。
Control plane通信

在 KRaft 模式下部署具有多个控制器的 Apache Kafka 集群时,可以使用以下变量SASL配置控制器通信:SASL_SSL

  • KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:Apache Kafka 控制器通信协议。
  • KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用户。目前仅PLAIN支持机制。
  • KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密码。 注意:在KRaft模式下运行时,KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL仅支持PLAIN机制。
Apache Kafka SASL 配置

配置 Apache Kafka 侦听器SASL或SASL_SSL与客户端通信时,您可以使用以下环境变量提供 SASL 凭据:

  • KAFKA_CLIENT_USERS:Apache Kafka 客户端用户。默认:user
  • KAFKA_CLIENT_PASSWORDS:Apache Kafka 客户端用户密码。默认值:bitnami 注意:在 KRaft 模式下运行时,只有第一个user:password对才会生效,因为 KRaft 模式尚不支持 SCRAM 机制。
Apache Kafka KRaft 模式配置

可以通过提供以下值来启用 KRaft 模式:

  • KAFKA_CFG_PROCESS_ROLES:以逗号分隔的 Kafka KRaft 角色列表。允许值:‘controller,broker’, ‘controller’, ’broker‘.
  • KAFKA_CFG_NODE_ID:Kafka节点的唯一id。
  • KAFKA_CFG_LISTENERS:Kafka 监听器列表。如果节点设置了角色包含controller,则必须包含CONTROLLER监听器。
  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP:使用 Apache Kafka 安全协议映射每个侦听器。如果节点设置了controller角色,则需要此设置环境变量. 例如:PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT。
  • 为了在没有身份验证的情况下配置控制器通信,应该提供以下环境变量: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 应包括CONTROLLER:PLAINTEXT.

为了配置 Apache Kafka 控制器通信带SASL,应该提供以下环境变量:

  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 应包括CONTROLLER:SASL.
  • KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:用于控制器通信的 SASL 机制。注意:KRaft 模式尚不支持 SCRAM 机制,因此 KRaft 模式中唯一支持的 SASL 机制是PLAIN.
  • KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用户。
  • KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密码。

为了配置 Apache Kafka 控制器通信带SSL,应该提供以下环境变量:

  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 应包括CONTROLLER:SSL.
  • KAFKA_TLS_<uppercase_controller_listener_name>_CLIENT_AUTH:配置 kafka 控制平面通信的 mTLS 身份验证方法。允许值:required, requested, none.
  • KAFKA_TLS_TYPE:选择要使用的 TLS 证书格式。允许值:JKS, PEM. 默认值:JKS。 有效的密钥库和信任库安装在/opt/bitnami/kafka/config/certs/kafka.keystore.jks和 处/opt/bitnami/kafka/config/certs/kafka.truststore.jks。
  • 为了使用 Zookeeper 服务器对 Apache Kafka 进行身份验证SASL_SSL,应该提供以下环境变量:
  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 应包括CONTROLLER:SASL_SSL.
  • KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL:用于控制器通信的 SASL 机制。注意:KRaft 模式尚不支持 SCRAM 机制,因此 KRaft 模式中唯一支持的 SASL 机制是PLAIN.
  • KAFKA_CONTROLLER_USER:Apache Kafka 控制器通信用户。
  • KAFKA_CONTROLLER_PASSWORD:Apache Kafka控制器通信密码。
  • KAFKA_TLS_<uppercase_controller_listener_name>_CLIENT_AUTH:配置 kafka 控制平面通信的 mTLS 身份验证方法。允许值:required, requested, none.
  • KAFKA_TLS_TYPE:选择要使用的 TLS 证书格式。允许值:JKS, PEM. 默认值:JKS。 有效的密钥库和信任库安装在/opt/bitnami/kafka/config/certs/kafka.keystore.jks和 处/opt/bitnami/kafka/config/certs/kafka.truststore.jks。 SSL注意:SSL 设置由使用或协议配置的所有侦听器共享SASL_SSL。尚不支持为每个侦听器设置不同的证书。
Apache Kafka ZooKeeper 模式配置

可以通过提供以下值来启用 Zookeeper 模式:

  • KAFKA_CFG_ZOOKEEPER_CONNECT:以逗号分隔的 Zookeeper 连接字符串列表。例如<zk_host1>:<zk_port1>,<zk_host2>:<zk_port2>
  • KAFKA_CFG_BROKER_ID:Kafka Broker 的可选ID。如果不设置,将自动生成一个随机ID。 连接 Zookeeper 服务器有不同的配置选项。

为了无需身份验证即可连接 Zookeeper 服务器,您应该提供以下环境变量:

  • KAFKA_ZOOKEEPER_PROTOCOL:纯文本。

为了使用 Zookeeper 服务器对 Apache Kafka 进行身份验证SASL,您应该提供以下环境变量:

  • KAFKA_ZOOKEEPER_PROTOCOL:SASL。
  • KAFKA_ZOOKEEPER_USER:用于 SASL 身份验证的 Apache Kafka Zookeeper 用户。没有默认值。
  • KAFKA_ZOOKEEPER_PASSWORD:用于 SASL 身份验证的 Apache Kafka Zookeeper 用户密码。没有默认值。

为了使用 Zookeeper 服务器对 Apache Kafka 进行身份验证SSL,您应该提供以下环境变量:

  • KAFKA_ZOOKEEPER_PROTOCOL:SSL。
  • KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD:Apache Kafka Zookeeper密钥库文件密码和密钥密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD:Apache Kafka Zookeeper 信任库文件密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME:验证 TLS 证书上的 Zookeeper 主机名。默认值:true。
  • KAFKA_ZOOKEEPER_TLS_TYPE:选择要使用的 TLS 证书格式。允许值:JKS, PEM. 默认值:JKS。

为了使用 Zookeeper 服务器对 Apache Kafka 进行身份验证SASL_SSL,您应该提供以下环境变量:

  • KAFKA_ZOOKEEPER_PROTOCOL:SASL_SSL。
  • KAFKA_ZOOKEEPER_USER:用于 SASL 身份验证的 Apache Kafka Zookeeper 用户。没有默认值。
  • KAFKA_ZOOKEEPER_PASSWORD:用于 SASL 身份验证的 Apache Kafka Zookeeper 用户密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_FILE:Apache Kafka Zookeeper 信任库文件位置。如果安装位置不同于/bitnami/kafka/conf/certs/zookeeper.truststore.pem、/bitnami/kafka/conf/certs/zookeeper.truststore.jks或无默认值,请设置/opt/bitnami/kafka/config/certs/zookeeper.truststore.jks它。/opt/bitnami/kafka/conf/certs/zookeeper.truststore.pem
  • KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD:Apache Kafka Zookeeper密钥库文件密码和密钥密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD:Apache Kafka Zookeeper 信任库文件密码。没有默认值。
  • KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME:验证 TLS 证书上的 Zookeeper 主机名。默认值:true。
  • KAFKA_ZOOKEEPER_TLS_TYPE:选择要使用的 TLS 证书格式。允许值:JKS, PEM. 默认值:JKS。 注意:您还必须使用自己的 SSL 证书。您可以将 Java 密钥库(zookeeper.keystore.jks和)或zookeeper.truststore.jksPEM 文件(zookeeper.keystore.pem和)安装到zookeeper.keystore.key. 如果客户端身份验证是在Zookeeper 中,则证书文件是可选的。zookeeper.truststore.pem/opt/bitnami/kafka/conf/certsnonewant

设置 Apache Kafka 集群

可以使用以下环境变量通过设置 Apache Kafka 集群:

  • KAFKA_CFG_CONTROLLER_QUORUM_VOTERS:逗号分隔的host:port对,每个对应一个 Kafka 控制器连接。
步骤 1:为 Apache Kafka 创建第一个节点

第一步是创建一个 Apache Kafka 实例。

docker run --name kafka-0 \
  --network app-tier \
  -e KAFKA_CFG_NODE_ID=0 \
  -e KAFKA_CFG_PROCESS_ROLES=controller,broker \
  -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
  -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 \
  -e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
  -e KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3 \
  -e KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2 \
  -e KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv \
  -p :9092 \
  -p :9093 \
  registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
步骤 2:创建第二个节点

接下来我们启动一个新的 Apache Kafka 容器。

docker run --name kafka-1 \
  --network app-tier \
  -e KAFKA_CFG_NODE_ID=1 \
  -e KAFKA_CFG_PROCESS_ROLES=controller,broker \
  -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
  -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 \
  -e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
  -e KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3 \
  -e KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2 \
  -e KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv \
  -p :9092 \
  -p :9093 \
  registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest
步骤3:创建第三个节点

接下来我们启动另一个新的 Apache Kafka 容器。

docker run --name kafka-3 \
  --network app-tier \
  -e KAFKA_CFG_NODE_ID=3 \
  -e KAFKA_CFG_PROCESS_ROLES=controller,broker \
  -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
  -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093 \
  -e KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3 \
  -e KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3 \
  -e KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2 \
  -e KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv \
  -p :9092 \
  -p :9093 \
  registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest

一个 Apache Kafka 集群配置完成。可以通过添加/删除从属服务器来扩展集群,而不会导致任何停机。

可以在文件中找到此部署的 docker-compose 版本docker-compose-cluster.yml。

示例:创建一个 replicated topic

可以使用以下命令创建:

root@kafka-0:/# /opt/bitnami/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic mytopic --partitions 3 --replication-factor 3
Created topic "mytopic".

root@kafka-0:/# /opt/bitnami/kafka/bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic mytopic
Topic:mytopic   PartitionCount:3        ReplicationFactor:3     Configs:
Topic: mytopic  Partition: 0    Leader: 2       Replicas: 2,3,1 Isr: 2,3,1
Topic: mytopic  Partition: 1    Leader: 3       Replicas: 3,1,2 Isr: 3,1,2
Topic: mytopic  Partition: 2    Leader: 1       Replicas: 1,2,3 Isr: 1,2,3

All配置

该镜像中所有配置可以在/bitnami/kafka/config/中查找,可以通过设置 KAFKA_MOUNTED_CONF_DIR 环境变量来更改该位置。

docker run --name kafka -v /path/to/server.properties:/bitnami/kafka/config/server.properties registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest

之后,更改将被同步到容器中。

第 1 步:运行 Apache Kafka 映像

运行 Apache Kafka 映像,从主机安装目录。

修改docker-compose.yml文件:

...
services:
  kafka:
    ...
    volumes:
      - 'kafka_data:/bitnami'
+     - /path/to/server.properties:/bitnami/kafka/config/server.properties
第 2 步:编辑配置

使用您喜欢的编辑器编辑主机上的配置。

vi /path/to/server.properties

第3步:重启Apache Kafka
更改配置后,重新启动 Apache Kafka 容器以使更改生效。

docker restart kafka

或者使用 Docker Compose:

docker-compose restart kafka

日志
容器日志发送到stdout. 要查看日志:

docker logs kafka

或者使用 Docker Compose:

docker-compose logs kafka

维护

备份您的容器

要备份数据、配置和日志,请按照以下简单步骤操作:

第 1 步:停止当前正在运行的容器
docker stop kafka

或者使用 Docker Compose:

docker-compose stop kafka
步骤2:运行备份命令

我们需要在用于创建备份的容器中安装两个卷:主机上用于存储备份的目录,以及我们刚刚停止的容器中的卷,以便我们可以访问数据。

docker run --rm -v /path/to/kafka-backups:/backups --volumes-from kafka busybox \
cp -a /bitnami/kafka /backups/latest

或者使用 Docker Compose:

docker run --rm -v /path/to/kafka-backups:/backups --volumes-from `docker-compose ps -q kafka` busybox \
cp -a /bitnami/kafka /backups/latest

恢复备份

恢复备份就像将备份作为卷安装在容器中一样简单。

docker run -v /path/to/kafka-backups/latest:/bitnami/kafka registry.cn-hangzhou.aliyuncs.com/qingcloudtech/kafka:latest

修改docker-compose.yml文件:

kafka:volumes:- /path/to/kafka-backups/latest:/bitnami/kafka

从 Zookeeper 模式迁移到 KRaft 模式

本节介绍 Kafka 从 Zookeeper 模式到 KRaft 模式的迁移。

1.从 Zookeeper 获取cluster ID

2.配置controller节点,添加以下环境变量

KAFKA_CFG_PROCESS_ROLES=controller
KAFKA_CFG_NODE_ID=<unique_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
KAFKA_CFG_LISTENERS=CONTROLLER://:9093
KAFKA_CFG_ZOOKEEPER_METADATA_MIGRATION_ENABLE=true
KAFKA_CFG_ZOOKEEPER_CONNECT=<zk_host>:<zk_port>
KAFKA_KRAFT_CLUSTER_ID=<cluster_id_step1>

3.使用迁移设置配置代理:

KAFKA_CFG_BROKER_ID=<current_broker_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
KAFKA_CFG_INTER_BROKER_PROTOCOL_VERSION=3.4
KAFKA_CFG_ZOOKEEPER_METADATA_MIGRATION_ENABLE=true
KAFKA_CFG_ZOOKEEPER_CONNECT=<zk_host>:<zk_port>

4.迁移代理:

KAFKA_CFG_PROCESS_ROLES=broker
KAFKA_CFG_NODE_ID=<unique_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER

5.禁用控制器上的迁移模式:

KAFKA_CFG_PROCESS_ROLES=controller
KAFKA_CFG_NODE_ID=<unique_id>
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=<controller1_node_id>@<controller1_host>:9093,<controller2_node_id>@<controller2_host>:9093,...
KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
KAFKA_CFG_LISTENERS=CONTROLLER://:9093
KAFKA_KRAFT_CLUSTER_ID=<cluster_id_step1>
标签: kafka docker 分布式

本文转载自: https://blog.csdn.net/tanlintanlin/article/details/136398760
版权归原作者 轻云UC 所有, 如有侵权,请联系我们删除。

“【Docker】Kafka 容器化部署”的评论:

还没有评论