ci.yml上设置kafka服务?

qncylg1j  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(721)

我目前在gitlab ci上设置kafka服务以运行集成测试时遇到问题,我目前正在使用spotify/kafka docker映像。如果有人能帮我解决这个问题,我会非常感激的。

xcitsw88

xcitsw881#

它可以很好地与托管kafka和zookeeper的容器配合使用,并允许控制内部和外部的“广告侦听器”。external应该设置为容器的别名,localhost的内部别名(即:容器的localhost)。
spotify/kafka图像只允许设置播发主机,而不允许设置完整的播发侦听器字符串;因为内部和外部必须是不同的,这是行不通的。
克丽斯格斯/ Docker Kafka(https://github.com/krisgeus/docker-kafka)允许设置所需的一切。
下面的.gitlab-ci.yml允许我连接到kafka:9092 from ci作业:

variables:
  ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:9092,INTERNAL://localhost:9093'
  LISTENERS: 'PLAINTEXT://0.0.0.0:9092,INTERNAL://0.0.0.0:9093'
  SECURITY_PROTOCOL_MAP: 'PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT'
  INTER_BROKER: 'INTERNAL'
  KAFKA_CREATE_TOPICS: 'cc-event:36:1'

services:
  - name: krisgeus/docker-kafka
    alias: kafka
i2loujxw

i2loujxw2#

我浪费了好几天的时间,试图用docker容器来处理这个问题,包括上面提到的那个 spotify/kafka .
起初我试着把它当作一种服务。但是不管我做了什么,它都不起作用。事实上,我的测试可以很好地连接到服务,服务确实启动了。不过,这看起来像是Zookeeper和Kafka之间的一些奇怪的网络问题。我猜您需要将主机设置为 spotify__kafka 它允许您的跑步者和服务之间的连接。然而,这意味着zookeeper认为kafka也是这个主机名而不是localhost,并且由于服务无法与gitlab中的其他服务进行通信,您会遇到一个似乎不可能解决的网络问题。不过,这只是一个猜测,所以请随时联系我们
如果我错了,请纠正我。
接下来,我尝试在docker中使用docker,目的是从我的测试中启动kafka。一切都很顺利,容器启动了,但是我意识到我很快就回到了我上面提到的问题,在gitlab中与dind通信时localhost不是localhost,而是需要使用主机名 docker . 这再次意味着zookeeper无法连接到Kafka,因为主机必须更改。
最后,我说去死吧,手动安装Kafka,我的电脑里没有docker gitlab-ci.yml 脚本。剧本是这样的

stages:
  - build

build:
  stage: build
  image: ubuntu:latest
  variables:
    KAFKA_HOST: localhost:9092
  script:
    - apt-get update
    - apt-get install -y wget nodejs npm default-jre-headless
    - wget http://ftp.heanet.ie/mirrors/www.apache.org/dist/kafka/2.1.0/kafka_2.11-2.1.0.tgz
    - tar -xzf kafka_2.11-2.1.0.tgz
    - ls -ltra kafka_2.11-2.1.0/bin
    - nohup kafka_2.11-2.1.0/bin/zookeeper-server-start.sh kafka_2.11-2.1.0/config/zookeeper.properties > /dev/null 2>&1 &
    - sleep 2
    - nohup kafka_2.11-2.1.0/bin/kafka-server-start.sh kafka_2.11-2.1.0/config/server.properties > /dev/null 2>&1 &
    - sleep 2
    - npm install
    - npm test

可在上访问 localhost . 我知道这并不优雅,但它能完成任务

相关问题