#scala #docker #apache-kafka #confluent-platform
#scala #docker #apache-kafka #confluent-платформа
Вопрос:
Я настроил тему Kafka в Confluent cloud (https://confluent.cloud /) и может подключаться / отправлять сообщения к теме, используя приведенную ниже конфигурацию:
kafka-config.properties:
# Kafka
ssl.endpoint.identification.algorithm=
bootstrap.servers=pkc-4yyd6.us-east1.gcp.confluent.cloud:9092
security.protocol=SASL_SSL
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="uname" password="pwd";
sasl.mechanism=PLAIN
Подключаясь из контейнера docker, я получаю:
Failed to produce: org.apache.kafka.common.errors.SslAuthenticationException: SSL handshake failed
Поиск в приведенной выше ошибке предполагает ssl.endpoint.identification.алгоритм = должен исправить
Вот мой файл Dockerfile:
FROM ysihaoy/scala-play:2.12.2-2.6.0-sbt-0.13.15
COPY ["build.sbt", "/tmp/build/"]
COPY ["project/plugins.sbt", "project/build.properties", "/tmp/build/project/"]
COPY . /root/app/
WORKDIR /root/app
CMD ["sbt" , "run"]
Я создаю и запускаю контейнер с помощью:
docker build -t kafkatest .
docker run -it kafkatest
Требуется ли дополнительная конфигурация для подключения к Confluent Kafka?
Я не получаю эту проблему при локальной сборке (не используя Docker).
Обновить:
Вот Scala src, который я использую для создания свойств:
def buildProperties(): Properties = {
val kafkaPropertiesFile = Source.fromResource("kafka-config.properties")
val properties: Properties = new Properties
properties.load(kafkaPropertiesFile.bufferedReader())
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.connect.json.JsonSerializer")
properties
}
Обновление 2:
def buildProperties(): Properties = {
val kafkaPropertiesFile = Source.fromResource("kafka-config.properties")
val properties: Properties = new Properties
properties.load(kafkaPropertiesFile.bufferedReader())
println("bootstrap.servers:" properties.get("bootstrap.servers"))
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer")
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.connect.json.JsonSerializer")
properties
}
Свойство bootstrap.servers
найдено, поэтому файл добавляется в контейнер.
Обновление3 :
sasl.jaas.config:org.apache.kafka.common.security.plain.PlainLoginModule required username="Q763KBPRI" password="bFehkfL/J6m8L2aukX A/L59LAYb/bWr"
Обновление4:
docker run -it kafkatest --network host
возвращает ошибку:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: "--network": executable file not found in $PATH": unknown.
Комментарии:
1. Не могли бы вы поделиться кодом, который вы используете для подключения к Kafka, пожалуйста
2. @RobinMoffatt пожалуйста, посмотрите Обновление вопроса
3. Вы копируете kafka-config.properties в docker image? Чтобы убедиться, что вы используете правильные свойства, можете ли вы выйти из системы в конце
buildProperties
функции?4. @amorfis файл добавлен в образ docker — пожалуйста, смотрите Обновление.
5. ОК, круто, они выглядели слишком убедительно: D
Ответ №1:
Использование другого базового образа решило проблему, но я не уверен, какая разница вызывает разрешение. Вот мой обновленный файл Dockerfile:
ARG OPENJDK_TAG=8u232
FROM openjdk:${OPENJDK_TAG}
ARG SBT_VERSION=1.4.1
# Install sbt
RUN
mkdir /working/ amp;amp;
cd /working/ amp;amp;
curl -L -o sbt-$SBT_VERSION.deb https://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb amp;amp;
dpkg -i sbt-$SBT_VERSION.deb amp;amp;
rm sbt-$SBT_VERSION.deb amp;amp;
apt-get update amp;amp;
apt-get install sbt amp;amp;
cd amp;amp;
rm -r /working/ amp;amp;
sbt sbtVersion
COPY ["build.sbt", "/tmp/build/"]
COPY ["project/plugins.sbt", "project/build.properties", "/tmp/build/project/"]
COPY . /root/app/
WORKDIR /root/app
CMD ["sbt" , "run"]