当前位置 : 主页 > 手机开发 > harmonyos >

k8s的网络模型和CNI插件

来源:互联网 收集:自由互联 发布时间:2023-08-26
网络栈 一个进程发起和响应网络环境(网络栈) 网卡 回环设备 路由表 iptables规则 kubernetes-cni包 在宿主机上安装CNI插件所需要的基础可执行文件(/opt/cni/bin) flannel项目对应的cni插件已经被

网络栈   

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

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

     

k8s的网络模型和CNI插件_Pod

  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插件_检查点_02

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

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

       

k8s的网络模型和CNI插件_IP_03

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

       

k8s的网络模型和CNI插件_IP_04

  在将 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插件_IP_05

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

k8s的网络模型和CNI插件_Pod_06

最后一步: 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插件_Pod_07

 

       当一个 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插件_IP_08

上一篇:Centos7 rsync+inotify实现实时同步更新
下一篇:没有了
网友评论