flannel的網絡插件配置
Kubernetes網絡通信需要解決以下問題:
(1)容器間通信:同一個Pod內的多個容器間的通信,lo
(2)Pod通信:Pod IP <-直達-> Pod IP
(3)Pod與Service通信:Pod IP <--> Cluster IP
(4)Service與集群外部客戶端的通信;(ingress、nodeport、loadbalancer)
kubernetes集群內的網絡需要借助網絡插件來解決;
CNI:(Container Network Interface)常用的網絡插件有:
flannel (部署簡單,支持網絡地址分配,但不支持網絡策略)
calico (部署麻煩,支持網絡地址分配,也支持網絡策略,而且支持基於BGP協議實現三層網絡路由)
canel (flannel與calico的組合)
kube-router (由kubernetes研發的網絡插件)
...
我們可以使用flannel的網絡分發,需要時也可以借助calico的網絡策略。flannel+calico
解決方案:
虛擬網橋:網絡疊加方式實現通信;
多路復用: MacVLAN(基於MAC方式創建vlan,為每個虛擬接口分配一個獨有的mac地址,使得一個物理網卡等承載多個容器。這樣一來,容器就直接使用物理網卡,並基於物理網卡中的mac實現跨節點通信)
硬件交換:SR-IOV(一個網卡,支持能直接在物理機上虛擬出多個接口)
把網絡配置文件放在/etc/cni/net.d/目錄下,就可以被kubelet識別加載為網絡插件使用;
flannel支持多種后端:
VxLAN:虛擬擴展局域網
(1)VxLAN 報文封裝
flannel默認使用VxLAN方式來作為后端網絡傳輸方式的;
VxLAN:使用網絡疊加方式,通過隧道(主機網卡中的flannel.x,默認為10.244.0.0 255.255.255.255)專門封裝隧道協議報文的,而且一旦后端存在被分配到網絡地址的pod時,會創建一個cni接口,而且cni的網絡地址與flannel在同一網段。可以理解為類似於四層隧道的協議。
VxLAN因為要進行封裝多層報文,是額外開銷,所以使得性能相對於其他方式較弱一點,但好在可以單獨管理一個網絡,而且物理網絡之間是彼此不相干擾的。
(2)Directrouting 直接路由
若集群過於龐大,則避免不了跨網段通信,或者既想使用VxLAN可以跨網段的特性,又想host-gw的高性能,我們可以設置為Directrouting,使其同網段的用host-gw,不同網段的自動使用VxLAN網絡疊加。
Host-gw:host Gateway主機網關
把主機自己的網絡接口當作網關使用,使Pod的網絡地址能通過此接口對外進行傳遞信息。
報文通過路由到達對方,而不會通過隧道網絡疊加,所以這種比VxLAN性能高一點。
但是這種方式要求個節點必須工作在同一網絡中。
UDP:性能比以上都弱一點。
我們也可以將flannel配置為VxLAN + Directrouting方式,若請求端和回應端在同網段,則使用直接路由模式,若不同網段,則自動降級為VxLAN模式。
flannel的配置參數:
Network:flannel使用CIDR格式的網絡地址,用於為Pod配置網絡功能;
10.244.0.0/16 ->
master:10.244.0.0/24
node01:10.244.1.0/24
...
node255:10.244.255.0/24
10.0.0.0/8
10.0.0.0/24
...
10.255.255.0/24
SubnetLen:把network切分子網絡供各節點使用,使用多長的掩碼進行切分,默認為24位;
SubnetMin:10.244.10.0/24 表示最小限制,10之前的地址不可以被分配使用;
SubnetMax:10.244.100.0/24 表示最大限制,100之后的地址不可以被分配使用;
Backend:VxLan,host-gw,udp
Vxlan:Vxlan,Directrouting
例:修改flannel的工作模式為VxLAN+Directrouting
注意:若要使修改生效,必須重裝flannel插件,此修改最好在搭建K8S集群時做修改,不要在集群使用中做修改,否則會影響到所有使用flannel的后端客戶端無法通信。
1.找到flannel的configmap,查看當前flannel的工作模式:
1 kubectl get cm kube-flannel-cfg -n kube-system -o yaml 2 找到如下段: 3 net-conf.json: | 4 { 5 "Network": "10.244.0.0/16", 6 "Backend": { 7 "Type": "vxlan" 8 }
通過在node節點查看路由:
1 [root@k8s-node1 ~]# ip route show 2 default via 192.168.1.1 dev ens33 proto static metric 100 3 10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink 4 10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 5 10.244.2.0/24 dev cni0 proto kernel scope link src 10.244.2.1 6 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 7 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.103 metric 100
可以看到,10.244.0.0<-->10.244.1.0是通過flannel.1網卡通信,不管是同網段還是不同網段,顯然是通過隧道封裝過的。
2.卸載flannel插件,修改配置清單的net-conf.json段,加入Directrouting
1 net-conf.json: | 2 { 3 "Network": "10.244.0.0/16", 4 "Backend": { 5 "Type": "vxlan", 6 "Directrouting": true #默認沒有這段,若要修改,必須重裝flannel插件!!! 7 }
3.部署修改過的flannel插件:
kubectl apply -f kube-flannel.yaml
4.查看節點路由表:
1 ip route show 2 default via 192.168.1.1 dev ens33 proto static metric 100 3 10.244.0.0/24 via 192.168.1.100 dev ens33 4 10.244.1.0/24 via 192.168.1.102 dev ens33 5 10.244.2.0/24 dev cni0 proto kernel scope link src 10.244.2.1 6 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 7 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.103 metric 100
可以看出,10.244.0.0<-->10.244.1.0是通過宿主機網卡ens33通信的,明顯看出是直接路由,同網段的用cni0接口直接轉發,不同網段用ens33接口直接路由。
5.也可以用tcpdump進行抓包進行查看:
tcpdump -i 宿主機網口名稱 -nn
若要改為host-gw模式的話,只需將net-conf.json段的type改為host-gw即可,不過也要重裝flannel插件,建議部署集群時應慎重考慮要使用哪種模式。
注:host-gw不支持與Directrouting同時工作。