kafka图像构buildkompose

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

我正在使用这个docker-compose.yml文件。 它与docker构成合作build立一个卡夫卡形象。 但是,当我们使用Kompose将docker-compose.yml转换为kubernetes服务,pvc和部署时,没有预构build的映像会导致问题。

构buildkafka图像,然后在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步 :执行docker-compose build ,您将拥有一个可用于在Kubernetes上部署的kafka映像。 但是为了让Kubernetes能够把这个镜像推到Docker Hub或者一些私人docker注册中心,从而让你的Kubernetes集群可以把图像拖拽出来。

请注意上述步骤中的docker镜像的名称,因为在下面的步骤中需要这样做。

另外,如果您将图片推送到docker集线器 ,它将被命名为docker.io/yourUserName/imageName但如果您推送到其他dockerregistry,它将被命名为不同。

步骤2 :您必须更改kafka服务中的kafka -compose文件,以包含上面给出的图像名称。 这是kompose中的一个问题 ,它应该出错,因为没有给出图像名称,并且kompose不能在生成的Kubernetesconfiguration中神奇地给出一些图像名称。

所以把它改成这样

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

第3步 :一旦你添加该图像名称,你将有一个有效的Kubernetesconfiguration由kompose与您提供的图像名称生成。

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

如果您正在像minikube这样的单个节点集群中执行此操作,则可以使用此博客中提到的简单解决方法。

卷问题

  • 与Kubernetes不build议做主机坐骑
  • 另外我不确定用Kubernetes安装Dockersockets的最佳方式是什么。
  • 另外,因为这个容器需要docker sockettypes,所以你需要在特权模式下启动它,这是不推荐的。
  • 在Kubernetes中共享configuration的理想方法不是通过基于主机的卷挂载,而是通过称为configMaps Kubernetes对象