为什么 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


回答:

下面说得都不一定对,因为我也是才学过一点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访问服务了。

以上是 为什么 k8s 暴露的外网 IP 实际都是内网 IP 的全部内容, 来源链接: utcz.com/p/944286.html

回到顶部