如何从Kubernetes集群中的应用程序连接Redis集群?
这是我的申请代码:如何从Kubernetes集群中的应用程序连接Redis集群?,redis,kubernetes,cluster-computing,minikube,kubernetes-helm,Redis,Kubernetes,Cluster Computing,Minikube,Kubernetes Helm,这是我的申请代码: from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host=os.getenv("REDIS", "redis"), db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/"
from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host=os.getenv("REDIS", "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主机,请将环境值设置为:
env:
- name: REDIS
value: {{ template "fullname" . }}-master-svc
关于Redis群集,由官方图表安装。其主服务清单文件为:
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}-master-svc
annotations:
{{ toYaml .Values.servers.annotations | indent 4 }}
spec:
ports:
- port: 6379
protocol: TCP
targetPort: 6379
selector:
app: "redis-ha"
redis-node: "true"
redis-role: "master"
release: "{{ .Release.Name }}"
type: "{{ .Values.servers.serviceType }}"
但应用程序pod似乎没有成功连接到Redis主服务名称。当我被访问URL时:
export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services wishful-rabbit-mychart)
export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
从浏览器中,获得以下结果:
Hello World!
Hostname: wishful-rabbit-mychart-85dc7658c6-9blg5
Visits: cannot connect to Redis, counter disabled
有关pods
和服务的更多信息
:
kubectl get po
NAME READY STATUS RESTARTS AGE
wishful-rabbit-mychart-bdfdf6558-8fjmb 1/1 Running 0 8m
wishful-rabbit-mychart-bdfdf6558-9khfs 1/1 Running 0 7m
wishful-rabbit-mychart-bdfdf6558-hgqxv 1/1 Running 0 8m
wishful-rabbit-mychart-sentinel-8667dd57d4-9njwq 1/1 Running 0 37m
wishful-rabbit-mychart-sentinel-8667dd57d4-jsq6d 1/1 Running 0 37m
wishful-rabbit-mychart-sentinel-8667dd57d4-ndqss 1/1 Running 0 37m
wishful-rabbit-mychart-server-746f47dfdd-2fn4s 1/1 Running 0 37m
wishful-rabbit-mychart-server-746f47dfdd-bwgrq 1/1 Running 0 37m
wishful-rabbit-mychart-server-746f47dfdd-spkkm 1/1 Running 0 37m
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h
wishful-rabbit-mychart NodePort 10.101.103.224 <none> 80:30033/TCP 37m
wishful-rabbit-mychart-master-svc ClusterIP 10.108.128.167 <none> 6379/TCP 37m
wishful-rabbit-mychart-sentinel ClusterIP 10.107.63.208 <none> 26379/TCP 37m
wishful-rabbit-mychart-slave-svc ClusterIP 10.99.211.111 <none> 6379/TCP 37m
应用程序环境 所有端点
kubectl获得ep
姓名端点年龄
库伯内特斯10.0.2.15:8443 4h
如意兔mychart 172.17.0.5:80172.17.0.6:80172.17.0.7:80 1h
如意兔mychart master svc 1h
如意兔mychart哨兵172.17.0.11:26379172.17.0.12:26379172.17.0.8:26379 1h
一厢情愿的兔子mychart从属svc
描述Redis主服务
kubectl描述svc如意兔mychart主svc
名称:如意兔mychart master svc
名称空间:默认值
标签:
注释:
选择器:app=redis-ha,redis-node=true,redis-role=master,release=wish-rabbit
类型:集群
IP:10.108.128.167
端口:6379/TCP
目标端口:6379/TCP
端点:
会话关联:无
活动:
描述Redis服务器吊舱
kubectl描述po wishant-rabbit-mychart-server-746f47dfdd-2fn4s
名称:如意兔mychart-server-746f47dfdd-2fn4s
名称空间:默认值
节点:minikube/192.168.99.100
开始时间:2018年2月2日星期五15:28:42+0900
标签:app=mychart
chart=mychart-0.1.0
遗产=耕耘者
name=redis服务器
pod模板哈希=3029038988
podIP=172.17.0.10
redis node=true
redis角色=主机
释放=一厢情愿的兔子
runID=cbf8e0
注释:kubernetes.io/创建人={“种类”:“SerializedReference”,“apiVersion”:“v1”,“reference”:{“种类”:“ReplicaSet”,“命名空间”:“默认”,“名称”:“Wishant-rabbit-mychart-server-746f47dfdd”,“uid”:“4fcb0dfc-07e2-1…”。。。
状态:正在运行
IP:172.17.0.10
控制人:ReplicaSet/Wishant-rabbit-mychart-server-746f47dfdd
容器:
redis:
容器ID:docker://2734d60bd44a1446ec6556369359ed15b866a4589abe1e6d394f9252114c6d4d
图片:quay.io/smile/redis:4.0.6r2
图像ID:docker-pullable://quay.io/smile/redis@sha256:8948A952920D449559C984546838D4C9B4C71E0036EEF86570922D91CACB3DF
端口:6379/TCP
状态:正在运行
开始时间:2018年2月2日星期五15:28:44+0900
准备好了吗
重新启动计数:0
环境:
REDIS_SENTINEL_服务_主机:REDIS SENTINEL
REDIS_图表前缀:如意兔mychart-
挂载:
/来自数据的redis主数据(rw)
/来自default-token-wfv2q(ro)的var/run/secrets/kubernetes.io/serviceCount
条件:
类型状态
初始化为True
准备好了吗
播客预定为真
卷数:
数据:
类型:EmptyDir(共享pod生存期的临时目录)
中等:
default-token-wfv2q:
类型:Secret(由Secret填充的卷)
SecretName:default-token-wfv2q
可选:false
QoS等级:最佳努力
节点选择器:
容忍:
活动:
您的如意兔mychart主svc
服务的选择器
和您的主redis吊舱的标签
之间存在差异
您的服务正在搜索具有以下标签的播客:
app=redis-ha
redis-node=true
redis-role=master
release=wishful-rabbit
app=mychart
chart=mychart-0.1.0
heritage=Tiller
name=redis-server
pod-template-hash=3029038988
podIP=172.17.0.10
redis-node=true
redis-role=master
release=wishful-rabbit
runID=cbf8e0
而您的吊舱具有以下标签:
app=redis-ha
redis-node=true
redis-role=master
release=wishful-rabbit
app=mychart
chart=mychart-0.1.0
heritage=Tiller
name=redis-server
pod-template-hash=3029038988
podIP=172.17.0.10
redis-node=true
redis-role=master
release=wishful-rabbit
runID=cbf8e0
正如您所看到的,app
标签是不同的(redis ha
在您的服务中,mychart
在您的pod中)
这会导致服务无限(它不知道将传入流量转发到哪里)
虽然我不知道这个配置错误的实际原因,但我可以建议一个解决方案使它工作
您必须编辑redis服务并更改其选择器属性,以匹配pod的标签。只需运行:
kubectl edit svc wishful-rabbit-mychart-master-svc
并将应用程序:“redis ha”
更改为应用程序:“mychart”
您的应用程序应该突然能够到达您的redis实例
Kubernetes服务是一种抽象,它定义了一组逻辑的POD。服务所针对的POD集(通常)由标签选择器确定
因此,在选择器的帮助下,POD可以被服务锁定
服务的选择器将持续评估,结果将发布到Endpoints对象
如果您提供的选择器未找到Pod,则不会创建有效端点
在这种情况下,若您使用此服务访问Pod,这将不起作用,因为DNS不会从端点获取任何IP地址
要了解更多信息,您共享了清单文件模板,而不是实际的清单文件。为了帮助您解决问题,这些模板不是很有用。我建议您使用
kubectl exec
进入应用程序pod,检查REDIS env var的实际值,然后尝试从中连接以了解一点mor我想问题的关键是如何从环境变量连接redis ha
集群。我已经检查了redis Master
pod环境变量。获得了hostname=wiswishat-rabbit-mychart-server-746f47dfdd-2fn4s
的主机名。无法使用它,因为746f47dfdd>的-2fn4s是动态变化的。REDIS\u SENTINEL\u服务\u主机=REDIS SENTINELkubectl describe po wishful-rabbit-mychart-server-746f47dfdd-2fn4s
Name: wishful-rabbit-mychart-server-746f47dfdd-2fn4s
Namespace: default
Node: minikube/192.168.99.100
Start Time: Fri, 02 Feb 2018 15:28:42 +0900
Labels: app=mychart
chart=mychart-0.1.0
heritage=Tiller
name=redis-server
pod-template-hash=3029038988
podIP=172.17.0.10
redis-node=true
redis-role=master
release=wishful-rabbit
runID=cbf8e0
Annotations: kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"wishful-rabbit-mychart-server-746f47dfdd","uid":"4fcb0dfc-07e2-1...
Status: Running
IP: 172.17.0.10
Controlled By: ReplicaSet/wishful-rabbit-mychart-server-746f47dfdd
Containers:
redis:
Container ID: docker://2734d60bd44a1446ec6556369359ed15b866a4589abe1e6d394f9252114c6d4d
Image: quay.io/smile/redis:4.0.6r2
Image ID: docker-pullable://quay.io/smile/redis@sha256:8948a952920d4495859c984546838d4c9b4c71e0036eef86570922d91cacb3df
Port: 6379/TCP
State: Running
Started: Fri, 02 Feb 2018 15:28:44 +0900
Ready: True
Restart Count: 0
Environment:
REDIS_SENTINEL_SERVICE_HOST: redis-sentinel
REDIS_CHART_PREFIX: wishful-rabbit-mychart-
Mounts:
/redis-master-data from data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-wfv2q (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
data:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
default-token-wfv2q:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-wfv2q
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: <none>
Events: <none>
app=redis-ha
redis-node=true
redis-role=master
release=wishful-rabbit
app=mychart
chart=mychart-0.1.0
heritage=Tiller
name=redis-server
pod-template-hash=3029038988
podIP=172.17.0.10
redis-node=true
redis-role=master
release=wishful-rabbit
runID=cbf8e0
kubectl edit svc wishful-rabbit-mychart-master-svc