书籍来源:《Kubernetes网络权威指南:基础、原理与实践》
一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!
附上汇总贴:《Kubernetes网络权威指南》读书笔记 | 汇总_COCOgsta的博客-CSDN博客
Kubernetes支持两种网络驱动,分别是Kubenet和CNI。
3.4.1 即将完成历史使命:Kubenet
Kubenet是Kubernetes早期原生的网络驱动,提供非常简单和基本的单机容器网络能力。
随着CNI的广泛使用,Kubenet正在被慢慢弃用。
3.4.2 网络生态第一步:CNI
CNI是容器网络的标准化,试图通过JSON描述一个容器网络配置。CNI的原理如图3-10所示。
图3-10 CNI的原理
从图3-10中可以看出,CNI是Kubernetes与底层网络插件之间的一个抽象层,为Kubernetes屏蔽了底层网络实现的复杂度,同时解耦了Kubernetes的具体网络插件实现。
CNI主要有两类接口:分别是在创建容器时调用的配置网络接口:
和删除容器时调用的清理网络接口:
不论是配置网络接口还是清理网络接口,都有两个入参,分别是网络配置和runtime配置。runtime配置主要是容器运行时传入的网络namespace信息。
安装CNI
下面举几个CNI网络插件的例子。
host-local&bridge插件
我们定义了一个名为mynet的网络。它是一个bridge模型,而IP地址管理(ipam)使用的是host-local,且可供分配的容器网段是10.10.0.0/16。
在Kubernetes中使用CNI
Kubelet要使用CNI网络驱动需要配置启动参数--network-plugin=cni。Kubelet从--cni-conf-dir(默认为/etc/cni/net.d)中读取文件,并使用该文件中的CNI配置配置每个Pod网络。CNI插件二进制文件所放置的目录通过Kubelet的--cni-bin-dir参数配置,默认为/opt/cni/bin。
下面以Pod带宽控制为例,介绍Kubernetes使用CNI插件的流程。
当书以下Pod配置:
Kubernetes会自动为这个Pod分别限制上传和下载的带宽为1Mb/s。注意,需要自己在/etc/cni/net.d目录下写一个配置文件,例如my-net.conf:
这个配置文件会告诉Kubelet去调用CNI的默认bandwidth插件,然后根据Pod annotation里带宽的ingress/egress值进行容器上行/下行带宽的限制。当然,CNI插件最后调用的还是Linux tc工具,主机上的tc配置如下所示:
Pod带宽控制的底层技术栈如图3-12所示。用户通过Pod的annotations下发带宽限制数值,CNI的bandwidth插件调用Linux流量控制插件tc,在宿主机上应用tc配置。
图3-12 Pod带宽控制的底层技术栈