Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Kubernetes集群中的应用程序连接Redis集群?_Redis_Kubernetes_Cluster Computing_Minikube_Kubernetes Helm - Fatal编程技术网

如何从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