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地址。



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