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

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同時工作。
                
                
        
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM