Мое решение для этого было использовать IP в качестве идентификатора: обрезать точки и получить уникальный идентификатор, который также доступен за пределами контейнера в других контейнерах.
С услугами вы можете получить доступ к IP-адресу нескольких контейнеров (см моего ответа здесь о том, как это сделать:. what's the best way to let kubenetes pods communicate with each other?
так что вы можете получить их идентификаторы тоже, если вы используете IP-адрес в качестве уникального идентификатора Единственная проблема в том, что идентификаторы не являются непрерывными или начинаются с 0, но Zookeeper/Кафка не возражал
EDIT 1:.
следования проблем настройки Zookeeper:
Каждый узел ZK должен знать другие узлы. Служба обнаружения Кубернетов известна узлами, которые находятся в службе , поэтому идея состоит в том, чтобы начать службу с с узлами ZK.
Эта служба должна быть запущена ПЕРЕД созданием ReplicationController (RC) модулей Zookeeper.
Сценарий запуска контейнера ZK будет необходимо:
- ожидания для службы обнаружения, чтобы заселить ZK службы с ее узлами (что занимает всего несколько секунд, пока я просто добавить спать 10 в начале моего сценария запуска, но более надежно, вы должны искать, чтобы в нем было как минимум 3 узла.)
- искать контейнеры, формирующие Сервис в службе обнаружения: это делается путем запроса API. переменная среды
KUBERNETES_SERVICE_HOST
доступна в каждом контейнере. Конечная точка, чтобы найти описание сервиса является то
URL="http(s)://$USERNAME:[email protected]${KUBERNETES_SERVICE_HOST/api/v1/namespaces/${NAMESPACE}/endpoints/${SERVICE_NAME}"
где NAMESPACE
является default
, если вы не изменили его, и SERVICE_NAME
будет, если вы зоопарка назвали ваш сервис зоопарка.
там вы получите описание контейнеров, образующих Сервис, с их ip в поле «ip». Вы можете сделать:
curl -s $URL | grep '\"ip\"' | awk '{print $2}' | awk -F\" '{print $2}'
, чтобы получить список IP-адресов в службе. При том, что заполнение zoo.cfg на узле, используя идентификатор, определенный выше
Вы, возможно, потребуется USERNAME и ПАРОЛЬ достичь конечной точки на услуги, такие как Google контейнерной двигателя. Они должны быть помещены в Тайне объема (см документа здесь: http://kubernetes.io/v1.0/docs/user-guide/secrets.html)
Вы также должны использовать curl -s --insecure
на Google Container Engine, если вы идете через трудность добавления сертификата CA к вашим стручкам
В основном добавьте том в контейнер и найдите значения из файла. (Вопреки тому, что док говорит, НЕ положить \ п в конце имени пользователя и пароля при кодировании base64: это просто сделать вашу жизнь более сложной при чтении тех)
EDIT 2:
Еще одна вещь, которую вам нужно сделать на узлах Kafka, - получить IP и имена хостов и поместить их в файл/etc/hosts. Кафка, кажется, нужно знать узлы от имен хостов, и они не установлены в сервисных узлах по умолчанию
EDIT 3:
После долгих проб и мысль, используя IP-адрес в качестве идентификатора не могут быть настолько велики, : это зависит от того, как вы настраиваете хранилище. для любого вида распределенного сервиса, такого как zookeeper, kafka, mongo, hdfs, вы можете использовать тип хранилища emptyDir, поэтому он находится именно на этом узле (монтируя удаленный тип хранилища, он поражает цель распространения этих сервисов!) emptyDir будет relaod с данными на одном и том же узле, поэтому представляется логичным использовать идентификатор NODE (IP-адрес узла) в качестве идентификатора, потому что тогда модуль, который перезагружается на том же узле, будет иметь данные. Это предотвращает потенциальное повреждение данных (если новый узел начинает писать в том же каталоге, который на самом деле не пуст, кто знает, что может произойти), а также с Kafka, тем, которым назначается broker.id, если изменяется идентификатор брокера , zookeeper не обновляет тему broker.id, и тема выглядит так, как будто она доступна. НО указывает на неправильный broker.id, и это беспорядок.
До сих пор я еще не нашел, как получить IP-адрес узла, но я думаю, что это можно искать в API, просматривая имена сервисных имен, а затем узел, на котором они развернуты.
EDIT 4
Чтобы получить IP-адрес узла, вы можете получить имя хоста стручок == имя из конечных точек API /API/v1/пространств имен/по умолчанию/оконечных/ , как объяснено выше. , то вы можете получить IP-адрес узла от имени стручка с /API/v1/пространства имен/по умолчанию/стручков/
PS: это вдохновляет пример в репо Kubernetes (например, для rethinkdb здесь: https://github.com/kubernetes/kubernetes/tree/master/examples/rethinkdb
Хорошая идея! Это похоже на приемлемое решение! Мне удалось передать все мои идентификаторы брокеров, выполнив скрипт запуска: BROKER_ID = $ (ip addr | awk '/ inet/&& /eth0/{sub(/\/.*$/,"",$2); print $ 2} '| sed -r' s /\ .// g ') и: sed -r -i "s/(broker.id) = (. *)/\ 1 = $ BROKER_ID/g" $ KAFKA_HOME/config/server.properties – NegatioN
Я использовал ip = $ (hostname -i) Тогда id = $ {ip //./} – MrE
Могу ли я также спросить, как добавить серверы в /conf/zoo.cfg? Общий том, который взаимодействует с Kafka-Service Kubernetes? – NegatioN