具有 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:80
returns默认nginx页面成功。
好吧忘记之前说的了。您需要将服务 clusterIP 设置为 none.
spec:
clusterIP: None
具有集群 ip 的 K8s 服务就像负载均衡器一样,mongo 不能像我想的那样工作。
此问题仅出现在使用默认 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:80
returns默认nginx页面成功。
好吧忘记之前说的了。您需要将服务 clusterIP 设置为 none.
spec:
clusterIP: None
具有集群 ip 的 K8s 服务就像负载均衡器一样,mongo 不能像我想的那样工作。