一个带有一个小Python应用程序的坞容器被部署到一个Kubernetes集群中,该集群中运行着一个redis master和一个redis slave服务。Docker容器中的Python无法通过集群连接到redis,因为Python的配置不正确,无法在网络上找到redis。
为了使app.py中的Python能够成功地与运行在同一个集群中的redis通信,需要对下面的代码进行哪些特定的更改?
PYTHON应用程序代码
这是app.py
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
REDIS服务在相同的KUBERNETES集群中
集群中运行的redis master和redis slave来自公共注册中心,通过使用以下JSON运行kubectl apply -f进入集群:
这个链接上的JSON。主复制控制器
红宝石主服务这个链接上的JSON。
Redis从复制控制器这个链接上的JSON。
红系从服务这个链接上的JSON。
发布于 2018-07-15 07:21:09
为了使app.py中的python应用程序能够成功地与运行在同一个集群中的redis通信,需要对下面的代码进行哪些特定的更改?
redis = Redis(host="redis-master", db=0, socket_connect_timeout=2, socket_timeout=2)因为您安装的Service名为redis-master,尽管我前面提出的简单更改假设烧瓶应用程序运行在与redis-master Service相同的kubernetes名称空间中。如果这不是真的,则需要将其切换为:
redis = Redis(host="redis-master.whatever-namespace.svc.cluster.local",并将whatever-namespace替换为实际的、正确的命名空间。如果你不记得或不知道,kubectl get --all-namespaces=true svc | grep redis-master会提醒你。
发布于 2022-05-30 17:17:07
如果redis-master的服务位于烧瓶应用程序部署或pod的相同名称空间中,则在您的烧瓶应用程序的部署文件中使用这个redis-master作为env变量,如果不是相同的名称空间,则使用redis-master.whatever-namespace.svc.cluster.local,但在修改应用程序时肯定使用.env文件。
https://stackoverflow.com/questions/51331730
复制相似问题