如何构建kafka镜像,然后通过Kompose工具将其部署到kubernetes?
我使用的是docker-compose.yml文件。它使用docker-compose来构建kafka镜像。但是当我们使用Kompose时,它将docker-compose.yml转换为kubernetes服务、pvc和部署,没有预先构建的映像会导致问题。
构建kafka镜像,然后在yml文件中引用它也会导致问题。最后,我无法装载卷。
我如何解决这些问题?谢谢
docker-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下载-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=$!发布于 2017-04-25 14:45:23
图像问题
步骤1:执行docker-compose build,您将拥有一个可用于在Kubernetes上部署的kafka镜像。
记下上面步骤中的docker镜像的名称,因为这是下面的步骤中需要的。
步骤2:您必须更改kafka服务中的docker-compose文件,以包含您在上面给出的图像名称。这是kompose中的一个issue,其中它应该会出错,因为没有给出镜像名称,并且kompose不能在生成的Kubernetes配置中神奇地给出一些镜像名称。
因此,将其更改为如下所示
kafka:
build: .
image: docker.io/username/mykafka:0.1
ports:
- "9092:9092"kompose Step3Kubernetes:添加镜像名称后,您将拥有一个有效的配置,该配置由kompose使用您提供的镜像名称生成。
现在,您可以尝试部署应用程序,Kubernetes将能够很好地提取映像。
如果您在单节点集群(如minikube )中执行此操作,则可以按照本blog中提到的方法进行操作。
卷问题
使用Kubernetes的
configMaps的Kubernetes对象
https://stackoverflow.com/questions/43507497
复制相似问题