无法从 Istio 中的节点容器 运行 访问 Mongo
Can't access Mongo from Node container running in Istio
我正在尝试在 Kubernetes 中 运行 有状态 Mongo 并且它可以在 Istio 之外使用这些配置。
mongodb: {
uri: "mongodb://mongo-0.mongo,mongo-1.mongo,mongo-2.mongo",
dbName: "app"
}
但是当我 运行 Istio 中的节点应用程序时,它失去了连接到 mongo 的能力。是不是我遗漏了什么,或者是我还不能在 Istio 中使用有状态集?
有状态 mongo 配置如下。
apiVersion: v1
kind: Service
metadata:
labels:
service: mongo
name: mongo
spec:
ports:
- name: tcp
port: 27017
targetPort: 27017
clusterIP: None
selector:
service: mongo
role: mongo
***********
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: "mongo"
replicas: 3
template:
metadata:
labels:
role: mongo
environment: test
service: mongo
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo:3.4.6
resources:
requests:
cpu: "10m"
command:
- mongod
- "--replSet"
- rs0
- "--smallfiles"
- "--noprealloc"
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
- name: mongo-sidecar
image: cvallance/mongo-k8s-sidecar
resources:
requests:
cpu: "10m"
env:
- name: MONGO_SIDECAR_POD_LABELS
value: "role=mongo,environment=test"
我收到的错误是
[2017-07-25 12:01:11] ERROR Mongoose MonboDB connection error: {
"message": "write EPIPE",
"name": "MongoError",
"stack": "Error: write EPIPE\n at exports._errnoException (util.js:1024:11)\n at WriteWrap.afterWrite [as oncomplete] (net.js:851:14)"
}
[2017-07-25 12:01:11] ERROR ... retrying createConnection in 5 seconds...
[2017-07-25 12:01:16] ERROR Mongoose MonboDB connection error: {
"message": "read ECONNRESET",
"name": "MongoError",
"stack": "Error: read ECONNRESET\n at exports._errnoException (util.js:1024:11)\n at TCP.onread (net.js:610:25)"
}
最近添加了 StatefulSet 支持,但尚未发布。
对于那些在 istio 中通过手动注入收到此类错误的人:
当您向部署中注入代理时,网络在配置 istio-proxy 时被丢弃:
kubectl apply -f kubernetes-configs/
istioctl kube-inject -f kubernetes-configs/deployment.yml | kubectl -n foo apply -f -
届时,您将收到:
Error: write EPIPE
我通过在初始化之前添加暂停来解决问题,就像这个问题一样:How Can I Wait In Node.js (Javascript), l need to pause for a period of time
更新
这是另一种方法。只需让 nodejs 应用程序重新启动即可。通过在任何连接不成功的地方调用process.exit(137)
,Docker容器将被杀死并重新启动。届时,istio-proxy 将完成网络配置,您的应用程序将成功连接到数据库。
我正在尝试在 Kubernetes 中 运行 有状态 Mongo 并且它可以在 Istio 之外使用这些配置。
mongodb: {
uri: "mongodb://mongo-0.mongo,mongo-1.mongo,mongo-2.mongo",
dbName: "app"
}
但是当我 运行 Istio 中的节点应用程序时,它失去了连接到 mongo 的能力。是不是我遗漏了什么,或者是我还不能在 Istio 中使用有状态集?
有状态 mongo 配置如下。
apiVersion: v1
kind: Service
metadata:
labels:
service: mongo
name: mongo
spec:
ports:
- name: tcp
port: 27017
targetPort: 27017
clusterIP: None
selector:
service: mongo
role: mongo
***********
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: mongo
spec:
serviceName: "mongo"
replicas: 3
template:
metadata:
labels:
role: mongo
environment: test
service: mongo
spec:
terminationGracePeriodSeconds: 10
containers:
- name: mongo
image: mongo:3.4.6
resources:
requests:
cpu: "10m"
command:
- mongod
- "--replSet"
- rs0
- "--smallfiles"
- "--noprealloc"
ports:
- containerPort: 27017
volumeMounts:
- name: mongo-persistent-storage
mountPath: /data/db
- name: mongo-sidecar
image: cvallance/mongo-k8s-sidecar
resources:
requests:
cpu: "10m"
env:
- name: MONGO_SIDECAR_POD_LABELS
value: "role=mongo,environment=test"
我收到的错误是
[2017-07-25 12:01:11] ERROR Mongoose MonboDB connection error: {
"message": "write EPIPE",
"name": "MongoError",
"stack": "Error: write EPIPE\n at exports._errnoException (util.js:1024:11)\n at WriteWrap.afterWrite [as oncomplete] (net.js:851:14)"
}
[2017-07-25 12:01:11] ERROR ... retrying createConnection in 5 seconds...
[2017-07-25 12:01:16] ERROR Mongoose MonboDB connection error: {
"message": "read ECONNRESET",
"name": "MongoError",
"stack": "Error: read ECONNRESET\n at exports._errnoException (util.js:1024:11)\n at TCP.onread (net.js:610:25)"
}
最近添加了 StatefulSet 支持,但尚未发布。
对于那些在 istio 中通过手动注入收到此类错误的人:
当您向部署中注入代理时,网络在配置 istio-proxy 时被丢弃:
kubectl apply -f kubernetes-configs/
istioctl kube-inject -f kubernetes-configs/deployment.yml | kubectl -n foo apply -f -
届时,您将收到:
Error: write EPIPE
我通过在初始化之前添加暂停来解决问题,就像这个问题一样:How Can I Wait In Node.js (Javascript), l need to pause for a period of time
更新
这是另一种方法。只需让 nodejs 应用程序重新启动即可。通过在任何连接不成功的地方调用process.exit(137)
,Docker容器将被杀死并重新启动。届时,istio-proxy 将完成网络配置,您的应用程序将成功连接到数据库。