J'essaie d'exécuter une application Kafka Streams dans kubernetes. Lorsque je lance le pod, j'obtiens l'exception suivante:
Exception in thread "streams-pipe-e19c2d9a-d403-4944-8d26-0ef27ed5c057-StreamThread-1"
Java.lang.UnsatisfiedLinkError: /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.so:
Error loading shared library ld-linux-x86-64.so.2: No such file or directory
(needed by /tmp/snappy-1.1.4-5cec5405-2ce7-4046-a8bd-922ce96534a0-libsnappyjava.so)
at Java.lang.ClassLoader$NativeLibrary.load(Native Method)
at Java.lang.ClassLoader.loadLibrary0(ClassLoader.Java:1941)
at Java.lang.ClassLoader.loadLibrary(ClassLoader.Java:1824)
at Java.lang.Runtime.load0(Runtime.Java:809)
at Java.lang.System.load(System.Java:1086)
at org.xerial.snappy.SnappyLoader.loadNativeLibrary(SnappyLoader.Java:179)
at org.xerial.snappy.SnappyLoader.loadSnappyApi(SnappyLoader.Java:154)
at org.xerial.snappy.Snappy.<clinit>(Snappy.Java:47)
at org.xerial.snappy.SnappyInputStream.hasNextChunk(SnappyInputStream.Java:435)
at org.xerial.snappy.SnappyInputStream.read(SnappyInputStream.Java:466)
at Java.io.DataInputStream.readByte(DataInputStream.Java:265)
at org.Apache.kafka.common.utils.ByteUtils.readVarint(ByteUtils.Java:168)
at org.Apache.kafka.common.record.DefaultRecord.readFrom(DefaultRecord.Java:292)
at org.Apache.kafka.common.record.DefaultRecordBatch$1.readNext(DefaultRecordBatch.Java:264)
at org.Apache.kafka.common.record.DefaultRecordBatch$RecordIterator.next(DefaultRecordBatch.Java:563)
at org.Apache.kafka.common.record.DefaultRecordBatch$RecordIterator.next(DefaultRecordBatch.Java:532)
at org.Apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.nextFetchedRecord(Fetcher.Java:1060)
at org.Apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.fetchRecords(Fetcher.Java:1095)
at org.Apache.kafka.clients.consumer.internals.Fetcher$PartitionRecords.access$1200(Fetcher.Java:949)
at org.Apache.kafka.clients.consumer.internals.Fetcher.fetchRecords(Fetcher.Java:570)
at org.Apache.kafka.clients.consumer.internals.Fetcher.fetchedRecords(Fetcher.Java:531)
at org.Apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.Java:1146)
at org.Apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.Java:1103)
at org.Apache.kafka.streams.processor.internals.StreamThread.pollRequests(StreamThread.Java:851)
at org.Apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.Java:808)
at org.Apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.Java:774)
at org.Apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.Java:744)
Auparavant, j'ai essayé de lancer kafka et kafka-streams-app en utilisant des conteneurs Docker et ils ont parfaitement fonctionné. C'est la première fois que j'essaie avec Kubernetes.
C'est mon DockerFile StreamsApp:
FROM openjdk:8u151-jdk-Alpine3.7
COPY /target/streams-examples-0.1.jar /streamsApp/
COPY /target/libs /streamsApp/libs
CMD ["Java", "-jar", "/streamsApp/streams-examples-0.1.jar"]
Que puis-je faire pour surmonter ce problème? Veuillez m'aider.
MODIFIER:
/ # ldd /usr/bin/Java
/lib/ld-musl-x86_64.so.1 (0x7f03f279a000)
Error loading shared library libjli.so: No such file or directory (needed by /usr/bin/Java)
libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x7f03f279a000)
Error relocating /usr/bin/Java: JLI_Launch: symbol not found
Le message d'erreur indique que * libsnappyjava.so ne peut pas trouver ld-linux-x86-64.so.2. Il s'agit d'un chargeur dynamique glibc, tandis que l'image Alpine ne fonctionne pas avec la glibc. Vous pouvez essayer de le faire fonctionner en installant le paquet compatible libc6 dans votre Dockerfile, par exemple:
RUN apk update && apk add --no-cache libc6-compat
Dans mon cas, l'installation de la compatibilité libc6 manquante n'a pas fonctionné. L'application lance toujours Java.lang.UnsatisfiedLinkError
.
Ensuite, je trouve dans le docker, /lib64/ld-linux-x86-64.so.2
existe et est un lien vers /lib/libc.musl-x86_64.so.1
, mais /lib
contient uniquement ld-musl-x86_64.so.1
, ne pas ld-linux-x86-64.so.2
.
J'ajoute donc un fichier nommé ld-linux-x86-64.so.2
lié à ld-musl-x86_64.so.1
dans /lib
dir et résoudre le problème.
Dockerfile que j'utilise:
FROM openjdk:8-jre-Alpine
COPY entrypoint.sh /entrypoint.sh
RUN apk update && \
apk add --no-cache libc6-compat && \
ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2 && \
mkdir /app && \
chmod a+x /entrypoint.sh
COPY build/libs/*.jar /app
ENTRYPOINT ["/entrypoint.sh"]
En conclusion:
RUN apk update && apk add --no-cache libc6-compat
ln -s /lib/libc.musl-x86_64.so.1 /lib/ld-linux-x86-64.so.2
Il existe deux solutions à ce problème:
Vous pouvez utiliser une autre image de base avec la librairie snappy-Java
Préinstallée. Par exemple, openjdk:8-jre-slim
Me convient:
Et l'autre solution consiste à toujours utiliser l'image openjdk:8-jdk-Alpine
Comme base, mais à installer la bibliothèque snappy-Java
Manuellement:
FROM openjdk:8-jdk-Alpine
RUN apk update && apk add --no-cache gcompat
...
Cela semble étrange, mais ressemble à l'image de docker que vous utilisez - openjdk: 8u151-jdk-Alpine3.7 est incohérent, et certains objets chargés dynamiquement ne sont pas inclus dans le package, ou vous devez exécuter "ldconfig -v" dans cette image pour mettre à jour la carte des objets partagés, ou, enfin, il y a /etc/ld.so.conf avec les chemins vers les endroits où OS recherche des objets .so. Veuillez envisager d'utiliser une autre image docker fournissant Java binaire si vous ne voulez pas perdre de temps à le déboguer. Enfin et surtout, demandez un remède sur le forum Alpine.