k8s series 20: 网络插件

255 阅读2分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」。

网络插件

kubenetes中有以下两个风格的网络插件:

  • CNI 插件
  • Kubenet插件

CNI插件

CNI 全名是容器网络接口(Container Network Interface),是kubernetes中的一种网络插件标准

当前CNI最新版本为v1.0.1 当前kubernetes遵循的CNI版本的是v0.4.0(同样兼容v0.4.0以下)

CNI官网: github.com/containerne…

CNI只关心容器的网络连接和删除容器时删除分配的资源

目前比较流行的和正在使用基本都是 实现了CNI的网络接口,比如: calico,flannel

kubelet使用网络插件

  1. kubelet使用命令行选项--network-plugin=cni选择CNI插件

  2. kubelet从--cni-conf-dir 读取配置文件并使用配置内容来设置各个pod的网络,如果使用kubeadm安装,配置文件路径: /etc/cni/net.d

image.png

图为使用的calico网络插件

查看插件配置详情: cat /etc/cni/net.d/10-calico.conflist

image.png

可以看到网络插件使用的cni版本,插件类型,并且支持流量控制(bandwidth),支持主机端口(portmap)

  1. kubelet必须的CNI插件存在于--cni-bin-dir(默认/opt/cni/bin)目录中,这是k8s安装好后默认支持的第三方网络插件

image.png

kubenet插件

Kubenet插件:实现了基本的cbr0使用bridge和host-local CNI插件

kubenet是一个非常简单和基本的网络插件,仅支持linux。它本身并不实现更高级的功能,如跨节点网络或网络策略。它通常与为节点之间或单节点环境中的通信设置路由规则的云提供商一起使用。

kubenet使用和CNI有些相似,都是指定-network-plugin等参数启动,不同的是kubenet会创建cbr0网桥,还可以指定mtu

平时我们在管理kubernetes集群时,一般不会使用,还是以CNI插件为主

容器网络创建流程

kubelet调用CNI构建容器网络步骤:

  1. kubelet通过CRI(容器运行时接口)创建pause容器(对应pod),然后生成network namespace
  2. kubelet根据启动参数调用网络插件(-network-plugin,--cni-conf-dir等等)
  3. kubelet调用网络插件命令(/opt/cni/bin)配置pause容器网络
  4. CRI创建pause对应的pod容器,kubelet将pod网络配置到pause网络命名空间

参考

kubernetes.io/docs/concep…

kubernetes.io/zh/docs/con…

kubernetes.io/zh/docs/con…