Container Network interface (CNI)github repo是CNCF定义的container网络接口标准。它定义有关container之间的互联,container删除后资源的释放等。

K8s也采用了CNI标准,可以驱动符合CNI标准的插件。插件有个参考实现github repo

CNI spec link

网络被定义为一组addressable的entities。可以是container,machine,和其他网络设备比如router。

Note: 容器runtime是一个比较宽的说法,docker自称为容器platform

容器runtime去创造网络namespace
定义容器属于哪个网络,执行哪个plugin。

容器runtime顺序执行如下(sequential):运行plugin把container加入一个网络
当container生命结束时,容器runtime,反向执行前面的顺序,把container从网络中disconnect(断连接)。

执行步骤对单个容器是顺序的,不能并行。但多个container之间可以并行。

ADD和DEL操作必须in order。ADD最终必须跟着一个DEL(注:是指资源回收吗?)。DEL后面跟DEL是允许的,多次DEL操作是等价的,idempotent(达成同一状态,好像中文叫幂等)

ADD是把容器加入/插入网络,DEL是把容器从网络删除/拔除。(插入INFNAME,比如cni0)

容器有一个ID,containerID,plugin记录为<network name, CNI_CONTAINERID, CNI_IFNAME>

容器Runtime对同一个上述记录不能call ADD两次(如果没有DEL在中间)。可以加两个不同的IFNAME。

容器网络namespace

container network namespace ---------veth-------------- host (bridge)

  1. ADD IF
  2. assign IP with IPAM (IP address management)
  3. setup routes

<intf list, IP list, DNS info> ADD(containerID, networkNamespacePath=/proc/pid/ns/net, networkConfigurationFile, extraArgs, nameOfIntfInsideContainer=“emexa”)

DEL(containerID, networkNamespacePath=/proc/pid/ns/net, networkConfigurationFile, extraArgs, nameOfIntfInsideContainer=“emexa”)
// 参数和ADD相同

Under /opt/cni/bin
CNI插件是一个Binary (e.g, flannel), 网络组件是另外的(bridge, ipvlan, loopback, macvlan, ptp, vlan, etc),IPAM是另外的Binary (dhcp)。插件会调用IPAM的binary。

cni0网桥,代替了docker0网桥

POD1 (10.244.0.5) -> POD2 (10.244.1.6)
| ^
v |
flannel.1 ---- tunnel overlay ----> flannel.1

Logo

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

更多推荐