如何为Docker容器订购Kafka启动脚本?

3

我正在尝试将Kafka服务器容器化。 Kafka服务器的正常启动顺序如下:

A: start Zookeeper server
B: start Broker server
C: create topic

项目 AB 是长时间运行的进程。而 C 需要等待 B 启动并运行。

因此,我编写了一个 Dockerfile,并使用 ENTRYPOINT 执行一个 shell 脚本来完成上述序列:

#!/bin/sh

$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties &
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties &

$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test_topic

然而,当我运行从此构建的docker镜像时,遇到了三个问题:

  • Docker要求ENTRYPOINT进程是长时间运行的,而上面的脚本则不是。(只要主题创建完成,它就退出了)
  • 代理服务器语句(第二个语句)是长时间运行的过程。目前,我必须使用结束符&将其作为后台进程放置,否则在它之后的语句根本不会被执行。(但将其设置为后台进程也有问题:主题创建立即执行,而代理服务器尚未准备好。)
  • 我无法将代理服务器语句放置在最后一个长时间运行的进程中,因为主题创建语句必须在服务器创建之后。

有什么好的方法来安排这个启动序列吗?

3个回答

2

基本上你想要先启动ZK,然后再启动Kafka。然后以某种方式等待Kafka准备就绪(这是棘手的部分),使用Kafka处理工作(例如,在你的情况下创建主题),然后等待直到Kafka和ZK完成(在中断时会发生什么)。

start-zookeeper &
ZK_PID=$!
start-kafka &
KAFKA_PID=$!

# that's the tricky part
wait_for_kafka
create-topic.sh

wait "${KAFKA_PID}"
wait "${ZK_PID}"

如前所述,Kafka的可用性可能会有些棘手 - 以下方法可能会有所帮助:

  • 等待Kafka响应读取请求(例如定期使用kafka-topic.sh --list进行探测)
  • 创建一个Pocket Consumer / AdminClient(Java Kafka 0.11+),并获取元数据(类似于上面的方法)
  • 检查日志/控制器等的JMX bean是否存在
  • 检查监听端口的可用性

1

Docker Compose涵盖了很多编排任务,这些任务在脚本中实现起来都不是易事。

depends_onhealthcheck服务配置可以用于创建适当的服务依赖关系,其中服务B在运行之前等待服务A处于“健康”状态。

虽然Compose还没有定义短暂任务的概念,但主题创建总是可以在启动时运行,因此一个立即退出的附加服务就可以正常工作。

在github上有一个compose定义、Dockerfile和检查脚本,实现了这种依赖设置。

version: "2.1"

services:

  zookeeper:
    image: deployable/kafka:latest
    command: zookeeper
    ports:
     - "2181:2181"
    healthcheck:
      test: [ "CMD", "/kafka/check.sh", "zookeeper" ]
      interval: 30s
      timeout: 5s
      retries: 3

  kafka:
    image: deployable/kafka:latest
    command: kafka
    environment:
      ADVERTISE_LISTENERS: 'localhost:9092'
    ports:
     - "9092:9092"
    depends_on:
      zookeeper:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "/kafka/check.sh", "kafka" ]
      interval: 30s
      timeout: 5s
      retries: 3


  kafka-setup:
    image: deployable/kafka:latest
    command: setup
    depends_on:
      kafka:
        condition: service_healthy
    environment:
      KAFKA_TOPIC: my-test-topic

1

我建议将主题创建封装到单独的脚本中,在尝试创建主题之前进行暂停,并且不要在后台运行Kafka服务器。类似于:

start-zookeeper &
create-topic.sh &
start-kafka

而 create-topic.sh 将如下所示:

sleep 5s
kafka-topics --create...

附注:虽然可以通过 nc -z 探测 Kafka 的可用性,但最好不要睡觉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接