OpenShift-sdn网络

在openshift中,如果使用docker 命令启动一个docker容器,容器中的网络没有任何不同;唯一的不同就是docker网络拍的网桥名是ibr0而不是docker0


那运行在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地址。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章