无法从 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 支持,但尚未发布。

https://github.com/istio/pilot/pull/896

对于那些在 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 将完成网络配置,您的应用程序将成功连接到数据库。