k8s网络通信:

  1) 容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现;

        2) pod之间的通信,pod ip <---> pod ip,pod和pod之间要不经过任何转换即可通信;

        3) pod和service通信:pod ip <----> cluster ip(即service ip)<---->pod ip,他们通过iptables或ipvs实现通信,另外大家要注意ipvs取代不了iptables,因为ipvs只能做负载均衡,而做不了nat转换;


         k8s要靠CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,callco,canel,kube-router。

这些插件使用的解决方案都如下:

    1)虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信;

    2)多路复用:MacVLAN,多个容器共用一个物理网卡进行通信;

    3)硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好。

 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
        }
    }