网络栈
一个进程发起和响应网络环境(网络栈)
网卡
回环设备
路由表
iptables规则
kubernetes-cni包
在宿主机上安装CNI插件所需要的基础可执行文件(/opt/cni/bin)
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 插件会通过Infra容器的 Network Namespace 文件,进入到这个Network Namespace 里面,然后创建一对 Veth Pair 设备.
紧接着,它会把这个 Veth Pair 的其中一端,“移动”到宿主机上 等于在容器中执行
第三步: CNI bridge 插件就可以把 vethb4963f3 设备连接在 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网卡上,同时为容器设置默认路由
第五步: CNI bridge 插件会为CNI 网桥添加IP地址.这相当于在宿主机上执行
最后一步: 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规则
当一个 IP 包通过网卡进入主机之后,它就进入了Netfilter 定义的流入路径(Input Path)里 在路由之前,Netfilter设置了一个叫PREROUTING的检查点