k8s網絡通訊:node
1) 容器間通訊:同一個pod內的多個容器間的通訊,經過lo便可實現;後端
2) pod之間的通訊,pod ip <---> pod ip,pod和pod之間要不通過任何轉換便可通訊;api
3) pod和service通訊:pod ip <----> cluster ip(即service ip)<---->pod ip,他們經過iptables或ipvs實現通訊,另外你們要注意ipvs取代不了iptables,由於ipvs只能作負載均衡,而作不了nat轉換;bash
k8s要靠CNI接口接入其餘插件來實現網絡通信。目前比較流行的插件有flannel,callco,canel,kube-router。網絡
這些插件使用的解決方案都以下:負載均衡
1)虛擬網橋,虛擬網卡,多個容器共用一個虛擬網卡進行通訊;ide
2)多路複用:MacVLAN,多個容器共用一個物理網卡進行通訊;性能
3)硬件交換:SR-LOV,一個物理網卡能夠虛擬出多個接口,這個性能最好。spa
CNI插件存放位置:/etc/cni/net.d/10-flannel.conflist插件
kubeadm部署的k8s集羣的配置文件
[root@k8s-3 ~]# kubectl get configmap -n kube-system NAME DATA AGE coredns 1 14d extension-apiserver-authentication 6 14d kube-flannel-cfg 2 13d kube-proxy 2 14d kubeadm-config 2 14d kubelet-config-1.17 1 14d
flannel只支持網絡通信,可是不支持網絡策略。
callco網絡通信和網絡策略都支持。
canel:flanel+callco合起來的功能。
lannel支持多種後端:
1.Vxlan
1.1 vxlan 默認
1.2 Dirextrouting
2.host-gw:Host Gateway #不推薦,只能在二層網絡中,不支持跨網絡,若是有成千上萬的Pod,容易產生廣播風暴
3.UDP:性能差
兩個節點上的pod能夠藉助flannel隧道進行通訊。默認使用的VxLAN協議,由於它有額外開銷,因此性能有點低。
flannel第二種協議叫host-gw(host gateway),即Node節點把本身的網絡接口當作pod的網關使用,從而使不一樣節點上的node進行通訊,這個性能比VxLAN高,由於它沒有額外開銷。不過他有個缺點, 就是各node節點必須在同一個網段中 ,不建議使用該模式。
另外,若是兩個pod所在節點在同一個網段中 ,可讓VxLAN也支持host-gw的功能, 即直接經過物理網卡的網關路由轉發,而不用隧道flannel疊加,從而提升了VxLAN的性能,這種flannel的功能叫directrouting。
設置flannel的網絡模式:
k8s版本1.7 默認的模式directrouting
[root@k8s-3 ~]# kubectl edit configmap -n kube-system kube-flannel-cfg { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan", "Directrouting":true } }