Приложение 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/ ]