如何从集群外部访问 Kubernetes 中的 MongoDB

How access MongoDB in Kubernetes from outside the cluster

我使用此 helm chart 在 Kubernetes 集群中部署了 mongodb:https://github.com/helm/charts/tree/master/stable/mongodb。一切正常。我可以使用端口转发或 NodePort 服务从复制集容器内或集群外部连接到 mongo。但是我无法通过入口连接。

部署入口后,我可以 curl mongodb 并收到这条著名的消息:"It looks like you are trying to access MongoDB over HTTP on the native driver port."。但是我无法连接 mongo 客户端,连接卡住了,我可以在 mongodb 日志中看到我从未到达 mongo.

有人知道关于通过入口对象访问 mongodb 的任何信息吗?可能是协议问题?

入口清单:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ template "mongodb.fullname" . }}
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: {{ .Values.ingress.hostName }}
    http:
      paths:
        - path: /
          backend:
            serviceName: "{{ template "mongodb.fullname" $ }}"
            servicePort: mongodb
  tls:
  - hosts:
    - {{ .Values.ingress.hostName }}
    secretName: secret

非常感谢!

入口控制器是为 HTTP 连接设计的,正如错误提示的那样,入口不是访问的方式 mongodb。

None 入口定义中的信息对于普通 TCP 连接很有意义,host 名称和 http URL paths 不适用于普通TCP 连接。

一些入口控制器(如 nginx-ingress)可以支持普通 TCP 负载平衡器,但不能通过入口定义。他们使用自定义配置映射。

如果您的托管环境支持,请将服务与 type: loadBalancer 一起使用,如果不支持,请使用 type: nodePort。有一个example in the stable mongodb helm chart and it's associated values

apiVersion: v1
kind: Service
metadata:
  name: {{ template "mongodb.fullname" . }}
  labels:
    app: {{ template "mongodb.name" . }}
spec:
  type: loadBalancer
  ports:
  - name: mongodb
    port: 27017
    targetPort: mongodb
  - name: metrics
    port: 9216
    targetPort: metrics