为什么 k8s 暴露的外网 IP 实际都是内网 IP

按照这个教程:minikube 启动一个 nginx 服务 ,跑了一遍 Nginxk8s 下的用法,但是发现一个问题,就是暴露的外网 IP 实际都是内网 IP。

先这样:

kubectl create deployment hello-nginx --image=nginx:latest

再这样:

kubectl expose deployment hello-nginx --type=NodePort --port=80 --target-port=80

最后这样:

─➤  minikube service hello-nginx                                                                                                                                                                                                                                   1 ↵
|-----------|-------------|-------------|---------------------------|
| NAMESPACE |    NAME     | TARGET PORT |            URL            |
|-----------|-------------|-------------|---------------------------|
| default   | hello-nginx |          80 | http://192.168.49.2:30433 |
|-----------|-------------|-------------|---------------------------|
🎉  正通过默认浏览器打开服务 default/hello-nginx...

可以看到显示的 URL 是 http://192.168.49.2:30433

但是我的路由器给我的 ip 地址是 192.168.31.245, 这样我就不能从其他电脑访问这个 nginx 了,比如通过同一个 wifi 网络下的 192.168.31.203 就访问不了这个 Nginx 服务,怎么办?我应该怎么做?

  • 这个 br-846ee7341a53 是什么?是 docker 干的,还是 k8s 干的?
  • 如果让 192.168.31.203 可以访问到这个 Nginx 服务?
─➤  ip a   
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: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 2c:f0:5d:9a:c8:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.31.245/24 brd 192.168.31.255 scope global dynamic noprefixroute enp34s0
       valid_lft 30463sec preferred_lft 30463sec
    inet6 fe80::a0d2:77cd:73b7:b35a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: wlo1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 44:af:28:ca:f3:91 brd ff:ff:ff:ff:ff:ff
    altname wlp33s0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:30:0b:8c:9f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:30ff:fe0b:8c9f/64 scope link 
       valid_lft forever preferred_lft forever
5: br-57c0fdbc9edd: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:89:12:80:38 brd ff:ff:ff:ff:ff:ff
    inet 172.19.0.1/16 brd 172.19.255.255 scope global br-57c0fdbc9edd
       valid_lft forever preferred_lft forever
    inet6 fe80::42:89ff:fe12:8038/64 scope link 
       valid_lft forever preferred_lft forever
7: br-fe111ffb5f40: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:a5:78:57:1a brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-fe111ffb5f40
       valid_lft forever preferred_lft forever
10: vboxnet0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff
16: veth39ef1e2@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 1a:df:76:70:19:c2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::18df:76ff:fe70:19c2/64 scope link 
       valid_lft forever preferred_lft forever
171: br-846ee7341a53: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:76:2f:7b:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.49.1/24 brd 192.168.49.255 scope global br-846ee7341a53
       valid_lft forever preferred_lft forever
    inet6 fe80::42:76ff:fe2f:7b6b/64 scope link 
       valid_lft forever preferred_lft forever
177: veth7044566@if176: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-846ee7341a53 state UP group default 
    link/ether d6:a3:29:0a:50:ce brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::d4a3:29ff:fe0a:50ce/64 scope link 
       valid_lft forever preferred_lft forever

图片.png

阅读 3k
1 个回答

下面说得都不一定对,因为我也是才学过一点k8s,就当是讨论讨论。。。

  1. 这个br-xxx1a53 是一个桥接的接口(虚拟的网卡),用用来连接本机和docker容器网络的。主要是docker在控制这个桥接接口。

docker在创建网络的时候会生成这个br接口

  1. 其实使用—type=NodePort这个参数就已经是让k8s容器的端口和节点做绑定了。

    现在这里问题就出在minikube上,minikube的节点都在一个docker容器里面,所以对于minikube里面的k8s来说,它的node节点的ip就是所在容器的ip。

所以使用—type=NodePort的时候,minikube把端口绑定在docker容器的IP上了。

如果你不用minikube测试,就自己搭建几个正常的节点,再使用—type=NodePort参数,就能通过node的本机ip访问服务了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题