如何从Kubernetes集群中的应用程序连接Redis集群?(How to connect Redis cluster from application in Kubernetes cluster?)
这是我的应用程序代码:
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)
这里想要连接Kubernetes集群中的Redis主机。 因此,在Kubernetes的清单文件中设置环境变量
REDIS
来设置值。这是Kubernetes部署清单文件:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "fullname" . }} labels: app: {{ template "name" . }} chart: {{ template "chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ template "name" . }} release: {{ .Release.Name }} template: metadata: labels: app: {{ template "name" . }} release: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} env: - name: REDIS value: {{ template "fullname" . }}-master-svc ports: - name: http containerPort: 80 protocol: TCP resources: {{ toYaml .Values.resources | indent 12 }} {{- with .Values.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.affinity }} affinity: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{ toYaml . | indent 8 }} {{- end }}
要在同一群集中连接Redis主机,请将环境值设置为:
env: - name: REDIS value: {{ template "fullname" . }}-master-svc
关于Redis集群,由官方redis-ha图表安装。 其主服务清单文件是:
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 }}"
但似乎应用程序窗格未成功连接到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
和services
更多信息: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
什么是正确的用法?
Redis Server Pod Env
kubectl exec -it wishful-rabbit-mychart-server-746f47dfdd-2fn4s -- sh / # printenv KUBERNETES_PORT=tcp://10.96.0.1:443 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PORT=6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_ADDR=10.108.128.167 KUBERNETES_SERVICE_PORT=443 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PROTO=tcp WISHFUL_RABBIT_MYCHART_SERVICE_HOST=10.101.103.224 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PORT=6379 HOSTNAME=wishful-rabbit-mychart-server-746f47dfdd-2fn4s SHLVL=1 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PROTO=tcp HOME=/root WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_HOST=10.107.63.208 WISHFUL_RABBIT_MYCHART_PORT=tcp://10.101.103.224:80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_SERVICE_PORT=80 WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP=tcp://10.108.128.167:6379 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_ADDR=10.101.103.224 REDIS_CHART_PREFIX=wishful-rabbit-mychart- TERM=xterm WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PORT=80 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PROTO=tcp PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_ADDR=10.107.63.208 WISHFUL_RABBIT_MYCHART_PORT_80_TCP=tcp://10.101.103.224:80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_HOST=10.99.211.111 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PROTO=tcp KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_HOST=10.108.128.167 PWD=/ KUBERNETES_SERVICE_HOST=10.96.0.1 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_PORT=6379 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_SERVICE_PORT_HTTP=80 REDIS_SENTINEL_SERVICE_HOST=redis-sentinel WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_ADDR=10.99.211.111 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT=tcp://10.108.128.167:6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_PORT=6379
Application Pod Env
kubectl exec -it wishful-rabbit-mychart-85dc7658c6-8wlq6 -- sh # printenv KUBERNETES_SERVICE_PORT=443 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PORT=6379 KUBERNETES_PORT=tcp://10.96.0.1:443 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_ADDR=10.108.128.167 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PROTO=tcp WISHFUL_RABBIT_MYCHART_SERVICE_HOST=10.101.103.224 HOSTNAME=wishful-rabbit-mychart-85dc7658c6-8wlq6 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PORT=6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PROTO=tcp PYTHON_PIP_VERSION=9.0.1 WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_HOST=10.107.63.208 HOME=/root GPG_KEY=C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF REDIS=wishful-rabbit-mychart-master-svc WISHFUL_RABBIT_MYCHART_SERVICE_PORT=80 WISHFUL_RABBIT_MYCHART_PORT=tcp://10.101.103.224:80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP=tcp://10.108.128.167:6379 WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_ADDR=10.101.103.224 NAME=World TERM=xterm KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PORT=80 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PROTO=tcp PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp LANG=C.UTF-8 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_ADDR=10.107.63.208 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_HOST=10.99.211.111 WISHFUL_RABBIT_MYCHART_PORT_80_TCP=tcp://10.101.103.224:80 PYTHON_VERSION=2.7.14 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_SERVICE_PORT_HTTPS=443 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_HOST=10.108.128.167 KUBERNETES_SERVICE_HOST=10.96.0.1 PWD=/app WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_SERVICE_PORT_HTTP=80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_PORT=6379 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_ADDR=10.99.211.111 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_PORT=6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT=tcp://10.108.128.167:6379
所有端点
kubectl get ep NAME ENDPOINTS AGE kubernetes 10.0.2.15:8443 4h wishful-rabbit-mychart 172.17.0.5:80,172.17.0.6:80,172.17.0.7:80 1h wishful-rabbit-mychart-master-svc <none> 1h wishful-rabbit-mychart-sentinel 172.17.0.11:26379,172.17.0.12:26379,172.17.0.8:26379 1h wishful-rabbit-mychart-slave-svc <none>
描述Redis Master Service
kubectl describe svc wishful-rabbit-mychart-master-svc Name: wishful-rabbit-mychart-master-svc Namespace: default Labels: <none> Annotations: <none> Selector: app=redis-ha,redis-node=true,redis-role=master,release=wishful-rabbit Type: ClusterIP IP: 10.108.128.167 Port: <unset> 6379/TCP TargetPort: 6379/TCP Endpoints: <none> Session Affinity: None Events: <none>
描述Redis Server Pod
kubectl 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>
This is my application code:
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)
Here want to connect a Redis host in the Kubernetes cluster. So put a environment variable
REDIS
to set value in Kubernetes' manifest file.This is the Kubernetes deployment manifest file:
apiVersion: apps/v1beta2 kind: Deployment metadata: name: {{ template "fullname" . }} labels: app: {{ template "name" . }} chart: {{ template "chart" . }} release: {{ .Release.Name }} heritage: {{ .Release.Service }} spec: replicas: {{ .Values.replicaCount }} selector: matchLabels: app: {{ template "name" . }} release: {{ .Release.Name }} template: metadata: labels: app: {{ template "name" . }} release: {{ .Release.Name }} spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" imagePullPolicy: {{ .Values.image.pullPolicy }} env: - name: REDIS value: {{ template "fullname" . }}-master-svc ports: - name: http containerPort: 80 protocol: TCP resources: {{ toYaml .Values.resources | indent 12 }} {{- with .Values.nodeSelector }} nodeSelector: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.affinity }} affinity: {{ toYaml . | indent 8 }} {{- end }} {{- with .Values.tolerations }} tolerations: {{ toYaml . | indent 8 }} {{- end }}
In order to connect Redis host in the same cluster, set environment value as:
env: - name: REDIS value: {{ template "fullname" . }}-master-svc
About Redis cluster, installed by official redis-ha chart. Its master service manifest file is:
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 }}"
But it seems that the application pod didn't connect to the Redis master service name successfully. When I got accessed 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
from browser, got this result:
Hello World! Hostname: wishful-rabbit-mychart-85dc7658c6-9blg5 Visits: cannot connect to Redis, counter disabled
More information about
pods
andservices
: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
What's the right usage?
Redis Server Pod Env
kubectl exec -it wishful-rabbit-mychart-server-746f47dfdd-2fn4s -- sh / # printenv KUBERNETES_PORT=tcp://10.96.0.1:443 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PORT=6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_ADDR=10.108.128.167 KUBERNETES_SERVICE_PORT=443 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PROTO=tcp WISHFUL_RABBIT_MYCHART_SERVICE_HOST=10.101.103.224 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PORT=6379 HOSTNAME=wishful-rabbit-mychart-server-746f47dfdd-2fn4s SHLVL=1 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PROTO=tcp HOME=/root WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_HOST=10.107.63.208 WISHFUL_RABBIT_MYCHART_PORT=tcp://10.101.103.224:80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_SERVICE_PORT=80 WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP=tcp://10.108.128.167:6379 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_ADDR=10.101.103.224 REDIS_CHART_PREFIX=wishful-rabbit-mychart- TERM=xterm WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PORT=80 KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PROTO=tcp PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_ADDR=10.107.63.208 WISHFUL_RABBIT_MYCHART_PORT_80_TCP=tcp://10.101.103.224:80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_HOST=10.99.211.111 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PROTO=tcp KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_HOST=10.108.128.167 PWD=/ KUBERNETES_SERVICE_HOST=10.96.0.1 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_PORT=6379 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_SERVICE_PORT_HTTP=80 REDIS_SENTINEL_SERVICE_HOST=redis-sentinel WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_ADDR=10.99.211.111 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT=tcp://10.108.128.167:6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_PORT=6379
Application Pod Env
kubectl exec -it wishful-rabbit-mychart-85dc7658c6-8wlq6 -- sh # printenv KUBERNETES_SERVICE_PORT=443 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PORT=6379 KUBERNETES_PORT=tcp://10.96.0.1:443 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_ADDR=10.108.128.167 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_PROTO=tcp WISHFUL_RABBIT_MYCHART_SERVICE_HOST=10.101.103.224 HOSTNAME=wishful-rabbit-mychart-85dc7658c6-8wlq6 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PORT=6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP_PROTO=tcp PYTHON_PIP_VERSION=9.0.1 WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_HOST=10.107.63.208 HOME=/root GPG_KEY=C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF REDIS=wishful-rabbit-mychart-master-svc WISHFUL_RABBIT_MYCHART_SERVICE_PORT=80 WISHFUL_RABBIT_MYCHART_PORT=tcp://10.101.103.224:80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT_6379_TCP=tcp://10.108.128.167:6379 WISHFUL_RABBIT_MYCHART_SENTINEL_SERVICE_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_ADDR=10.101.103.224 NAME=World TERM=xterm KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PORT=80 WISHFUL_RABBIT_MYCHART_PORT_80_TCP_PROTO=tcp PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 KUBERNETES_PORT_443_TCP_PROTO=tcp LANG=C.UTF-8 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_ADDR=10.107.63.208 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_HOST=10.99.211.111 WISHFUL_RABBIT_MYCHART_PORT_80_TCP=tcp://10.101.103.224:80 PYTHON_VERSION=2.7.14 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PORT=26379 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP_PROTO=tcp KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443 KUBERNETES_SERVICE_PORT_HTTPS=443 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_HOST=10.108.128.167 KUBERNETES_SERVICE_HOST=10.96.0.1 PWD=/app WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT=tcp://10.99.211.111:6379 WISHFUL_RABBIT_MYCHART_SERVICE_PORT_HTTP=80 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_SERVICE_PORT=6379 WISHFUL_RABBIT_MYCHART_SLAVE_SVC_PORT_6379_TCP_ADDR=10.99.211.111 WISHFUL_RABBIT_MYCHART_SENTINEL_PORT_26379_TCP=tcp://10.107.63.208:26379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_SERVICE_PORT=6379 WISHFUL_RABBIT_MYCHART_MASTER_SVC_PORT=tcp://10.108.128.167:6379
All Endpoints
kubectl get ep NAME ENDPOINTS AGE kubernetes 10.0.2.15:8443 4h wishful-rabbit-mychart 172.17.0.5:80,172.17.0.6:80,172.17.0.7:80 1h wishful-rabbit-mychart-master-svc <none> 1h wishful-rabbit-mychart-sentinel 172.17.0.11:26379,172.17.0.12:26379,172.17.0.8:26379 1h wishful-rabbit-mychart-slave-svc <none>
Describe Redis Master Service
kubectl describe svc wishful-rabbit-mychart-master-svc Name: wishful-rabbit-mychart-master-svc Namespace: default Labels: <none> Annotations: <none> Selector: app=redis-ha,redis-node=true,redis-role=master,release=wishful-rabbit Type: ClusterIP IP: 10.108.128.167 Port: <unset> 6379/TCP TargetPort: 6379/TCP Endpoints: <none> Session Affinity: None Events: <none>
Describe Redis Server Pod
kubectl 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>
原文:https://stackoverflow.com/questions/48577544
最满意答案
日志很清楚:
java.net.SocketTimeoutException: failed to connect to /192.168.1.15 (port 5984)
ACRA无法访问服务器。
您可以检查是否可以从普通的移动浏览器访问服务器以识别问题位置。
The log is pretty clear:
java.net.SocketTimeoutException: failed to connect to /192.168.1.15 (port 5984)
ACRA can't reach the server.
You can check if you can reach the server from a normal mobile browser to identify the problems location.
相关问答
更多-
您可以实施您自己的ReportSender,根据官方文档将所有内容保存到文件中。 https://github.com/ACRA/acra/wiki/Report-Destinations#implementing-your-own-sender You can implement your own ReportSender that saves everything to file according official docs. https://github.com/ACRA/acra/wiki/Rep ...
-
现在有许多更先进的分析平台可用于手机和网络,如乱舞,混合面板,小动物 ,zubhium 。 我发现批评对移动应用性能监测和崩溃报告更有用! There are many more advanced analytics platform nowadays for mobile & web like flurry, mixpanel, crittercism, zubhium . I found crittercism more useful for Mobile App Performance Monitor ...
-
ACRA vs UncaughtExceptionHandler哪个更好?(ACRA vs UncaughtExceptionHandler Which is better?)[2024-01-04]
UncaughtExceptionHandler - 只在本地捕获您的异常 ACRA - 捕获并允许使用不同方式向您发送异常数据 Crashlytics UncaughtExceptionHandler - just catches your exceptions locally ACRA - catches and allows to send exceptions data to you using different ways Crashlytics -
日志很清楚: java.net.SocketTimeoutException: failed to connect to /192.168.1.15 (port 5984) ACRA无法访问服务器。 您可以检查是否可以从普通的移动浏览器访问服务器以识别问题位置。 The log is pretty clear: java.net.SocketTimeoutException: failed to connect to /192.168.1.15 (port 5984) ACRA can't reach ...
-
文档说你可以通过SharedPreferences : getSharedPreferences().edit().putString( "acra.user.email", "your@email.com" ).commit(); 应该做的伎俩。 我没有测试过,因为我没有看到在我的设置中在运行时设置电子邮件地址的用处。 The documentation says you can do it through SharedPreferences: getSharedPreferences().edit() ...
-
ACRA - 在没有任何崩溃对话的情况下静默发送崩溃报告(ACRA - silently send crash reports without any crash dialog)[2023-03-15]
AFAIK,ACRA在收集报告时不依赖于系统对话框。 即使用户在系统对话框中单击了REPORT,也应发送报告。 我猜“沉默”意味着没有创建ACRA对话框。 对于我的应用,我只是使用了他们的维基上的说明( http://code.google.com/p/acra/wiki/BasicSetup?tm=6#Setting-up_your_project ),一切正常。 我仍然在市场开发者控制台上获得崩溃报告,但我对ACRA的应用程序表现有了更好的了解。 如果你想完全隐藏默认的崩溃对话框,我想唯一的解决办法是修 ... -
更多最新的基本设置说明可以在ACRA的GitHub Wiki上找到: https : //github.com/ACRA/acra/wiki/BasicSetup 声明SenderService ACRA(4.8+)使用SenderService发送报告,因此需要在您的AndroidManifest中进行配置。 如果您使用清单合并,那么SenderService将自动包含给您。 否则,您还需要配置将发送报告的服务。 它应该看起来像:当我完全按照他们在他们的文档中所说的做法时,ACRA帮我发送电子邮件报告: @ReportsCrashes(mailTo = "reports@yourdomain.com", // my email here mode = ReportingInteractionMode.TOAST, resToastText = R.string.crash_toast_text) https://github.com/ACRA/acra/wiki/Re ...
什么是标准Java的ACRA?(What is ACRA for standard Java?)[2023-01-25]
我从未碰过过一个。 但我之前使用过ACRA。 它将数据上传到谷歌电子表格的方式非常简单。 您可以使用您想要的任何列在G-Docs上创建表单,然后在您的代码中使用基本URL +参数创建HTTP请求 以下是如何构建要上传到表单的url字符串: String url = "https://spreadsheets.google.com/formResponse?formkey="+ YOUR_KEY+ "&entry.0.single="+URLEncoder.e ...我认为它非常明确=> ACRA.init方法被调用两次(或更多) 为什么在onConfigurationChanged方法中初始化ACRA? 每次更改配置时都会调用onConfigurationChanged(好的演绎Dr Watson ......):例如,当您更改手机的方向时,...... 您应该在Application.onCreate方法中初始化ACRA(只调用一次): public class MyApplication extends Application { @Override pu ...相关文章
更多- 在archlinux上搭建twitter storm cluster
- redis 集群环境搭建-redis集群管理
- Spark - A Fault-Tolerant Abstraction for In-Memory Cluster Computing
- storm操作zookeeper源码分析-cluster.clj
- install cluster Hadoop 安装集群版Hadoop
- redis新增集群节点-redis集群管理
- redis集群插槽分配-redis集群管理
- redis删除集群节点-redis集群管理
- redis集群出现宕机没法访问-redis集群管理
- redis 集群使用主从复制架构-redis集群管理
最新问答
更多- 如何在Laravel 5.2中使用paginate与关系?(How to use paginate with relationships in Laravel 5.2?)
- linux的常用命令干什么用的
- 由于有四个新控制器,Auth刀片是否有任何变化?(Are there any changes in Auth blades due to four new controllers?)
- 如何交换返回集中的行?(How to swap rows in a return set?)
- 在ios 7中的UITableView部分周围绘制边界线(draw borderline around UITableView section in ios 7)
- 使用Boost.Spirit Qi和Lex时的空白队长(Whitespace skipper when using Boost.Spirit Qi and Lex)
- Java中的不可变类(Immutable class in Java)
- WordPress发布查询(WordPress post query)
- 如何在关系数据库中存储与IPv6兼容的地址(How to store IPv6-compatible address in a relational database)
- 是否可以检查对象值的条件并返回密钥?(Is it possible to check the condition of a value of an object and JUST return the key?)
- GEP分段错误LLVM C ++ API(GEP segmentation fault LLVM C++ API)
- 绑定属性设置器未被调用(Bound Property Setter not getting Called)
- linux ubuntu14.04版没有那个文件或目录
- 如何使用JSF EL表达式在param中迭代变量(How to iterate over variable in param using JSF EL expression)
- 是否有可能在WPF中的一个单独的进程中隔离一些控件?(Is it possible to isolate some controls in a separate process in WPF?)
- 使用Python 2.7的MSI安装的默认安装目录是什么?(What is the default installation directory with an MSI install of Python 2.7?)
- 寻求多次出现的表达式(Seeking for more than one occurrence of an expression)
- ckeditor config.protectedSource不适用于editor.insertHtml上的html元素属性(ckeditor config.protectedSource dont work for html element attributes on editor.insertHtml)
- linux只知道文件名,不知道在哪个目录,怎么找到文件所在目录
- Actionscript:检查字符串是否包含域或子域(Actionscript: check if string contains domain or subdomain)
- 将CouchDB与AJAX一起使用是否安全?(Is it safe to use CouchDB with AJAX?)
- 懒惰地初始化AutoMapper(Lazily initializing AutoMapper)
- 使用hasclass为多个div与一个按钮问题(using hasclass for multiple divs with one button Problems)
- Windows Phone 7:检查资源是否存在(Windows Phone 7: Check If Resource Exists)
- 无法在新线程中从FREContext调用getActivity()?(Can't call getActivity() from FREContext in a new thread?)
- 在Alpine上升级到postgres96(/ usr / bin / pg_dump:没有这样的文件或目录)(Upgrade to postgres96 on Alpine (/usr/bin/pg_dump: No such file or directory))
- 如何按部门显示报告(How to display a report by Department wise)
- Facebook墙贴在需要访问令牌密钥后无法正常工作(Facebook wall post not working after access token key required)
- Javascript - 如何在不擦除输入的情况下更改标签的innerText(Javascript - how to change innerText of label while not wiping out the input)
- WooCommerce / WordPress - 不显示具有特定标题的产品(WooCommerce/WordPress - Products with specific titles are not displayed)