CNI 和 CNM
都是针对容器网络的解决方案

  • CNM: Docker 公司(docker container runtime 背后的公司)提出
  • CNI:CoreOS公司提出,项目被接纳托管到 CNCF

CNM

docker默认网络模式

  • host:共享主机网络Network namespace
  • bridge:桥接主机网卡
  • none:容器有独立的Network namespace,但是没有网络配置(常用测试使用)

这样的几种网络方式是无法满足容器互联需求的

CNM定义
Libnetwork是CNM的原生实现。它为Docker daemon和网络驱动程序之间提供了接口。网络控制器负责将驱动和一个网络进行对接。每个驱动程序负责管理它所拥有的网络以及为该网络提供的各种服务
在这里插入图片描述
几个重要的名词解释

  • Sandbox:Sandbox包含了一个容器的网络栈。包括了管理容器的网卡,路由表以及DNS设置。一种Sandbox的实现是通过linux的网络命名空间,一个FreeBSD Jail 或者其他类似的概念。一个Sandbox可以包含多个endpoints
  • Endpoint:一个endpoint将Sandbox连接到network上。一个endpoint的实现可以通过veth pair,Open vSwitch internal port 或者其他的方式。一个endpoint只能属于一个network,也只能属于一个sandbox
  • Network:一个network是一组可以相互通信的endpoints组成。一个network的实现可以是linux bridge,vlan或者其他方式。一个网络中可以包含很多个endpoints
    在这里插入图片描述CNI
    CNI是网络模型,定义了容器网络的标准,而实现是交给网络插件来完成,那么就涉及到2个组件:容器管理系统和网络插件,他们之间通过JSON格式的文件通讯,实现网络功能

网络插件分类

  • main:二进制文件,比如birdge就是创建Linux网桥的程序、ptp就是创建Veth Pair设备的程序、loopback就是创建lo设备的程序等等
  • ipam:实现IP地址的管理,负责分配IP地址的程序文件,比如dhcp就是会向DHCP服务器发起地址申请、host-local就是会使用预先设置的IP地址段来进行分配
  • meta:这个是由CNI社区维护的,比如flannel就是为Flannel项目提供的CNI插件,不过这种插件不能独立使用,必须调用Main插件使用(实现网络通讯)
    在这里插入图片描述

kubelet启动的命令中有如下参数

  • –cni-bin-dir:用于搜索CNI插件目录,默认/opt/cni/bin
  • –cni-conf-dir:用于搜索CNI插件配置文件路径,默认是/etc/cni/net.d
  • –network-plugin:要使用的CNI插件名,默认为docker自带的cnm(或者是cni)

配置cni+flannel

配置基于之前写的部署flannel,过程就省掉了部署flannel(区别是cnm改成cni而已)

在这里插入图片描述

  • cnm插件基于docker0虚拟网卡,而cni是基于单独的创建的,名称是配置文件里自定义的
  • flannel支持的2种模式:vxlan和host-gw
    • vxlan:实现大二层,基于ip建立隧道
    • host-gw:直接网关路由转发

kubelet配置

--cni-bin-dir=/opt/cni/bin \
--cni-conf-dir=/etc/cni/net.d \
--network-plugin=cni \

下载cni文件,解压到/opt/cni/bin

wget https://github.com/containernetworking/plugins/releases/download/v0.9.0/cni-plugins-linux-amd64-v0.9.0.tgz
mkdir -p /opt/cni/bin
tar -zxf cni-plugins-linux-amd64-v0.9.0.tgz  -C /opt/cni/bin

创建cni配置文件

mkdir -p /etc/cni/net.d
cat /etc/cni/net.d/10-flannel.conf 
{
  "name": "cni0",
  "type": "flannel",
  "subnetFile": "/run/flannel/subnet.env",
  "delegate": {
    "hairpinMode": true,
    "isDefaultGateway": true
  }
}

在这里插入图片描述cnm遗留问题
由于之前我是cnm插件,所以需要把docker的IP地址改掉,不然路由存在问题了,或者需要flanel重新生成一个子网
在这里插入图片描述

地址随便写一个,不冲突就行

重启服务,查看服务是否正常

systemctl restart docker.service
systemctl restart kubelet.service
kubectl get nodes -o wide
#查看节点状态是否是Ready 

参考:https://www.cni.dev/plugins/
参考:https://www.cnblogs.com/rexcheny/p/10960233.html

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