【问题标题】:Connect to mongodb with mongoose both in kubernetes在 kubernetes 中都使用 mongoose 连接到 mongodb
【发布时间】:2021-04-28 09:49:06
【问题描述】:

我有一个使用 docker-compose 开发和测试的微服务。现在我想将它部署到 Kubernetes。

我的 docker-compose 文件的一部分如下所示:

  tasksdb:
    container_name: tasks-db
    image: mongo:4.4.1
    restart: always
    ports:
      - '6004:27017'
    volumes:
      - ./tasks_service/tasks_db:/data/db
    networks:
      - backend

  tasks-service:
    container_name: tasks-service
    build: ./tasks_service
    restart: always
    ports:
      - "5004:3000"
    volumes:
      - ./tasks_service/logs:/usr/src/app/logs
      - ./tasks_service/tasks_attachments/:/usr/src/app/tasks_attachments
    depends_on:
      - tasksdb
    networks:
      - backend

我使用猫鼬连接到数据库,它工作正常:

const connection = "mongodb://tasks-db:27017/tasks"; 

const connectDb = () => {
   mongoose.connect(connection, {useNewUrlParser:true, useCreateIndex:true, useFindAndModify: false});
   return mongoose.connect(connection);
  
 };

利用 Kompose,我创建了一个部署文件,但是我必须相应地修改持久卷和持久卷声明。

我有这样的事情:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: tasks-volume
  labels:
    type: local
spec:
  storageClassName: manual
  volumeMode: Filesystem
  capacity:
    storage: 10Gi 
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.60.50
    path: /tasks_db

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: tasksdb-claim0
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

我更改了 mongourl,如下所示 here

const connection = "mongodb://tasksdb.default.svc.cluster.local:27017/tasks";

我的部署如下所示:

apiVersion: v1
items:
  - apiVersion: v1
    kind: Service
    metadata:
      annotations:
        kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: tasks-service
      name: tasks-service
    spec:
      ports:
        - name: "5004"
          port: 5004
          targetPort: 3000
      selector:
        io.kompose.service: tasks-service

    status:
      loadBalancer: {}
  - apiVersion: v1
    kind: Service
    metadata:
      annotations:
        kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: tasksdb
      name: tasksdb
    spec:
      ports:
        - name: "6004"
          port: 6004
          targetPort: 27017
      selector:
        io.kompose.service: tasksdb
    status:
      loadBalancer: {}
  - apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: tasks-service
      name: tasks-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          io.kompose.service: tasks-service
      strategy:
        type: Recreate
      template:
        metadata:
          annotations:
            kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
            kompose.version: 1.22.0 (955b78124)
          creationTimestamp: null
          labels:
            io.kompose.service: tasks-service
        spec:
          containers:
            - image: 192.168.60.50:5000/blascal_tasks-service
              name: tasks-service
              imagePullPolicy: IfNotPresent
              ports:
                - containerPort: 3000
          restartPolicy: Always
    status: {}
  - apiVersion: apps/v1
    kind: Deployment
    metadata:
      annotations:
        kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: tasksdb
      name: tasksdb
    spec:
      replicas: 1
      selector:
        matchLabels:
          io.kompose.service: tasksdb
      strategy:
        type: Recreate
      template:
        metadata:
          annotations:
            kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
            kompose.version: 1.22.0 (955b78124)
          creationTimestamp: null
          labels:
            io.kompose.service: tasksdb
        spec:
          containers:
            - image: mongo:4.4.1
              name: tasks-db
              ports:
                - containerPort: 27017 
              resources: {}
              volumeMounts:
                - mountPath: /data/db
                  name: tasksdb-claim0
          restartPolicy: Always
          volumes:
            - name: tasksdb-claim0
              persistentVolumeClaim:
                claimName: tasksdb-claim0
    status: {}

有几个服务,我为我的路由添加了一个入口资源:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: tasks-service
          servicePort: 5004

如您所见,部署似乎运行良好。

但是,我有三个问题:

  1. 尽管我可以点击仅显示“任务服务已启动”的默认路径,但我无法访问连接到数据库的 /api/task/raise 之类的猫鼬路由,但它显示“..buffering timed out”喜欢。我猜,路径没有链接到数据库服务? 任务服务 pod 给出了这个

  2. 每当出现电涌并且我的机器关闭时,在我从持久卷中删除配置文件之前,启动数据库部署都会失败,如何防止这种文件损坏?

  3. 我一直在研究如何更改集群的主 IP,因为我打算将集群转移到不同的网络。请问有什么指导吗?

    kubectl 日志 --namespace=kube-system -l k8s-app=kube-dns

上面给出了这个:

【问题讨论】:

  • 您是否正确配置了 DNS 服务(coredns 或 kube-dns)?
  • 有用的容器网络指南digitalocean.com/community/tutorials/…。使用nslookup tasksdb.default.svc.cluster.local 检查名称服务器状态。
  • 所以 nslookup 给出回复 ** server can't find tasksdb.default.svc.cluster: NXDOMAIN.我该如何配置它?我不知道我必须这样做。
  • 看起来你的 k8s DNS 服务坏了。您使用哪种 DNS 服务,coredns 还是 kube-dns?
  • 嗨@Denn。您可以查看我的答案之一here。它展示了如何为 k8s 调试和(重新)安装 DNS。

标签: docker mongoose kubernetes nginx-ingress kompose


【解决方案1】:

您的tasksdb 服务公开端口 6004,而不是 27017。尝试使用以下 URL:

const connection = "mongodb://tasksdb.default.svc.cluster.local:6004/tasks";

更改网络取决于您使用的网络 CNI 插件。每个插件都有不同的步骤。印花布请查看https://docs.projectcalico.org/networking/migrate-pools

【讨论】:

  • 所以我用端口6004尝试了几次,没有突破。 “..buffering timed out”的相同错误。
  • 我还建议将 MongoDB 作为 StatefulSet 运行 kubernetes.io/docs/concepts/workloads/controllers/statefulset
  • 我已更新错误。让我尝试将 mongo 部署实现为 statefulset。
  • 也可能是应用程序代码问题。您可以从 CLI 检查您与 mongo 客户端的连接吗?
  • 好吧,我可以访问 mongodb,尽管它没有应该创建的任务数据库。不知道是什么问题
【解决方案2】:

我相信这是您为 mongodb 实例设置的集群 ip:

apiVersion: v1
    kind: Service
    metadata:
      annotations:
        kompose.cmd: kompose convert -f docker-compose.yml -o k8manifest.yml
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: tasksdb
      name: tasksdb
    spec:
      ports:
        - name: "6004"
          port: 6004
          targetPort: 27017
      selector:
        io.kompose.service: tasksdb
    status:
      loadBalancer: {}

当您在 kubernetes 中创建 mongodb 实例时,它会在 pod 中运行。要连接到 pod,我们必须通过集群 IP 服务。每当我们尝试连接到集群 IP 服务时,我们都会为连接 url 的域写入该集群 IP 服务的名称。在这种情况下,您的连接 url 必须是

mongodb://tasksdb:6004/nameOfDatabase

【讨论】:

    猜你喜欢
    • 2015-01-28
    • 2017-03-25
    • 2019-12-30
    • 1970-01-01
    • 2020-02-22
    • 2020-07-25
    • 2021-06-19
    • 2017-09-09
    • 2020-06-21
    相关资源
    最近更新 更多