• k8s的flannel网络插件配置


    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的工作模式:    

    kubectl get cm kube-flannel-cfg -n kube-system -o yaml
               找到如下段:
               net-conf.json: |
                    {
                        "Network": "10.244.0.0/16",
                        "Backend": {
                            "Type": "vxlan"
                    }

                通过在node节点查看路由:

    [root@k8s-node1 ~]# ip route show
                    default via 192.168.1.1 dev ens33 proto static metric 100
                    10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink
                    10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink
                    10.244.2.0/24 dev cni0 proto kernel scope link src 10.244.2.1
                    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
                    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

    net-conf.json: |
                    {
                        "Network": "10.244.0.0/16",
                        "Backend": {
                            "Type": "vxlan",
                            "Directrouting": true  #默认没有这段,若要修改,必须重装flannel插件!!!
                    }

            3.部署修改过的flannel插件:
                    kubectl apply -f kube-flannel.yaml
            4.查看节点路由表:

    ip route show
                    default via 192.168.1.1 dev ens33 proto static metric 100
                    10.244.0.0/24 via 192.168.1.100 dev ens33
                    10.244.1.0/24 via 192.168.1.102 dev ens33
                    10.244.2.0/24 dev cni0 proto kernel scope link src 10.244.2.1
                    172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
                    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同时工作。

    参考:

    https://www.cnblogs.com/Smbands/p/10926996.html

    https://blog.csdn.net/weixin_30783913/article/details/97591382

    https://www.e-learn.cn/content/qita/2588917

  • 相关阅读:
    关于App_Offline.htm的应用实例(及CIM_DataFile的用法)注意Windows下
    Office2007多个文档打开时,开启多个窗口(独立进程)
    Asp.Net环境下web Pages,web Forms 及MVC的优越及缺点
    批量生成表Create SQL 示例 Generate SQL Create Scripts for existing tables with Query
    Different between datetime and timestamp, and its setting
    SqlConnection ,SqlTransaction,SqlCommand的常用法
    ASP.NET下从Server端下载文件到Client端C#
    C#中Remote文件复制简例子
    DOS BAT用法简例子
    改善SQL Procedure性能的几点方法
  • 原文地址:https://www.cnblogs.com/sandshell/p/11771616.html
Copyright © 2020-2023  润新知