我已从默认图片目录创建了一个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使用另一个值,但我无法确定要使用的内容。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
从映像目录中部署后,将为您创建许多对象。其中一个对象是一个服务,用于将请求加载到其前端的Pod。可以使用客户端工具通过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应用程序安装
答案 1 :(得分:0)
数据库通常不使用标准HTTP,而是使用自定义TCP协议。这就是为什么在Openshift中,我们需要使用Openshift的Service主机名或IP地址直接连接到服务(注意:只有Service主机名是可预测的),而不是通常的Route,这也适用于Redis。在Openshift中绕过路由就像绕过反向代理(如nginx)并直接连接到数据库后端一样。
需要使用env变量,因为服务主机名是Openshift使用可预测的模式自动生成的:
container_name.project_name.svc
,例如:
redis.db.svc