那运行在kubernetes/openshift中的pods呢? 一个pod是由一组相关的容器组成,pod中的容器共享网络接口/hostname;两个容器(两个进程)可以使用“localhost”交流。
OpenShift通过OpenShift-SDN组件保证了集群中在同一个namespace下的所有pods可以相互访问到,即使运行在不同的主机上。主要有两大特点:1. 所有namespaces下的所有pods在同一个网络中可以看见对方。2. 每一个namespace可以表现为一个私有网络(即多租户)
OpenShift SDN 按照RFC1918 分配/16私有子网空间(默认10.1.0.0/16)作为集群网络。在集群网络中每个node节点分配/24大小的ip地址空间给node节点上的pods。每个node自己分配一个网关地址(例如10.1.x.1),子网的广播地址(10.0.x.255)不能分配给node或者pod。意味着在默认配置下OpenShift集群中最多有256个node节点以及每个node节点最多254个pod。
子网建立之后,docker复制分配ip地址给pods,OpenShift然后查询那个ip地址被分配了并且从Ibr0网桥上启动pod的vethxxxx 虚拟网络设备,最后链接到名为br0的OpenVSwitch网桥
br0通过虚拟网络设备对“vovsbr”和“vlinuxbr”跟Ibr0相连接,进而能够跟通过docker命令启动的docker容器通信。同时通过tun0连接node的host网络进而能够访问外网,tun0扮演了OpenShift集群中所有pods网关的角色。Ibr0扮演了单独docker容器网关的角色。所以它们都被分配到了node几点子网默认网关ip地址。但是并不产生冲突,因为容器和pods分别只能看到属于它们自己的Ibr0和tun0网关。
网络配置如果多租户SDN 被选中,所有的网络包通过内核的openflow data path 被标记上VNID从而被隔离成不用的namespace
同一个pod中两个容器:Pod lo → Pod lo
同一个node上的不同 :PodA eth0 → vethXXXX → (ovs) br0 → vethYYYY → PodB eth0
同一个node上pod到普通docker容器:Pod eth0 → vethXXXX → ovs br0 → vovsbr → vlinuxbr → lbr0 → vethYYYY → Container eth0
同一个node上普通docker容器到pod:Container eth0 → vethXXXX → lbr0 → vlinuxbr → vovsbr → br0 → vethYYYY → Pod eth0
pod访问外网:Pod eth0 → vethXXXX → (ovs) br0 → tun0 → (IPTables NAT) → host network
通过端口绑定实现外网访问pod:host network → IPTables DNAT → tun0 → (ovs) br0 → vethXXXX → Pod eth0
(通用的做法是用OpenShift Router 实现入口流量)
主机上通过ip a查看网络信息
[root@openshift ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
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: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:12:96:98 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
valid_lft 77432sec preferred_lft 77432sec
inet6 fe80::a00:27ff:fe12:9698/64 scope link
valid_lft forever preferred_lft forever
3: ovs-system: mtu 1500 qdisc noop state DOWN
link/ether 0e:49:a7:f2:e2:7b brd ff:ff:ff:ff:ff:ff
5: br0: mtu 1450 qdisc noop state DOWN
link/ether ae:5f:43:6d:37:4d brd ff:ff:ff:ff:ff:ff
7: lbr0: mtu 1450 qdisc noqueue state UP
link/ether 8a:8a:b7:6b:5b:50 brd ff:ff:ff:ff:ff:ff
inet 10.1.0.1/24 scope global lbr0
valid_lft forever preferred_lft forever
inet6 fe80::d8a0:74ff:fe19:d4be/64 scope link
valid_lft forever preferred_lft forever
8: vovsbr@vlinuxbr: mtu 1450 qdisc pfifo_fast master ovs-system state UP
link/ether 76:49:cc:f0:08:42 brd ff:ff:ff:ff:ff:ff
inet6 fe80::7449:ccff:fef0:842/64 scope link
valid_lft forever preferred_lft forever
9: vlinuxbr@vovsbr: mtu 1450 qdisc pfifo_fast master lbr0 state UP
link/ether 8a:8a:b7:6b:5b:50 brd ff:ff:ff:ff:ff:ff
inet6 fe80::888a:b7ff:fe6b:5b50/64 scope link
valid_lft forever preferred_lft forever
10: tun0: mtu 1450 qdisc noqueue state UNKNOWN
link/ether ca:8e:2f:26:4f:bf brd ff:ff:ff:ff:ff:ff
inet 10.1.0.1/24 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::c88e:2fff:fe26:4fbf/64 scope link
valid_lft forever preferred_lft forever
12: vethd6edc06@if11: mtu 1450 qdisc noqueue master ovs-system state UP
link/ether 0e:04:d8:cd:3c:92 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::c04:d8ff:fecd:3c92/64 scope link
valid_lft forever preferred_lft forever
(5) 是ovs 网桥 br0, (7) 是 docker 网桥lbr0, (8) (9) 是 vovsbr/vlinuxbr peer对 (10) 是 tun0 . 注意: (7) lbr0 (10) tun0 共享相同的ip地址。