我们如何构建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=$!
答案 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中的说明进行简单的解决方法。
configMaps
的Kubernetes对象