You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s部署Percona MongoDB Exporter连接MongoDB超时问题问询

故障现象

部署Percona MongoDB Exporter采集K8s集群内MongoDB实例指标时,抛出如下连接错误:

An error has occurred while connecting to MongoDB:
cannot connect to MongoDB: server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: mongodb-headless-service.labs.svc.cluster.local:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mongodb-headless-service.svc.cluster.local on 159.XX.XX.XX:XX: no such host }, ] }
  • MongoDB与Exporter部署在同一K8s命名空间labs下
  • 已在MongoDB中创建权限符合要求的监控用户:
db.createUser({ user: "promt", pwd: "abc123", roles: [ { role: "clusterMonitor", db: "admin" },{ role: "read", db: "local" } ], mechanisms:["SCRAM-SHA-1"]})
  • 执行端口转发命令kubectl -n labs port-forward service/mongodb-exporter 9216后,可通过http://localhost:9216正常访问Exporter服务页面
现有配置

Exporter部署配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-exporter
  namespace: labs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb-exporter
  template:
    metadata:
      labels:
        app: mongodb-exporter
    spec:
      containers:
      - name: mongodb-exporter
        image: percona/mongodb_exporter:0.30
        imagePullPolicy: "IfNotPresent"
        args:
        - "--mongodb.direct-connect=false"
        - "--mongodb.uri=mongodb://promt:abc123@mongo-headless-service.svc.cluster.local/admin"
        ports:
        - name: metrics
          containerPort: 9216
        resources:
          requests:
            memory: 128Mi
            cpu: 250m

已尝试的无效调整

所有调整均返回相同错误,包括叠加SSL参数、命名空间后缀的组合配置:

  • 给Mongo URI添加命名空间后缀:--mongodb.uri=mongodb://promt:abc123@mongodb-headless-service.labs.svc.cluster.local/admin
  • 给Mongo URI添加SSL禁用参数:--mongodb.uri=mongodb://promt:abc123@mongodb-headless-service.svc.cluster.local/admin?ssl=false
  • 将Headless Service替换为ClusterIP类型Service,对应URI:--mongodb.uri=mongodb://promt:abc123@mongo-single-clusterip.labs.svc.cluster.local/admin
  • 开启直连配置:--mongodb.direct-connect=true,搭配原有Headless Service地址

MongoDB及关联Service配置

MongoDB为单实例部署,配置如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb-deployment
  namespace: labs
  labels:
    app: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: docker.io/bitnami/mongodb:4.4.6-debian-10-r0
        imagePullPolicy: "IfNotPresent"
        securityContext:
            runAsNonRoot: true
            runAsUser: 1001
        ports:
          - containerPort: 27017
        env:
            - name: MONGO_INITDB_ROOT_USERNAME
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret-amended
                  key: mongo-root-username
            - name: MONGO_INITDB_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mongodb-secret-amended
                  key: mongo-root-password
        volumeMounts: 
            - mountPath: /data/db
              name: mongodb-vol
      volumes:
      - name: mongodb-vol
        persistentVolumeClaim:
          claimName: mongodb-claim
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-service
  namespace: labs
spec:
  type: NodePort
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017 
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-headless-service
  namespace: labs
spec:
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017 
---
apiVersion: v1
kind: Service
metadata:
  name: mongo-single-clusterip
  namespace: labs
spec:
  type: ClusterIP
  selector:
    app: mongodb
  ports:
    - protocol: TCP
      port: 27017
      targetPort: 27017

故障原因与修复方案

核心问题点

  1. Headless Service配置无效
    定义的mongodb-headless-service没有添加必填字段clusterIP: None,本质是普通ClusterIP Service,不具备Headless Service的域名解析特性。
  2. 参数拼写错误+配置未生效
    初始Exporter配置中的服务地址写为mongo-headless-service.svc.cluster.local,和实际创建的服务名mongodb-headless-service存在拼写差异。从报错信息看,修改URI添加命名空间后缀后,程序仍在解析不带命名空间的域名,说明修改后的参数没有被加载——修改Deployment参数后必须等待Pod滚动重建完成,新配置才会生效。
  3. 连接参数不匹配单实例场景
    单实例部署场景下--mongodb.direct-connect应设为true,关闭副本集拓扑探测逻辑,避免不必要的节点发现流程拖慢连接。

修复步骤

  1. 优先使用已创建的ClusterIP类型Servicemongo-single-clusterip,不需要强制使用Headless Service。如果要保留Headless Service,在其spec段补充clusterIP: None即可。
  2. 修改Exporter启动参数为如下配置:
    args:
    - "--mongodb.direct-connect=true"
    - "--mongodb.uri=mongodb://promt:abc123@mongo-single-clusterip.labs.svc.cluster.local:27017/admin?authSource=admin&ssl=false"
    
  3. 应用配置后等待Exporter Pod重建完成,进入Pod执行域名解析测试:
    kubectl -n labs exec -it <exporter-pod名称> -- nslookup mongo-single-clusterip.labs.svc.cluster.local
    
    如果解析返回集群内部IP,说明网络连通正常;如果解析失败,检查Exporter Pod的dnsPolicy配置,保持默认值ClusterFirst即可,不要修改为Default或None,否则无法解析集群内部域名。
  4. 重新端口转发访问http://localhost:9216/metrics,即可看到正常采集的MongoDB指标。

内容的提问来源于stack exchange,提问作者Golide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 04:01:23