Инструкция по решению проблемы невозможности доступа к контейнеру облачного сервера Kafka из внешней сети
Инструкция по решению проблемы невозможности доступа к контейнеру облачного сервера Kafka из внешней сети

Предисловие

В предыдущей статьеПопрощайтесь с Zookeeper, используйте две команды для контейнеризации KafkaСледуйте официальной документацииdocker,На облачном сервере построен одноузловой кластер Kafka.,Успешно подключено к облачному серверу,Когда я пытаюсь подключиться с помощью Spark на своем ноутбуке,Невозможно использовать данные.

Как вы можете видеть на картинке выше, я нахожусь в потребительском сегменте. configЧжунминминминцзянbootstrap.serversНастройка как гибкая общедоступная сетьIP,А также можно подключиться к сети Kafka через Telnet на ноутбуке.

Но когда я запустил программу Spark, программа должна была вывести данные, потребляемые из какфы, но программа зависла.

Как видно из последней строки лога, соединение здесь на самом деле локальное, что определенно означает, что данные не могут быть использованы. Но я явно использовал в программе эластичный публичный IP, но почему здесь он стал локальным...

Анализ проблемы

Столкнувшись с проблемой такого рода, я сначала проверил проблему на сервере Kafka, поэтому пошел проверить конфигурацию Kafka в контейнере, чтобы увидеть, какой вариант конфигурации использует localhost, а затем исправил проблему.

проходитьdocker execКоманда вводитkafkaконтейнер,Затем начните поиск server.properties в разных каталогах.,Файл конфигурации был найден в каталоге /etc/kafk/docker.

Grep localhost обнаружил всего два параметра. Я зашел на официальный сайт, чтобы найти инструкции по настройке, и обнаружил, что вторая конфигурация была «виновником», вызвавшим эту проблему.

advertised.listeners

Сначала просмотрите описание опции Advertised.listeners.

Затем купите один и получите другой бесплатно, и эффект обучения для слушателей будет лучше.

listenersиadvertised.listenersОбщий смысл таков.,прослушиватели — это адреса, используемые сервером Kafka для прослушивания клиентских подключений.,Включает соединения между внешними клиентами и другими серверами Kafka.,Адрес, используемый для взаимодействия данных между клиентом и Kafka.

А Advertised.listeners — это адрес, транслируемый Kafka клиенту. Если сервер Kafka находится во внутренней сети, а клиент — во внешней сети, адрес в Advertised.listeners необходимо настроить как адрес, доступный извне.

Таким образом, когда клиент подключается, он сначала ищет адрес, транслируемый рекламодателями.listeners в Zookeeper или KRaft, а затем сопоставляет адрес, настроенный в прослушивателях для подключения к Kafka для чтения данных.

Обычный способ записи слушателей следующий:

Язык кода:shell
копировать
PLAINTEXT://:9092
PLAINTEXT://0.0.0.0:9092
PLAINTEXT://ip:9092

Кажется, нет никакой разницы между первыми двумя способами записи. Оба они отслеживают все адреса, включая эластичные общедоступные IP-адреса. Третий способ записи — мониторинг фиксированных адресов. В конфигурации докер-контейнера по умолчанию стоит первый способ записи, поэтому менять его нет необходимости. Нам нужно только изменить локальный хост в dvertized.listeners на эластичный общедоступный IP-адрес.

решение

Я использую vi для редактирования server.properties, и при сохранении он предлагает readOnly. Убедитесь, что нет прав доступа к файлам. Chmod не удалось изменить разрешения. Поскольку вы не являетесь пользователем root, вы используете su и sudo для получения прав root. Этих двух команд нет.

Мы можем найти только другой путь,Разве вы не установили клиент Kafka на хост-компьютер раньше?,Мы можем изменить файл конфигурации в клиенте,Затем поместите его в каталог с файлом конфигурации.,Не лучше ли его заменить? Если нет клиента,Воляkafkaконтейнер Конфигурационные файлы вdocker cpВы также можете выйти и внести изменения.。

Друзья, знакомые с докером, знают, что у нас есть два способа замены файла конфигурации в контейнере.

  1. Замена в образе: перепишите Dockerfile и завершите замену в процессе создания нового образа с использованием исходного образа.
  2. Замена в контейнере: скопируйте измененный файл конфигурации непосредственно в контейнер Kafka.

Заменить конфигурацию образа

Замена внутри образа производится раз и навсегда, поскольку мы можем использовать этот образ много раз для создания контейнера Kafka, поэтому после этой модификации вы можете напрямую использовать этот образ на этом облачном сервере для создания контейнера Kafka, доступного из внешней сети.

Создайте новый Dockerfile:

Язык кода:shell
копировать
FROM apache/kafka:3.7.0
COPY server.properties /etc/kafka/docker

В Dockerfile всего две команды.,Скопируйте файл конфигурации в исходный образ Kafka.,Другие команды,НапримерCMDнаследоватьПросто исходное изображение。а затем выполнитьdocker buildЗаказ,на основеDockerFileСоздайте файл с именемapache/kakfa_kraft:3.7.0зеркало。

Напоминаем, что файл server.properties и файл Dockerfile должны находиться в одном каталоге, иначе будет сообщено об ошибке.

После создания образа мы используем его для запуска контейнера с именем kafka1.

Контейнер запускается нормально и может нормально подключаться.

Заменить конфигурацию контейнера

Второй метод относительно прост. Изначально мы запустили контейнер Kafka, используя официальный образ. Выполнение следующей команды может перезаписать исходный файл конфигурации.

Язык кода:shell
копировать
docker cp server.properties kafka:/etc/kafka/docker/

После завершения замены перезапустите контейнер Kafka.

Проверка результата

Тестовый код искры выглядит следующим образом:

Язык кода:scala
копировать
object Monitor {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("aqi").setMaster("local[1]")
    val ssc = new StreamingContext(conf, Seconds(10))
    val kafkaParams = Map[String, Object](
      "bootstrap.servers" -> "121.91.xx.xx:9092",
      "key.deserializer" -> classOf[StringDeserializer],
      "value.deserializer" -> classOf[StringDeserializer],
      "group.id" -> "aqi",
      "auto.offset.reset" -> "earliest",
      "enable.auto.commit" -> (false: java.lang.Boolean)
    )

    val topics = Array("aqi_test")
    val stream: DStream[String] = KafkaUtils.createDirectStream[String, String](
      ssc,
      PreferConsistent,
      Subscribe[String, String](topics, kafkaParams)
    ).map(_.value)
    stream.foreachRDD(rdd => {
      rdd.foreach(x => {
        println(x)
      })
    })
    ssc.start
    ssc.awaitTermination
  }
}

Для одной и той же программы после изменения конфигурации с использованием двух вышеуказанных методов программа запуска может использовать данные.

Другие попытки

На первом этапе контейнера, после того как не было разрешения на изменение файла конфигурации, я попытался добавить некоторые параметры при создании контейнера Kafka.

Судя по логам, нет никаких сомнений в том, что все они потерпели неудачу, поэтому два моих метода выше проще.

Заключение

Это повторение и решение проблемы невозможности доступа к внешней сети при развертывании Kafka на моем облачном сервере. Вся статья не очень техническая и в основном посвящена использованию некоторых основных команд докера.

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024, приходите и разделите со мной приз!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose