k8s的网络模型和CNI插件

网络栈   

   一个进程发起和响应网络环境(网络栈)
   网卡
   回环设备
   路由表
   iptables规则

   kubernetes-cni包
      在宿主机上安装CNI插件所需要的基础可执行文件(/opt/cni/bin)

     k8s的网络模型和CNI插件

  flannel项目对应的cni插件已经被内置了 无需单独安装
      weave calico等安装插件的时候必须把对应的CNI插件的可执行文件拷贝到/opt/cni/bin下

 

k8s的cni(flannel)插件的安装
   网络方案的本身
      创建和配置网络设备 如网桥等
      配置宿主机路由表
      配置ARP表和FDB表
  网络对应的CNI插件
      配置Infra容器的网络栈 并把容器连接到CNI网桥上

 

CNI插件的工作原理

     kubelet创建Pod的时候,第一个创建的一定是Infra容器 创建并启动容器后就会
     为CNI插件准备参数,然后调用CNI插件(/opt/cin/bin下的可执行文件)配置容器网络栈

     CNI插件参数的组成
       1.设置CNI的环境变量CNI_COMMAND 只有ADD和DEL
          ADD的含义是把容器添加到CNI网络里
          DEL的含义是把容器从CNI网络里移除
      2.设置CNI的环境变量CNI_ARGS
         通过这个参数以key-value的格式传递自定义信息给网络插件是用户实现自定义CNI协议的重要方法
      3.从CNI配置文件中加载自己的默认插件的配置信息

    有了这两部分参数,接下来 CNI bridge 插件就可以“代表”Flannel,进行“将容器加入到 CNI 网络里”这一步操作了.而这一部分内容,与容器 Network Namespace密切相关      第一步:CNI bridge插件检查宿主机上CNI网桥是否存在 如果没有就创建一个         k8s的网络模型和CNI插件

  第二步:  CNI bridge 插件会通过Infra容器的 Network Namespace 文件,进入到这个Network Namespace 里面,然后创建一对 Veth Pair 设备.

                紧接着,它会把这个 Veth Pair 的其中一端,“移动”到宿主机上 等于在容器中执行

       k8s的网络模型和CNI插件

第三步: CNI bridge 插件就可以把 vethb4963f3 设备连接在 CNI 网桥上 

       k8s的网络模型和CNI插件

  在将 vethb4963f3 设备连接在 CNI 网桥之后,CNI bridge 插件还会为它设置 Hairpin Mode(发夹模式)这是因为,在默认情况下,网桥设备是不允许一个数据包从一个端口进来后,再从这个端口发出去的.但是,它允许你为这个端口开启 Hairpin Mode,从而取消这个限制

 Flannel 插件要在 CNI 配置文件里声明 hairpinMode=true 这样,将来这个集群里的 Pod 才可以通过它自己的 Service 访问到自己

 

第四步:CNI bridge 插件会调用 CNI ipam 插件,从 ipam.subnet 字段规定的网段里为容器分配一个可用的 IP 地址.然后,CNI bridge 插件就会把这个 IP 地址添加在容器的eth0网卡上,同时为容器设置默认路由

k8s的网络模型和CNI插件

第五步: CNI bridge 插件会为CNI 网桥添加IP地址.这相当于在宿主机上执行

k8s的网络模型和CNI插件

最后一步: CNI 插件会把容器的IP地址等信息返回给 dockershim,然后被 kubelet 添加到 Pod 的 Status 字段

 

kubernetes网络隔离机制

    Pod默认都是“允许所有”(Accept All)的,即:Pod可以接收来自任何发送方的请求;或者,向任何接收方发送请求

    一旦Pod被NetworkPolicy 选中,那么这个Pod就会进入“拒绝所有”(Deny All)的状态,即:这个Pod既不允许被外界访问,也不允许对外界发起访问

   而NetworkPolicy定义的规则,其实就是“白名单”.例如,在我们上面这个例子里,我在 policyTypes 字段,定义了这个NetworkPolicy的类型是ingress和 egress,即:它既会影响流入(ingress)请求,也会影响流出(egress)请求

    凡是支持NetworkPolicy的CNI网络插件,都维护着一个NetworkPolicy Controller,通过控制循环的方式对NetworkPolicy 对象的增删改查做出响应,然后在宿主机上完成iptables规则的配置工作

iptables规则

      iptables 只是一个操作 Linux 内核 Netfilter 子系统的“界面”.顾名思义,Netfilter 子系统的作用,就是 Linux 内核里挡在“网卡”和“用户态进程”之间的一道“防火墙"       k8s的网络模型和CNI插件

 

       当一个 IP 包通过网卡进入主机之后,它就进入了Netfilter 定义的流入路径(Input Path)里 在路由之前,Netfilter设置了一个叫PREROUTING的检查点

       iptables 表的作用,就是在某个具体的“检查点”(比如 Output)上,按顺序执行几个不同的检查动作(比如,先执行 nat,再执行 filter)         PREROUTING INPUT FORWARD OUTPUT POSTROUTING 是链(检查点)        nat filter 是表        一个IP包的流动过程:          1.经过PREROUTING的检查点          2.根据路由表进行判断          两种情况:             1.经过INPUT检查点把IP包通过传输层进入到用户空间,交给用户进程处理用户进程通过本机发出返回的IP包经过路由表然后再经过OUTPUT检查点             2.IP 包不会进入传输层,而是会继续在网络层流动,从而进入到转发路径Forward Path.在转发路径中,Netfilter会设置一个名叫FORWARD检查点               而在 FORWARD“检查点”完成后,IP 包就会来到流出路径.而转发的 IP 包由于目的地已经确定,它就不会再经过路由,也自然不会经过 OUTPUT,而是会直接来到 POSTROUTING“检查点”          以上两条路径的IP最终都要经过POSTROUTING检查点才能到达网卡向外发送出去       k8s的网络模型和CNI插件
上一篇:【汇智学堂】docker网络管理之一


下一篇:设计模式-08桥接模式(Bridge Pattern)