OpenShift v3 连接应用程序与 redis。连接被拒绝
OpenShift v3 connect app with redis. Connection Refused
我已经从默认图像目录创建了一个 redis 3.2 应用程序。
我正在尝试连接在同一项目中运行的 python 应用程序与 redis 数据库。
这是 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 使用另一个值,但我不知道要使用什么。
有人知道如何解决这个问题吗?
从映像目录部署后,将为您创建许多对象。其中一个对象是服务,用于将请求负载平衡到它前面的 Pods。可以使用客户端工具通过 oc get svc
.
检索项目的服务名称
此服务名称应该用于连接到您的 redis 实例。如果您在 Python 应用程序之前部署 redis,则应该已经填充了一些可以使用的环境变量,例如 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中的Routes就像绕过nginx等反向代理直接连接db后端
需要使用 env 变量,因为 Openshift auto-generated 服务主机名使用这种可预测的模式:
container_name.project_name.svc
,例如:
redis.db.svc
- 更多信息
"When a web application is made visible outside of the OpenShift cluster a route is created. This enables a user to use a URL to access the web application from a web browser. A route is usually used for web applications which use the HTTP protocol. A route cannot be used to expose a database, as they would typically use their own distinct protocol, and routes would not be able to work with the database protocol."
[https://blog.openshift.com/openshift-connecting-database-using-port-forwarding/]
我已经从默认图像目录创建了一个 redis 3.2 应用程序。
我正在尝试连接在同一项目中运行的 python 应用程序与 redis 数据库。
这是 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 使用另一个值,但我不知道要使用什么。
有人知道如何解决这个问题吗?
从映像目录部署后,将为您创建许多对象。其中一个对象是服务,用于将请求负载平衡到它前面的 Pods。可以使用客户端工具通过 oc get svc
.
此服务名称应该用于连接到您的 redis 实例。如果您在 Python 应用程序之前部署 redis,则应该已经填充了一些可以使用的环境变量,例如 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中的Routes就像绕过nginx等反向代理直接连接db后端
需要使用 env 变量,因为 Openshift auto-generated 服务主机名使用这种可预测的模式:
container_name.project_name.svc
,例如:
redis.db.svc
- 更多信息 "When a web application is made visible outside of the OpenShift cluster a route is created. This enables a user to use a URL to access the web application from a web browser. A route is usually used for web applications which use the HTTP protocol. A route cannot be used to expose a database, as they would typically use their own distinct protocol, and routes would not be able to work with the database protocol." [https://blog.openshift.com/openshift-connecting-database-using-port-forwarding/]