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

Ant*_*ine 2 portforwarding mongodb kubernetes kubernetes-ingress

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

部署入口后,我可以 curl mongodb 并收到这条著名的消息:“看起来您正在尝试通过本机驱动程序端口上的 HTTP 访问 MongoDB。”。但是我无法与 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
Run Code Online (Sandbox Code Playgroud)

非常感谢 !

Mat*_*att 6

Ingress 控制器是为 HTTP 连接设计的,正如错误所暗示的,ingress 不是访问 mongodb 的方式。

入口定义中的任何信息对于普通 TCP 连接都没有多大意义,host名称和 http URLpaths不适用于普通 TCP 连接。

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

type: loadBalancer如果您的托管环境支持或type: nodePort不支持,请使用服务。在稳定的 mongodb 舵图中有一个例子,它的关联

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
Run Code Online (Sandbox Code Playgroud)