具有 Mongo 的 Pod 可通过本地主机访问但不能通过服务名称访问

Pod with Mongo reachable via localhost but not service name

此问题仅出现在使用默认 Minikube 设置创建的集群上,但不会出现在通过 Kops 创建的远程集群上。

我 运行 在虚拟机的 Minikube 集群上进行此设置。我的命名空间中有一个 Pod 运行ning MongoDB 和一个指向它的服务:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: mongo
  namespace: platform
  labels:
    app: mongo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
        - name: mongo
          image: mongo
          env:
          - name: MONGO_INITDB_ROOT_USERNAME
            value: root
          - name: MONGO_INITDB_ROOT_PASSWORD
            value: password

---
apiVersion: v1
kind: Service
metadata:
  name: mongo
  namespace: platform
spec:
  selector:
    app: mongo
  ports:
    - protocol: TCP
      port: 27017

当我在 mongo 容器中 运行 一个 shell 时,我可以使用

连接到数据库
mongo mongodb://root:password@localhost:27017

但不适用于

$ mongo mongodb://root:password@mongo:27017
MongoDB shell version v4.4.1
connecting to: mongodb://mongo:27017/?compressors=disabled&gssapiServiceName=mongodb
Error: couldn't connect to server mongo:27017, connection attempt failed: SocketException: Error connecting to mongo:27017 (10.110.155.65:27017) :: caused by :: Connection timed out :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1

我检查了服务,它指向正确的地址:

$ kubectl describe service mongo --namespace platform
Name:              mongo
Namespace:         platform
Labels:            <none>
Annotations:       <none>
Selector:          app=mongo
Type:              ClusterIP
IP:                10.110.155.65
Port:              <unset>  27017/TCP
TargetPort:        27017/TCP
Endpoints:         172.17.0.9:27017
Session Affinity:  None
Events:            <none>
$ kubectl describe pod mongo-6c79f887-5khnc | grep IP   
IP:           172.17.0.9

直接使用这个端点也可以:

mongo mongodb://root:password@172.17.0.9:27017

作为旁注,我在同一个命名空间中还有其他 pods+ 服务 运行ning 网络服务器,它们通过服务按预期工作。

加法

I 运行 mongo ... 连接命令来自 MongoDB container/pod。我还在同一命名空间内尝试了来自其他 pods 的所有这些连接命令。始终具有相同的结果:使用 IP 有效,使用 mongo 进行 dns 解析无效。

作为测试,我复制了完全相同的 pod/service 配置,但使用了 nginx 服务器而不是 mongodb:

...
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx
  namespace: debug-mongo
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: debug-mongo
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80

curl nginx:80returns默认nginx页面成功。

好吧忘记之前说的了。您需要将服务 clusterIP 设置为 none.

spec:
  clusterIP: None

具有集群 ip 的 K8s 服务就像负载均衡器一样,mongo 不能像我想的那样工作。