OpenShift v3使用redis连接应用程序。拒绝连接

时间:2018-01-11 01:38:29

标签: redis openshift openshift-3

我已从默认图片目录创建了一个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使用另一个值,但我无法确定要使用的内容。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

从映像目录中部署后,将为您创建许多对象。其中一个对象是一个服务,用于将请求加载到其前端的Pod。可以使用客户端工具通过oc get svc检索项目的服务名称。

此服务名称应用于连接到您的redis实例。如果在Python应用程序之前部署redis,则应该已经填充了一些可以使用的环境变量,例如REDIS_SERVICE_HOSTREDIS_SERVICE_PORT

因此,从您的应用程序,您可以通过服务IP或服务名称进行连接,其中服务名称为redis,然后redis.StrictRedis(host='redis', port=6379, password='secret')

可能已为您生成了redis密码。在这种情况下,它可以从redis秘密中检索,也可以从你的python应用程序安装

答案 1 :(得分:0)

数据库通常不使用标准HTTP,而是使用自定义TCP协议。这就是为什么在Openshift中,我们需要使用Openshift的Service主机名或IP地址直接连接到服务(注意:只有Service主机名是可预测的),而不是通常的Route,这也适用于Redis。在Openshift中绕过路由就像绕过反向代理(如nginx)并直接连接到数据库后端一样。

需要使用env变量,因为服务主机名是Openshift使用可预测的模式自动生成的: container_name.project_name.svc,例如: redis.db.svc

  • 更多信息 “当使Web应用程序在OpenShift群集之外可见时,将创建一条路由。这使用户可以使用URL从Web浏览器访问该Web应用程序。路由通常用于使用HTTP协议的Web应用程序。路由不能用于公开数据库,因为它们通常会使用自己的独特协议,并且路由将无法使用数据库协议。” [https://blog.openshift.com/openshift-connecting-database-using-port-forwarding/]