Какой IP привязать к сокету python в Kubernetes? - PullRequest
0 голосов
/ 04 мая 2019

Я новичок в kubernetes, и я настраиваю некоторые тестовые среды для экспериментов в minikube. Итак, у меня есть два модуля, на которых запущен Python, подключенных через службу (я убедился, что они выбраны через один и тот же сервис).

Я хочу открыть сокетное соединение между ними. Ip контейнера равен IP, указанному в сервисе. На Pod1 я создаю сокет и подключаюсь к localhost и порту, принадлежащему контейнеру.

Я не уверен, должен ли я на самом деле подключаться к localhost или к названию службы. Затем в другом модуле (Pod2) я подключаюсь к имени службы (если я правильно понимаю, служба должна выставлять IP с именем, соответствующим имени службы).

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

Если я позволю Pod1 создать сокет с IP-адресом в качестве имени службы, я получу «Невозможно назначить запрошенный адрес» при создании сокета.

Так что я думаю, что просто неправильно выбираю IP-адрес.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

A Служба собирает набор модулей под общим именем (также предоставляя DNS-имя для простого поиска из других развертываний в том же кластере).Предполагаемое использование Сервиса состоит не в том, чтобы создать соединение между модулями внутри одной и той же службы, а для предоставления общего имени, которое направляет вызывающего абонента на любой модулей, поддерживающих Сервис.,Подумайте о веб-сервере, который должен масштабироваться при поступлении новых запросов, но вы не хотите постоянно обновлять информацию об IP.Просто найдите DNS и выберите один из IP-адресов, к которым разрешен поиск DNS, для простой случайной балансировки нагрузки.

Кажется, что вы пытаетесь просто общаться между двумя разными модулями по сети.В этом случае ваши модули должны быть автономными, и вам не нужна служба для разрешения их соответствующих IP-адресов для присоединения.

Разверните каждый из ваших модулей, предоставляя поля hostname и subdomain, чтобы обеспечитьправильная DNS-запись в кластере, например, так:

apiVersion: v1
kind: Pod
metadata:
  name: alice
spec:
  hostname: alice
  subdomain: talk
  containers:
  - image: your-image:version
    args: ["alice"]
    name: main
---
apiVersion: v1
kind: Pod
metadata:
  name: bob
spec:
  hostname: bob
  subdomain: talk
  containers:
  - image: your-image:version
    args: ["bob"]
    name: main

Теперь, если вы представляете себе запуск контейнера с аргументом командной строки "alice", как это делает первый Pod, вы можете легко подключиться к

bob.talks.default.svc.cluster.local

, который является полным доменным именем для второго модуля.То же самое и наоборот.Если вы хотите выставить определенные порты, сделайте это в спецификации Pod;прочитайте о портах именования для обеспечения портативности и независимости фактического номера порта при поиске его внутри кластера.

Несколько замечаний:

  • конечно, вам нужно адаптировать image и args для вашей фактической настройки контейнера
  • часть default в FQDN - это ваше пространство имен;все будет иначе, если вы не развернете в пространство имен по умолчанию
  • , поля hostname и subdomain являются необязательными и имеют значения по умолчанию (см. ссылку на источник), но лучше явные, чем неявные

Документы Kubernetes на DNS для модулей: https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pods

0 голосов
/ 04 мая 2019

Если предполагается, что Pod1 и Pod2 - это разные приложения, которые общаются друг с другом, то вы должны создать разные службы для каждого из них.После создания сервисов вы можете легко использовать Kubernetes Service Discovery , чтобы получить IP-адреса и порты ваших сервисов внутри модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...