Приложение OpenShift v3 connect с Redis. В соединении отказано

Я создал приложение Redis 3.2 из каталога изображений по умолчанию.

Я пытаюсь подключить приложение Python, которое работает внутри того же проекта с Redis DB.

Вот что приложение Python использует для подключения к Redis:

REDIS_HOST = 'localhost'
REDIS_PORT = 6379
REDIS_PASSWORD = os.environ.get('REDIS_PASSWORD') or 'test'


redis = aioredis.create_redis_pool(
    (REDIS_HOST, int(REDIS_PORT)),
    password=REDIS_PASSWORD,
    minsize=5,
    maxsize=10,
    loop=loop,
)

Развертывание не удается с ConnectionRefusedError: [Errno 111] Connection refused,

Я предполагаю, что мне нужно использовать другое значение для REDIS_HOST, но я не мог понять, что использовать.

Кто-нибудь знает, как это исправить?

1 ответ

Решение

После развертывания из каталога изображений для вас будет создано несколько объектов. Одним из таких объектов является сервис, который используется для загрузки запросов баланса в стручки, с которыми он работает. Имена сервисов для проекта можно получить с помощью клиентских инструментов через oc get svc,

Это имя службы должно использоваться для подключения к вашему экземпляру Redis. Если вы развернете redis перед вашим Python-приложением, некоторые переменные окружения уже должны быть заполнены, например, которые можно использовать REDIS_SERVICE_HOST а также REDIS_SERVICE_PORT,

Таким образом, из вашего приложения вы можете подключиться через IP-адрес службы или имя службы, где имя службы redis затем redis.StrictRedis(host='redis', port=6379, password='secret')

Пароль redis может быть сгенерирован для вас. В этом случае его можно извлечь из секрета redis, который также можно смонтировать из вашего приложения на python

Базы данных обычно используют не стандартный HTTP, а специальные протоколы TCP. Вот почему в Openshift нам нужно напрямую подключаться к службе, используя имя хоста службы Openshift или IP-адрес (осторожно: предсказуемо только имя хоста службы) вместо обычного маршрута, и это относится также к Redis. Обход маршрутов в Openshift похож на обход обратного прокси, такого как nginx, и прямое подключение к бэкэнду db.

Необходимо использовать переменные env, потому что имена хостов служб автоматически генерируются Openshift с использованием этого предсказуемого шаблона:container_name.project_name.svc, например:redis.db.svc

  • Подробнее "Когда веб-приложение становится видимым за пределами кластера OpenShift, создается маршрут. Это позволяет пользователю использовать URL-адрес для доступа к веб-приложению из веб-браузера. Маршрут обычно используется для веб-приложений, которые используют протокол HTTP. протокол. Маршрут не может использоваться для открытия базы данных, поскольку они обычно используют свой собственный протокол, и маршруты не могут работать с протоколом базы данных ". [https://blog.openshift.com/openshift-connecting-database-using-port-forwarding/ ]
Другие вопросы по тегам