如何从本地网络访问Kubernetes NodePort服务?Minikube环境问题求助
我是Kubernetes新手,在CentOS 9上运行Minikube时,无法从本地网络中的其他机器访问已运行的服务。相关配置及信息如下:
1. mongo-express.yaml配置文件
kind: Deployment metadata: name: mongo-express labels: app: mongo-express spec: replicas: 1 selector: matchLabels: app: mongo-express template: metadata: labels: app: mongo-express spec: containers: - name: mongo-express image: mongo-express ports: - containerPort: 8081 env: - name: ME_CONFIG_MONGODB_ADMINUSERNAME valueFrom: secretKeyRef: name: mongodb-secret key: mongo-root-username - name: ME_CONFIG_MONGODB_ADMINPASSWORD valueFrom: secretKeyRef: name: mongodb-secret key: mongo-root-password - name: ME_CONFIG_MONGODB_SERVER valueFrom: configMapKeyRef: name: mongodb-configmap key: database_url --- apiVersion: v1 kind: Service metadata: name: mongo-express-service spec: selector: app: mongo-express type: NodePort ports: - protocol: TCP port: 8081 targetPort: 8081 nodePort: 30000
2. 命令输出
执行minikube service mongo-express-service的输出:
|-----------|-----------------------|-------------|---------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|-----------------------|-------------|---------------------------| | default | mongo-express-service | 8081 | http://192.168.49.2:30000 | |-----------|-----------------------|-------------|---------------------------|
执行kubectl get service的输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d13h mongo-express-service NodePort 10.100.148.37 <none> 8081:30000/TCP 3s mongodb-service ClusterIP 10.105.122.101 <none> 27017/TCP 2m30s
3. 网络接口信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether 94:de:80:b8:24:30 brd ff:ff:ff:ff:ff:ff 3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 94:de:80:b8:24:30 brd ff:ff:ff:ff:ff:ff inet 192.168.0.80/24 brd 192.168.0.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 2601:2c2:502:2f40:d188:581e:2837:cfe7/64 scope global dynamic noprefixroute valid_lft 345587sec preferred_lft 345587sec inet6 fe80::8763:4506:5db7:afaa/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: br-a8f04f55d768: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:f1:0f:7d:cb brd ff:ff:ff:ff:ff:ff inet 192.168.49.1/24 brd 192.168.49.255 scope global br-a8f04f55d768 valid_lft forever preferred_lft forever inet6 fe80::42:f1ff:fe0f:7dcb/64 scope link valid_lft forever preferred_lft forever
Minikube主机的本地IP为192.168.0.80,主机上可以ping通服务地址192.168.49.2,但本地网络中的其他机器无法ping通或访问该服务。
Minikube默认使用Docker驱动时,会创建一个独立的内部网桥(br-a8f04f55d768),对应的网段是192.168.49.0/24,Minikube节点的IP192.168.49.2属于这个内部网段。本地局域网的机器(192.168.0.0/24)没有路由指向这个内部网段,因此无法直接访问192.168.49.2:30000。
方法1:使用Minikube Tunnel暴露服务
Minikube Tunnel可以将NodePort服务转发到主机的公网IP,执行以下命令:
minikube tunnel
执行后,服务会绑定到主机的192.168.0.80IP上,其他机器可以通过http://192.168.0.80:30000访问mongo-express服务。注意这个命令需要保持运行,关闭后转发会停止。
方法2:配置主机端口转发(持久化)
在CentOS 9上使用firewalld配置端口转发,将主机的30000端口转发到Minikube节点的30000端口:
- 启用firewalld的端口转发功能:
sudo firewall-cmd --add-masquerade --permanent
- 添加端口转发规则:
sudo firewall-cmd --add-forward-port=port=30000:proto=tcp:toaddr=192.168.49.2:toport=30000 --permanent
- 重新加载firewalld规则:
sudo firewall-cmd --reload
配置完成后,其他机器可以通过http://192.168.0.80:30000访问服务,这个规则是持久化的,重启后依然有效。
方法3:切换Minikube网络驱动为Bridge
如果希望Minikube节点直接加入本地局域网,可以切换到bridge驱动:
- 先停止当前Minikube集群:
minikube stop
- 删除现有集群(可选,若需保留数据则跳过):
minikube delete
- 用bridge驱动启动Minikube:
minikube start --driver=docker --network=bridge
启动后,Minikube节点会获取本地局域网的IP,此时其他机器可以直接通过该IP的30000端口访问服务。
内容的提问来源于stack exchange,提问作者Hasan Humbatov

