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

时间:2019-08-23 09:57:23

标签: mongodb kubernetes portforwarding kubernetes-ingress

我使用以下头盔图:https://github.com/helm/charts/tree/master/stable/mongodb将mongodb部署在Kubernetes集群中。没事。我可以使用端口转发或NodePort服务从复制集容器内或群集外部连接到mongo。但是我无法通过入口进行连接。

部署入口后,我可以卷曲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

非常感谢您!

2 个答案:

答案 0 :(得分:1)

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

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

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

如果托管环境支持,则将服务与type: loadBalancer一起使用;否则,将type: nodePort与服务一起使用。有一个example in the stable mongodb helm chart及其关联的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

答案 1 :(得分:0)

有两种方法可以做到这一点。

  1. 您可以创建mongo网址并直接将其指向部署

  2. 您可以使用其中提到的mongo url创建名为服务类型(ExternalName)的服务。 然后可以在部署中定义此服务。

kind: Service
apiVersion: v1
metadata:
  name: <service-name>
  namespace: <namespace>
spec:
  type: ExternalName
  externalName: xx.xx.xx.xx
  ports:
  - port: xxxx