来源头条作者:马士兵教育从 Dockerfile 开始一步一步完成 Kafka 容器化Apache Kafka 容器化解决方案以及部署案例。从零开始,自己编写 Dockerfile, 打包容器镜像,并开发了 helm chart 实现 k8s 快速部署。项目特色:全面兼容 KRaft, 不依赖 ZooKeeper灵活使用环境变量进行配置覆盖提供 helm chart,支持 kubernetes 集群外访问相关链接:GitHubDocker HubDockerfile初始化脚本 entrypoint.shDockerfileDockerfile复制代码# builder FROM alpine as builder ARG kafka_version=3.3.2 ARG scala_version=2.13 ENV dl_url="https://downloads.apache.org/kafka/${kafka_version}/kafka_${scala_version}-${kafka_version}.tgz" RUN set -ex \ ; mkdir -pv /tmp/kfk \ ; wget "$dl_url" -O /tmp/kfk/kafka.tgz \ ; cd /tmp/kfk rm -f /tmp/kfk/kafka.tgz \ ; mv kafka_* kafka # container FROM eclipse-temurin:17-jre-focal ENV KAFKA_HOME="/opt/kafka" \ KAFKA_CONF_FILE="/etc/kafka/server.properties" RUN set -ex \ ; useradd kafka --uid 1000 -m -s /bin/bash \ ; usermod -g root kafka \ ; mkdir -pv "/etc/kafka" && chown -R 1000:1000 "/etc/kafka" COPY --from=0 --chown=1000:1000 /tmp/kfk/kafka "$KAFKA_HOME" COPY entrypoint.sh /entrypoint.sh WORKDIR $KAFKA_HOME EXPOSE 9092 # USER 1000 ENTRYPOINT [ "/entrypoint.sh" ] CMD [ "start" ] Docker 部署shell复制代码## broker 默认端口 9092 docker run -d --name kafka-server \ --network host \ sir5kong/kafka:v3.3 自定义端口号:shell复制代码## 自定义端口号 docker run -d --name kafka-server \ --network host \ --env KAFKA_CONTROLLER_LISTENER_PORT=29091 \ --env KAFKA_BROKER_LISTENER_PORT=29092 \ sir5kong/kafka:v3.3 启动 kafka server 并持久化数据目录:shell复制代码docker volume create kafka_data docker run -d --name kafka-server \ --network host \ -v kafka_data:/opt/kafka/data \ sir5kong/kafka:v3.3 Docker Composeyaml复制代码version: "3" volumes: kafka-data: {} ## broker 默认端口 9092 ## bootstrap-server: ${KAFKA_HOST_IP_ADDR}:9092 services: kafka: image: sir5kong/kafka:v3.3 # restart: always network_mode: host volumes: - kafka-data:/opt/kafka/data environment: - KAFKA_HEAP_OPTS=-Xmx512m -Xms512m #- KAFKA_CONTROLLER_LISTENER_PORT=19091 #- KAFKA_BROKER_LISTENER_PORT=9092 使用桥接网络请参考 examples/docker-compose-bridge.yml更多部署案例和注解请参考 examples环境变量环境变量默认值描述KAFKA_CLUSTER_ID随机生成集群 idKAFKA_BROKER_LISTENER_PORT9092broker 端口号,如果配置了 KAFKA_CFG_LISTENERS 则此项失效KAFKA_CONTROLLER_LISTENER_PORT19091controller 端口号,如果配置了 KAFKA_CFG_LISTENERS 则此项失效KAFKA_HEAP_OPTSnulljvm 堆内存配置,例如 -Xmx512m -Xms512m配置覆盖Kafka 所有配置项可以通过环境变量覆盖,除了 log.dir 和 log.dirs。环境变量名使用前缀 KAFKA_CFG_ 加上配置参数,. 需要替换为 _例如 KAFKA_CFG_LISTENERS 对应配置参数 listeners,KAFKA_CFG_ADVERTISED_LISTENERS 对应配置参数 advertised.listeners常用配置参数:环境变量配置参数KAFKA_CFG_PROCESS_ROLESprocess.rolesKAFKA_CFG_LISTENERSlistenersKAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAPlistener.security.protocol.mapKAFKA_CFG_ADVERTISED_LISTENERSadvertised.listenersKAFKA_CFG_CONTROLLER_QUORUM_VOTERScontroller.quorum.votershelm chart 部署案例kafka-helm-chartshell复制代码git clone https://github.com/sir5kong/kafka-docker.git cd kafka-docker # kubectl create namespace your-namespace ## 部署单节点集群, 仅启动一个 Pod helm install kafka -n your-namespace -f ./examples/values-combined.yml ./charts/kafka ## 部署生产集群, 3 个 controller 实例, 3 个 broker 实例 helm install kafka -n your-namespace -f ./examples/values-production.yml ./charts/kafka ###### 组合使用 values 文件 ###### ## 部署生产集群,并开启 kafka-ui 和 kafka exporter helm install kafka -n your-namespace \ -f ./examples/values-exporter.yml \ -f ./examples/values-ui.yml \ -f ./examples/values-production.yml \ ./charts/kafka ## 以 NodePort 对集群外暴露 helm install kafka -n your-namespace -f ./examples/values-nodeport.yml ./charts/kafka ## 以 LoadBalancer 对集群外暴露 helm install kafka -n your-namespace -f ./examples/values-loadbalancer.yml ./charts/kafka ## 开启 kafka-ui helm install kafka -n your-namespace -f ./examples/values-ui.yml ./charts/kafka