Squeak.ru - шаблоны программирования

Openshift 3.X - связь между серверной частью и фронтендом

У меня два образа докеров, один - это веб-сервер, а другой - бэкэнд-приложение Rest. Я развернул эти образы в кластере Openshift. Я хочу настроить свои модули, на которых работает веб-сервер, для доступа к модулям, в которых работает серверное приложение Rest, но я не могу понять, как я могу указать своим интерфейсным модулям, что они должны взаимодействовать с моей серверной службой. . Я могу получить доступ только к IP-адресу модуля, но это не то, что я хочу, поскольку я хочу сохранить преимущество масштабируемости.

Я пытался получить к нему доступ так:

  1. через определенный маршрут: svc-backend.router.default.svc.cluster.local
  2. через его имя службы: svc-backend.environment.svc.cluster.local
  3. через его IP-адрес (внутренний): 172.30.214.192
  4. через главный хост + имя службы: master.svc-backend.environment.svc.cluster.local

К сожалению, ничего не вышло. Может ли кто-нибудь объяснить мне, как общаться в openshift между модулями и сервисами?


Ответы:


1

Лучшее, что вы можете сделать, - это развернуть эти 2 модуля в одном проекте, чтобы вы могли поддерживать внутреннюю коммуникацию:

$ oc new-project test
$ oc new-app registry:5000/frontend-image
$ oc new-app registry:5000/backend-image

Это автоматически создаст конфигурацию развертывания и создаст ваш модуль + контейнер + контроллер репликации (для обеспечения высокой доступности он проверит, работает ли модуль по-прежнему) + службу.

Услуга - важный аспект. Фактически это балансировщик нагрузки, который распределяет трафик между несколькими модулями. oc new-app проверит, какие порты доступны, и создаст службу над портами. Так, например, вы можете увеличить свой интерфейсный модуль до 3, тогда сервис будет распределять посетителя 1 на модуль 1, а другого посетителя на модуль 2 и т. Д. Сервис стабилен, поэтому его IP-адрес не изменится. IP-адрес службы начинается с 172.30.xx.xx. Таким образом, трафик, отправленный на этот IP-адрес, будет перенаправлен на ваши модули. Так что для экономии внутренней сети лучше всего подключать сервисы. Вы можете подключиться к имени службы, которое будет переведено на IP-адрес службы. (Если есть какой-то странный случай, когда вам нужно воссоздать свою службу, вы можете создать ее с тем же именем, чтобы вам не пришлось изменять свои appconfigs).

