Kubernetes中的CNI和CSI插件相关知识简介

CNI插件相关知识简介

CNI(Container Network Interface, 容器网络接口)是K8S定义的进行容器网络配置的接口标准。CNI插件是指符合CNI标准的网络配置工具。

CNI插件是K8S插件系统中数量最多、实现花样最多的插件类型。

K8S如何调用CNI插件?

用户配置

  1. 在节点的/etc/cni/net.d/xxnet.conf中写上CNI插件的配置信息
  2. 将CNI插件配置工具(可执行文件)放入节点的/opt/cni/bin/xxnet
  3. 启动CNI插件后台程序

K8S调用

  1. 用户创建了Pod,这个Pod被K8S调度到了当前节点
  2. Kubelet创建了Pod中要求的容器
  3. Kubelet按照/etc/cni/net.d/xxnet.conf中的配置信息和CNI标准定义的方式执行CNI插件(输入“你应该把网络配置成什么样”)
  4. CNI插件执行网络配置过程

CNI插件如何运行?

给Pod“插网线”:CNI插件配置工具配置Pod的网卡和IP

  1. 创建虚拟网卡
    • 通常使用veth-pair,一端在Pod的Network namespace中,一端在根namespace中(相关介绍见Network namespace
  2. 给Pod分配集群中唯一的IP地址
    • 通常把Pod网段按Node分段,每个Pod再从Node网段中分配IP
  3. 给Pod配置上分配的IP和路由
    • 将分配到的IP配置到Pod的网卡上
    • 再Pod的网卡上配置集群网段的路由表
    • Node上Pod的对端网卡配置IP地址路由表
  4. 将Pod和分配的IP反馈给K8S

给Pod“连网络”:CNI插件后台程序维护集群内部的转发规则

  1. CNI Daemon进程获取到集群中所有的Pod和Node的IP地址
    • 监听K8S APIServer获取Pod和Node的网络信息
  2. CNI Daemon进程配置网络打通Pod间的IP访问
    • 创建到所有Node的通道,有三种方法:
      • 靠隧道进行通信,即控制Node组建Overlay
        • 所有流量都通过隧道到达其他Node
        • 不依赖底层网络
        • 协议转换很耗时,效率低
      • 靠路由进行通信(例:VPC路由表)
        • CNI插件直接控制网络中的路由器写路由表实现Node间的连通
        • 部分依赖底层网络,要求CNI插件有直接控制网络中路由器的能力
        • 标准的TCP/IP协议实现,速度中等
      • 靠底层网络进行通信(例:BGP路由)
        • CNI插件直接控制底层网络的转发规则实现Node间的连通
        • 完全依赖底层网络
        • 底层协议甚至可以是定制的协议,效率最高
    • 根据上一步获取的Pod和Node的网络信息将Pod的IP与通道相关联
      • Linux路由(最常见)、FDB转发表、OVS流表等

CSI插件相关知识简介

CSI(Container Storage Interface, 容器存储接口)是K8S定义的进行容器存储配置的接口标准。CSI插件是指符合CSI标准的存储配置工具。

CSI支持目前主流的大多数存储方案,包括Local等各种本地存储方案和NFS等网络存储方案。

CSI之前的容器存储配置方式:FlexVolume

FlexVolume插件也定义了一组用于进行存储配置的接口,它的运行方式与CSI有所不同:

  • 用户安装:将FlexVolume可执行文件放入指定位置(默认位于/usr/libexec/kubernetes/kubelet-plugins/volume/exec
    • FlexVolume插件本质上是一个存在于Node宿主机空间中的可执行文件
  • K8S调用:当有配置存储的请求到达Node时,kubelet会按照FlexVolume标准定义执行指定的插件,由插件完成容器的存储配置
    • FlexVolume插件的调用本质上是在Node宿主机空间中运行一个指令(程序)
    • FlexVolume标准本质上是对运行指令时的命令行输入格式的规定

FlexVolume的缺点:

  • 在宿主机上运行的指令必然存在需要在宿主机上安装依赖的情况,这些依赖可能会对Node中运行的容器产生不好的影响
  • FlexVolume只能在K8S中用,但是世界上不只有K8S一种编排系统
  • FlexVolume的设计没有考虑容器化部署

CSI特点

  • 不止适用于K8S,在Swarm和Mesos等编排系统里面也能用
  • 纯容器化部署

猜你喜欢

转载自blog.csdn.net/weixin_54707168/article/details/113422084