【问题标题】:How do I set up a Kafka service on gitlab-ci.yml?如何在 gitlab-ci.yml 上设置 Kafka 服务?
【发布时间】:2018-07-05 04:12:19
【问题描述】:

我目前无法在 gitlab CI 上设置 Kafka 服务来运行集成测试,我目前正在使用 spotify/kafka docker 映像。如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 你能添加你的 gitlab-ci yaml 文件吗?这样我们就有了开始的地方。话虽如此,很多时候 gitlab-ci 要求您将测试所需的任何内容烘焙到歌手容器中(或在 docker 中使用 docker 来运行其他容器)。这不是一个真正的答案,但在概念上可能会有所帮助!
  • Github 上还有其他库是 Junit 中的嵌入式 Kafka 服务器

标签: apache-kafka gitlab gitlab-ci


【解决方案1】:

它与托管 Kafka 和 Zookeeper 的容器很好地配合使用,并允许控制内部和外部的“广告侦听器”。 external应设置为容器的别名,internal为localhost(即:容器的localhost)。

spotify/kafka-image 只允许您设置广告主机,而不是完整的广告监听器字符串;因为内部和外部必须不同,所以这是行不通的。

krisgeus/docker-kafka (https://github.com/krisgeus/docker-kafka) 允许设置所需的一切。

下面的 .gitlab-ci.yml 允许我从 ci-jobs 连接到 kafka:9092:

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

【讨论】:

  • 即使没有别名也可以工作,使用主机名:krisgeus__docker-kafka。示例:pastebin.com/LXVGKznw
  • krisgeus/docker-kafkaspotify/kafka-image 都维护得很差(如果有的话)。
  • 这种情况下gitlab runner如何做端口映射?
【解决方案2】:

我浪费了我生命中的好几天,试图让它与 docker 容器一起工作,包括提到的spotify/kafka

最初我尝试将其用作服务。但是,无论我做什么,它都行不通。事实上,我的测试可以很好地连接到服务并且服务确实启动了。然而,它看起来像是 zookeeper 和 kafka 之间的一些奇怪的网络问题。我的猜测是您需要将 ADVERTISED_HOST 设置为 spotify__kafka 以允许您的跑步者和服务之间建立连接。然而,这意味着 zookeeper 认为 kafka 也在该主机名而不是 localhost 上,并且由于服务无法与 gitlab 中的其他服务通信,因此您遇到了一个看似不可能修复的网络问题。但是,这只是一个猜测,所以请随意
如果我错了,请纠正我。

接下来我尝试在 docker 中使用 docker,目的是从我的测试中启动 kafka。一切顺利,容器启动,但是我意识到我很快又回到了我上面遇到的确切问题,因为在 gitlab 中与 dind 通信时 localhost 不是 localhost,而是您需要使用主机名 docker .这再次意味着 zookeeper 无法连接到 kafka,因为 ADVERTISED_HOST 必须更改。

最后我说把它搞砸并在我的gitlab-ci.yml 脚本中手动安装了 kafka 而没有 docker。脚本是这样的

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 访问。我知道这并不优雅,但它可以完成工作

【讨论】:

    【解决方案3】:

    Bart 的答案适用于 krisgeus/docker-kafka,但就像 cmets 中提到的那样,它没有得到维护。通过稍微重命名的环境变量,这可以适应更新的blacktop/kafka

    services:
      - name: blacktop/kafka
        alias: kafka
    
    variables:
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:9092,INTERNAL://localhost:9093'
      KAFKA_BROKER_ID: '1'
      KAFKA_INTER_BROKER_LISTENER_NAME: 'INTERNAL'
      KAFKA_LISTENERS: 'PLAINTEXT://0.0.0.0:9092,INTERNAL://0.0.0.0:9093'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'PLAINTEXT:PLAINTEXT,INTERNAL:PLAINTEXT'
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_CREATE_TOPICS: "test:1:1"
    

    现在您可以使用端点 kafka:9092 从您的测试连接到代理。

    【讨论】:

      猜你喜欢
      • 2023-01-13
      • 2019-07-29
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2019-06-29
      • 2021-11-11
      相关资源
      最近更新 更多