Получение информации NTP хоста из образа Docker (Java)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Получение информации NTP хоста из образа Docker (Java)

Сообщение Anonymous »

У меня есть Java-приложение в Docker-контейнере (Iron Alpine), работающее на хосте Oracle Linux 8. Приложению-службе необходимо создать сообщение с текущим временем, исходным адресом NTP и последним обновлением NTP. На хосте настроена и синхронизирована Chrony. Время в контейнере Docker синхронизируется с хостом.
Однако мы не можем запросить информацию об источнике/последнем обновлении NTP из приложения Java в контейнере Docker.
p>
Примечание: я понимаю, что это противоречит смыслу контейнеризации, и если бы я мог запустить это локально на машине, я бы это сделал. Однако я застрял в Docker и был бы рад любому решению. Этому времени потребуется всего около 3 месяцев, пока мы не запустим нашу версию Kubernetes.
Код, который у нас есть для запроса, очень похож на NTPTimesource.java, в частности, строки 108-114:

Код: Выделить всё

NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(DEFAULT_NTP_TIMEOUT_MS);// Timeout if a response takes longer than 10 seconds
client.open();
InetAddress address = InetAddress.getByName(ntpServer);
TimeInfo info = client.getTime(address);
info.computeDetails();
Основная проблема заключается в том, что client.getTime(address) зависнет, если ntpServer является IP-адресом хоста Docker (в нашем случае 172.18.0.1 ) или самого контейнера (

Код: Выделить всё

172.18.0.9
).

Код: Выделить всё

java.net.SocketTimeoutException: Receive timed out
image-1 | at java.base/sun.nio.ch.DatagramChannelImpl.trustedBlockingReceive(DatagramChannelImpl.java:703)
image-1 | at java.base/sun.nio.ch.DatagramChannelImpl.blockingReceive(DatagramChannelImpl.java:633)
image-1 | at java.base/sun.nio.ch.DatagramSocketAdaptor.receive(DatagramSocketAdaptor.java:240)
image-1 | at java.base/java.net.DatagramSocket.receive(DatagramSocket.java:700)
image-1 | at org.apache.commons.net.ntp.NTPUDPClient.getTime(NTPUDPClient.java:89)
image-1 | at org.apache.commons.net.ntp.NTPUDPClient.getTime(NTPUDPClient.java:49)
Очевидно, что адрес не отвечает, и я ожидаю, что это связано с тем, что по этому адресу ничего не настроено для ответа.
Если мы знаем ntpServer и вводим его напрямую, то зависание исчезает и вся система работает нормально (кроме адресов 172.18.0.*). Однако мы не гарантируем, что знаем, какой NTP-сервер является авторитетным для хоста в данный момент времени, что снижает гибкость решения.
Ранее при работе на CentOS7 это работало . В системе CentOS7 мы использовали ntpd, которого нет в Oracle Linux 8. Проблема возникает независимо от того, применяется ли selinux.
У меня заканчиваются идеи (и результаты поиска Google), потому что я почти уверен, что то, что я делаю, просто неправильно.
  • Должен ли контейнер запрашивать информацию NTP хоста через NTPUDPClient()?
  • Существуют ли способы передачи информации NTP в контейнер и обеспечения регулярных обновлений? Я мог бы записывать в файл и читать его с определенной частотой, но возникает проблема рассинхронизации с миром.
  • Есть мысли, почему это работает с ntpd, а не с chrony?
Спасибо!
Обновление Я остановился на всей ситуации с Docker. и вернулся к чертежной доске. Просто используя сценарий Python на самом хосте, я не могу выполнить запрос NTP на локальном хосте (127.0.0.1) с помощью chrony, даже как root и с отключенным брандмауэром. Пока я не смогу выполнить запрос NTP локально и убедиться, что Chrony настроен правильно, я не буду беспокоиться о настройке Docker.

Подробнее здесь: https://stackoverflow.com/questions/793 ... image-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»