Например. У меня есть приложение, связанное с базой данных mysql. В конфиге моего приложения я указываю на соединение с host: mysql. Это имя службы моего MySQL.

             connection: {
                 host: 'mysql',
                 user: 'xx-user',
                 password: 'xx',
                 database: 'db',
charset: 'utf8'

Вы можете проверить свою услугу:

$ oc get svc

или в веб-консоли

введите описание изображения здесь

Итак, для вашего приложения вы должны указать имя службы вашего бэкэнда. (Сначала мне нужно запустить базу данных, потому что в противном случае развертывание моего приложения не удастся, потому что оно не найдет базу данных). Итак, вам сначала нужно развернуть свой бэкэнд + создать службу и указать это имя службы в конфигурации вашего внешнего интерфейса.

Иногда у вас не получается сохранить все внутри. Затем вам нужно создать маршруты на своих сервисах. Это откроет доступ к вашему сервису извне, и вы сможете общаться по маршрутам. Затем вы должны указать эти маршруты в своих конфигах. Маршруты будут преобразованы маршрутизатором OpenShift, и маршрутизатор направит их в нужную службу. Поделитесь своим мнением, если что-то неясно.

ИЗМЕНИТЬ 1:

nslookup mysql                                                          
Server:         172.30.0.1                                                      
Address:        172.30.0.1#53                                                   

Name:   mysql.test.svc.cluster.local                                       
Address: 172.30.195.xx   

РЕДАКТИРОВАТЬ 2: запустите mysql в OpenShift (используйте временный шаблон: user = test, password = test, database = test. Войдите в свой контейнер и попробуйте аутентифицироваться следующим образом: вы определите своего пользователя , пароль и хост (host = servicename). Это также будет работать с IP-адресом вашей службы: 172.30.xxx)

sh-4.2$ mysql -utest -ptest -hmysql                                     
Warning: Using a password on the command line interface can be insecure.        
Welcome to the MySQL monitor.  Commands end with ; or \g.                       
Your MySQL connection id is 48880                                               
Server version: 5.6.26 MySQL Community Server (GPL)                             

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.    

Oracle is a registered trademark of Oracle Corporation and/or its               
affiliates. Other names may be trademarks of their respective                   
owners.                                                                         

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  

mysql> 
29.07.2016
  • Привет, большое спасибо за ответ. Я тоже так думал, но когда я пытаюсь из одного модуля получить доступ к другому с именем службы или IP, я всегда получаю ошибку «нет маршрута к хосту»: wget бэкэнд: 8080 --2016-07-29 09: 35: 22 - бэкэнд: 8080 Разрешение бэкэнда (бэкэнд) ... 172.30.148.197 Подключение к бэкэнду (бэкэнд) | 172.30.148.197 |: 8080 ... сбой: нет маршрута к хосту. 29.07.2016
  • О, это так приятно, спасибо большое, что непросто понять все механизмы, это довольно сложный продукт, и я какое-то время застрял на этой проблеме связи :) 29.07.2016
  • что происходит, когда вы пытаетесь пинговать свои службы (так что из внешнего интерфейса пингует внешний интерфейс servicename и пинг бэкэнда servicename: обычно порт icmp закрыт в вашем контейнере, но он должен иметь возможность разрешить ваше servicename в ip: Итак, я пингую mysql - - ›PING mysql.dev-proj.svc.cluster.local (172.30.137.144): 56 байтов данных 92 байта из 10.1.2.1: Destination Host Unreachable (он разрешает мое имя службы mysql в IP-адрес службы) (ping изнутри ваш контейнер конечно) 29.07.2016
  • У меня такое же поведение: PING backend.development.svc.cluster.local (172.30.148.197) 56 (84) байтов данных. От шлюза (10.128.1.1) icmp_seq = 1 Целевой хост недоступен 29.07.2016
  • Я вижу две вещи. Сначала у меня в проекте по умолчанию есть служба Kubernetes, у которой не запущен модуль (не знаю, нормально ли это). Во-вторых, мой интерфейсный сервис просто исчез, у меня теперь работает только под, и у меня был маршрут на этом, но не на бэкэнде. 29.07.2016
  • Это нормально, что кубернетов нет. Это просто услуга. Что ж, это нормально, так что ваш модуль уже может подключиться к службе другого модуля (серверной части), поэтому вы можете использовать имя службы в своих конфигурациях. Вы можете объяснить вторую проблему? Рекомендую создать маршрут на вашем сервисе фронтенда. И в конфигурации вашего внешнего интерфейса вы должны указать имя службы вашего внутреннего интерфейса (который находится в том же проекте). Затем воссоздайте изображение / нажмите и соберите. Обычно услуга не пропадает? 29.07.2016
  • Служба не исчезает, но вы не видите ее непосредственно в своей веб-консоли (чем вы видите маршрут). Выполните это в проекте в вашей оболочке: oc get svc (чем вам нужно увидеть 2 службы) 29.07.2016
  • Чтобы проверить, работает ли он, вы также можете использовать curl вместо использования маршрута (для маршрутизации требуются подстановочные DNS, сопоставленные с IP-адресом узла, на котором работает ваш маршрутизатор). Итак, чтобы проверить без маршрута, вы можете свернуть внутри своего узла-сервера на svc-ip: port (вашего внешнего интерфейса). Тогда вы увидите свой интерфейс и, надеюсь, увидите информацию, предоставленную вашим сервером. (обычно вы связывали фронт и бэкэнд с IP, я полагаю (inconfigs), теперь вам нужно использовать имена сервисов). 29.07.2016
  • Хорошо, спасибо за ответы, я пытаюсь понять, что я могу сделать не так, но это непросто. Теперь я начинаю думать, что у меня проблема с внутренней сетью. Я попытался развернуть автономный образ mysql и получил эту ошибку при создании модуля: не удалось настроить сеть для модуля с помощью сетевых плагинов openshift-ovs-subnet. У вас есть идеи, как я могу проверить, правильно ли настроена моя внутренняя сеть? 02.08.2016
  • Я использую версию openshift ‹1.3.0 (origin). Чем это нормально, эти журналы появляются. Вы всегда можете проверить, все ли в порядке, запустив mysql. и войдите в контейнер на веб-консоли (терминале) и попробуйте войти в свой mysql, используя его имя службы: mysql -uyouruser -pyourpassword -hmysql (имя службы) 02.08.2016
  • Я обновился до 1.3.0, но теперь я получаю неизвестную явную ошибку ... Вероятно, из-за ошибки схемы докеров между версиями 1.9 и 1.10 ... Моя большая проблема в том, что я не могу использовать IP-адреса каких-либо служб, я могу только обмениваться данными между модулями с использованием IP-адреса контейнера. Даже когда я нахожусь внутри модуля службы, я не могу выполнить ping или свернуть IP-адрес службы. Поэтому я все больше и больше думаю, что внутри моей установки openshift есть какие-то проблемы со связью, но я не знаю, как узнать, почему или что не так ... Всегда становилось неудачным: нет маршрута к хосту, как только я использую имя или адрес SVC. 02.08.2016
  • Можете ли вы выполнить nslookup для имени службы в контейнере? Затем вы увидите, используется ли в вашей установке правильный DNS-сервер (это должен быть внутренний DNS-адрес OpenShift). Я отредактировал свой ответ. поэтому я выполнил nslookup внутри моего контейнера mysql вышеупомянутой службы mysql 02.08.2016
  • Хорошо, спасибо, я использую свой DNS, а не тот из openshift: Сервер: 10.1.1.19, адрес: 10.1.1.19 # 53, имя backend.development.svc.cluster.local, адрес: 172.30.193.133. Это проблема, поскольку он все еще может разрешить имя? 03.08.2016
  • Хм, не думайте, когда это разрешится. Однажды у меня тоже был его собственный DNS, но там была проблема. Есть ли что-то подобное в вашем node-config.yaml или master-config.yaml: dnsIP: 10.1.1.19 03.08.2016
  • Но я вижу, вы сказали, что у меня такое же поведение: PING backend.development.svc.cluster.local (172.30.148.197) 56 (84) байтов данных. Из шлюза (10.128.1.1) icmp_seq = 1 Destination Host Unreachable Таким образом, вы можете проверить связь со своей службой (это связано с тем, что ваш порт icmp закрыт, вероятно, хост недоступен), но вы должны иметь возможность общаться с модулем внутри вашей службы . 03.08.2016
  • Собственно моя проблема - это маршрутизация внутри openshift. Я могу разрешить имена служб из модулей в правильные IP-адреса, но я не знаю, как направить свой запрос из сети 10.128.0.0/16 (сеть модулей) в сеть 172.30.0.0/16 (сеть обслуживания). Таким образом, либо у модулей неправильная конфигурация маршрутизатора, либо сам маршрутизатор в openshift не знает других сетей. У вас есть идеи, как отлаживать подобные проблемы или как они должны работать внутри openshift? 03.08.2016
  • для node-config.yaml у меня фактически есть запись dnsIP: 10.1.1.19, а в мастере для dns-config - 0.0.0.0:8053. 03.08.2016
  • Можете ли вы показать логи вашего роутера (+ у вас получилось с примером mysql?) 03.08.2016
  • В примере с mysql, поскольку я обновился до версии 1.3.0, я получил неизвестную ошибку манифеста при попытке загрузить изображение. Вот журнал маршрутизатора: I0803 09: 14: 44.622788 1 router.go: 310] Маршрутизатор перезагружен: - Проверка HAProxy / healthz на порте 1936 ... - Проверка работоспособности порта HAProxy 1936 ok: 0 попыток повторения. I0803 09: 24: 38.727335 1 router.go: 310] Маршрутизатор перезагружен: - Проверка HAProxy / healthz на порту 1936 ... - Проверка работоспособности порта HAProxy 1936 ok: 0 попыток повторения. ... 03.08.2016
  • О, я обнаружил кое-что действительно интересное: в моем проекте по умолчанию у меня развернуто приложение, доступное через is services. в моем проекте разработки есть два недоступных приложения. Когда я получаю конечные точки в проекте по умолчанию, у них есть все адреса конечных точек, но в моем проекте разработки их нет: oc get endpoints NAME ENDPOINTS AGE backend ‹none› 4d frontend ‹none› 4d 03.08.2016
  • Я открою новый вопрос, так как обсуждение получилось слишком беспорядочным. Я действительно доволен вашим ответом, он даже идеален :) Большое спасибо и, к сожалению, я не могу подтвердить ответ, но считаю его решенным. 03.08.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...