[英]Connect Python app to Redis on Kubernetes cluster
一個內部帶有一個小型 Python 應用程序的 docker 容器被部署到一個 Kubernetes 集群,該集群具有一個redis master
服務器和一個在集群中運行的redis slave
服務。 Docker 容器內的 Python 應用程序無法跨集群連接到redis
,因為 Python 應用程序未正確配置以在網絡上查找redis
。
需要對下面的代碼進行哪些具體的更改,以便app.py
中的 Python 應用能夠與運行在同一集群中的redis
成功通信?
這是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 master
和redis slave
來自公共注冊中心,通過運行kubectl apply -f
和以下 JSON 將其帶入集群:
來自此鏈接的 Redis 主復制控制器 JSON。
來自此鏈接的 Redis Master 服務 JSON。
來自此鏈接的 Redis 從屬復制控制器 JSON。
來自此鏈接的 Redis Slave 服務 JSON。
為了讓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
kubectl get --all-namespaces=true svc | grep redis-master
會提醒你。
如果 redis-master 的服務位於燒瓶應用程序部署或 pod 的同一命名空間中,則使用此 redis-master 作為 env 變量在燒瓶應用程序的部署文件中,如果不是相同的命名空間,則使用 redis-master.whatever-namespace。 svc.cluster.local 但確定在對您的應用進行 dockerizing 時使用 .env 文件
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.