kafka图像构建kompose

时间:2017-04-19 23:04:01

标签: docker kubernetes docker-compose

我们如何构建kafka图像,然后通过Kompose工具将其部署到kubernetes?

我正在使用这个docker-compose.yml文件。它与docker-compose一起构建了一个kafka图像。但是当我们使用Kompose,它将docker-compose.yml转换为kubernetes服务,pvc和部署时,没有预先构建的图像会导致问题。

构建kafka映像,然后在yml文件中引用它也会导致问题。 最后,我无法装载卷。

如何解决这些问题?谢谢

搬运工-compose.yml

    version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: myIP
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    links:
    - zookeeper:zk
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
  myApp:
    image: myAppImage
    ports:
      - "3904:3904"
      - "3905:3905"
    volumes:
      - /var/tmp/My.properties:/appl/myApp/bundleconfig/etc/appprops/My.properties
    depends_on:
      - zookeeper
      - kafka

download-kafka.sh文件

    #!/bin/sh

mirror=$(curl --stderr /dev/null https://www.apache.org/dyn/closer.cgi\?as_json\=1 | jq -r '.preferred')
url="${mirror}kafka/${KAFKA_VERSION}/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz"
wget -q "${url}" -O "/tmp/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz"

start-kafka.sh

 #!/bin/bash

if [[ -z "$KAFKA_PORT" ]]; then
    export KAFKA_PORT=9092
fi
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
    export KAFKA_ADVERTISED_PORT=$(docker port `hostname` $KAFKA_PORT | sed -r "s/.*:(.*)/\1/g")
fi
if [[ -z "$KAFKA_BROKER_ID" ]]; then
    # By default auto allocate broker ID
    export KAFKA_BROKER_ID=1
fi
if [[ -z "$KAFKA_LOG_DIRS" ]]; then
    export KAFKA_LOG_DIRS="/kafka/kafka-logs-$HOSTNAME"
fi
if [[ -z "$KAFKA_ZOOKEEPER_CONNECT" ]]; then
    export KAFKA_ZOOKEEPER_CONNECT=$(env | grep ZK.*PORT_2181_TCP= | sed -e 's|.*tcp://||' | paste -sd ,)
fi

if [[ -n "$KAFKA_HEAP_OPTS" ]]; then
    sed -r -i "s/(export KAFKA_HEAP_OPTS)=\"(.*)\"/\1=\"$KAFKA_HEAP_OPTS\"/g" $KAFKA_HOME/bin/kafka-server-start.sh
    unset KAFKA_HEAP_OPTS
fi

if [[ -z "$KAFKA_ADVERTISED_HOST_NAME" && -n "$HOSTNAME_COMMAND" ]]; then
    export KAFKA_ADVERTISED_HOST_NAME=$(eval $HOSTNAME_COMMAND)
fi

for VAR in `env`
do
  if [[ $VAR =~ ^KAFKA_ && ! $VAR =~ ^KAFKA_HOME ]]; then
    kafka_name=`echo "$VAR" | sed -r "s/KAFKA_(.*)=.*/\1/g" | tr '[:upper:]' '[:lower:]' | tr _ .`
    env_var=`echo "$VAR" | sed -r "s/(.*)=.*/\1/g"`
    if egrep -q "(^|^#)$kafka_name=" $KAFKA_HOME/config/server.properties; then
        sed -r -i "s@(^|^#)($kafka_name)=(.*)@\2=${!env_var}@g" $KAFKA_HOME/config/server.properties #note that no config values may contain an '@' char
    else
        echo "$kafka_name=${!env_var}" >> $KAFKA_HOME/config/server.properties
    fi
  fi
done

if [[ -n "$CUSTOM_INIT_SCRIPT" ]] ; then
  eval $CUSTOM_INIT_SCRIPT
fi


KAFKA_PID=0

# see https://medium.com/@gchudnov/trapping-signals-in-docker-containers-7a57fdda7d86#.bh35ir4u5
term_handler() {
  echo 'Stopping Kafka....'
  if [ $KAFKA_PID -ne 0 ]; then
    kill -s TERM "$KAFKA_PID"
    wait "$KAFKA_PID"
  fi
  echo 'Kafka stopped.'
  exit
}


# Capture kill requests to stop properly
trap "term_handler" SIGHUP SIGINT SIGTERM
create-topics.sh &
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties &
KAFKA_PID=$!

1 个答案:

答案 0 :(得分:0)

图像问题

第1步:执行docker-compose build,您将拥有可用于在Kubernetes上部署的kafka图像。但要使Kubernetes能够提取此图像,请将其推送到Docker hub或某个私有docker注册表,以便Kubernetes群集可以从中提取图像。

请注意上述步骤中泊坞窗图像的名称,因为下面的步骤需要这个名称。

此外,如果您将图片推送到docker hub,它将被命名为docker.io/yourUserName/imageName,但如果您推送到其他某个泊坞窗注册表,则其名称将有所不同。

第2步:您必须更改kafka服务中的docker-compose文件,以包含您在上面提供的图片名称。这是kompose中的issue,因为没有给出图像名称,所以它应该出错,并且kompose不能在生成的Kubernetes配置中神奇地给出一些图像名称。

所以把它改成像这样的东西

  kafka:
    build: .
    image: docker.io/username/mykafka:0.1
    ports:
      - "9092:9092"

第3步:添加该图像名称后,您将获得由kompose生成的有效Kubernetes配置以及您提供的图像名称。

现在您可以尝试部署应用程序,Kubernetes将能够很好地提取图像。

如果您在像minikube这样的单个节点群集中执行此操作,则可以按照此blog中的说明进行简单的解决方法。

卷问题

  • 使用Kubernetes时,不建议使用主机坐骑
  • 另外我不确定用Kubernetes安装docker socket的最佳方法是什么。
  • 此外,由于此容器需要docker socket类型的挂载,您需要以特权模式启动它,这是完全不推荐的。
  • 在Kubernetes中共享配置的理想方法不是通过基于主机的卷安装,而是通过名为configMaps的Kubernetes对象