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
10.244.0.0/ via 10.244.0.0 dev flannel. onlink
10.244.1.0/ via 10.244.1.0 dev flannel. onlink
10.244.2.0/ dev cni0 proto kernel scope link src 10.244.2.1
172.17.0.0/ dev docker0 proto kernel scope link src 172.17.0.1
192.168.1.0/ dev ens33 proto kernel scope link src 192.168.1.103 metric

可以看到,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
10.244.0.0/ via 192.168.1.100 dev ens33
10.244.1.0/ via 192.168.1.102 dev ens33
10.244.2.0/ dev cni0 proto kernel scope link src 10.244.2.1
172.17.0.0/ dev docker0 proto kernel scope link src 172.17.0.1
192.168.1.0/ dev ens33 proto kernel scope link src 192.168.1.103 metric

可以看出,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同时工作。

k8s的flannel网络插件配置的更多相关文章

  1. Flannel网络插件配置

    # ps -ef|grep docker|grep bip FLANNEL_OPTIONS="-ip-masq=true" -ip-masq=true 这个参数的目的是让flann ...

  2. Kubernetes1.91(K8s)安装部署过程(五)--安装flannel网络插件

    node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,版本是0.7.1. 1.安装flannel插件: 注意是2个node节点都需要安装,都需要修改 ...

  3. K8S Flannel网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  4. 使用kubeadm安装kubernetes/部署前准备/flannel网络插件/镜像下载/

    本文内容参考<kuberneters进阶实战>/马哥的新书/推荐 部署前的准备 主机名称解析 分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性时为主机提供了固 ...

  5. K8S(03)核心插件-Flannel网络插件

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...

  6. k8s西游记 - 切换网络插件IP池

    前言 最近在另一个k8s集群中,搭建了kong网关,在配置OIDC插件时,希望使用Memcahe代替Cookie来存储会话信息,于是把部署在同一局域网Memcahe的内网IP,比如:192.168.1 ...

  7. 容器编排系统K8s之flannel网络模型

    前文我们聊到了k8s上webui的安装和相关用户授权,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14222930.html:今天我们来聊一聊k8s上的网络 ...

  8. K8s二进制部署单节点 etcd集群,flannel网络配置 ——锥刺股

    K8s 二进制部署单节点 master    --锥刺股 k8s集群搭建: etcd集群 flannel网络插件 搭建master组件 搭建node组件 1.部署etcd集群 2.Flannel 网络 ...

  9. 3.kubernetes的CNI网络插件-Flannel

    目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...

随机推荐

  1. EOS帐户交易的构建命令

    EOS版本:4.0   系统:Ubuntu 16.04 LTS   1.创建两对密匙   cleos create key   Private key:5JeTwSwKfpVRHGLqysakTXfk ...

  2. 如何在JMeter中使用ForEach控制器

    Jmeter中的ForEach Controller遍历变量数组. 在这个JMeter教程中,我们将使用ForEach控制器循环访问JSON数组. 有时我们需要解析响应并提取某些信息.例如,在测试AP ...

  3. bzoj3295: [Cqoi2011]动态逆序对 三维数点

    为了便于考虑,把删除反序变为增加 于是就变成关于权值和位置和时间的三维数点 一波cdq一波树状数组教做人 (神TM需要longlong,80了一发) #include <bits/stdc++. ...

  4. BestCoder Round #81 (div.2) 1003 String

    题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=691&pid=1003题意:找出一个字符串满足至少 ...

  5. Oracle使用SQL语句修改字段类型

    Oracle使用SQL语句修改字段类型 1.如果表中没有数据 Sql代码 1 2 3 alter table 表名 modify (字段名1 类型,字段名2 类型,字段名3 类型.....)  alt ...

  6. NET Core开发

    NET Core开发 Visual Studio 2017 ASP.NET Core开发,Visual Studio 2017 已经内置ASP.NET Core 开发工具. 在选择.NET Core ...

  7. 在Eclipse下搭建Hadoop开发环境

    在前面的博文中博主展示了如何在虚拟机中搭建Hadoop的单节点伪分布集群,今天给大家介绍一下如何在Eclipse环境中搭建Hadoop的管理和开发环境,话不多说,下面我们就进入正题吧! 1.JDK安装 ...

  8. Unity注入

    [此文引用别人,作为随笔自己看.]今天写<WCF技术剖析(卷2)>关于<WCF扩展>一章,举了“如何通过WCF扩展实现与IoC框架(以Unity为例)集成”(<通过自定义 ...

  9. iOS使用TestFlight进行内部和外部人员测试

    前言 在iOS 8中,苹果发布了一个叫做TestFlight的新玩意,用于将Beta测试流水化.此前你可能听说过这个东西,因为TestFlight作为一个独立的测试平台已经有些年头了.被苹果收购之后用 ...

  10. css3背景与边框相关样式

    background-attachment          背景图像是否固定或者随着页面的其余部分滚动 background-color                    设置元素的背景颜色 b ...