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
故障原因与修复方案
核心问题点
- Headless Service配置无效
定义的mongodb-headless-service没有添加必填字段clusterIP: None,本质是普通ClusterIP Service,不具备Headless Service的域名解析特性。 - 参数拼写错误+配置未生效
初始Exporter配置中的服务地址写为mongo-headless-service.svc.cluster.local,和实际创建的服务名mongodb-headless-service存在拼写差异。从报错信息看,修改URI添加命名空间后缀后,程序仍在解析不带命名空间的域名,说明修改后的参数没有被加载——修改Deployment参数后必须等待Pod滚动重建完成,新配置才会生效。 - 连接参数不匹配单实例场景
单实例部署场景下--mongodb.direct-connect应设为true,关闭副本集拓扑探测逻辑,避免不必要的节点发现流程拖慢连接。
修复步骤
- 优先使用已创建的ClusterIP类型Service
mongo-single-clusterip,不需要强制使用Headless Service。如果要保留Headless Service,在其spec段补充clusterIP: None即可。 - 修改Exporter启动参数为如下配置:
args: - "--mongodb.direct-connect=true" - "--mongodb.uri=mongodb://promt:abc123@mongo-single-clusterip.labs.svc.cluster.local:27017/admin?authSource=admin&ssl=false" - 应用配置后等待Exporter Pod重建完成,进入Pod执行域名解析测试:
如果解析返回集群内部IP,说明网络连通正常;如果解析失败,检查Exporter Pod的kubectl -n labs exec -it <exporter-pod名称> -- nslookup mongo-single-clusterip.labs.svc.cluster.localdnsPolicy配置,保持默认值ClusterFirst即可,不要修改为Default或None,否则无法解析集群内部域名。 - 重新端口转发访问
http://localhost:9216/metrics,即可看到正常采集的MongoDB指标。
内容的提问来源于stack exchange,提问作者Golide
相关产品推荐
相关产品推荐

