k8s 中 CNI(容器网络接口) 解析

本贴最后更新于 1657 天前,其中的信息可能已经时过境迁

概念

CNI(Container Network Interface)容器网络接口:是 Kubernetes 提出的一个标准,解决了跨主机网络通信的问题。使用 CNI 的约束:
1.一个 pod 分配一个唯一的 IP, 这个 IP 是整个集群的唯一 IP,这是保障跨主机通讯的前提,一个 pod 一个 IP
2.node 可以访问任何节点 pod,不限于本节点,pod 之间也可以相互访问
3.pod 可以访问所有的 pod

CNI 网络插件实现:路由方案、隧道方案

flannel

vxlan(隧道)、host-gw(路由)、udp(弃用) 。默认使用隧道模式,将数据包二次封装走宿主机的二层网络,然后到达目的网络

image.png

caclio

也同样支持隧道和路由方案:ipip(隧道)、bgp(路由)。默认也使用隧道模式

image.png

模式选择:

取决于当前网络现状,如果在公有云上,那很多公有云会对路由模式有所限制,也就是说如果你用路由模式的话,会在每台 k8s node 机器上写入相应的路由表,而有些云主机是不支持的,会导致云主机无法通信,影响现有的网络,故选择路由模式不可取。

路由方案:对现有网络有要求,性能最好,一般要求二层可达,组件大二层网络
隧道方案:只要三层可达基本都可以通信,基于现有以太网

vxlan 模式介绍:
会在每个节点上创建一个 cni0 网桥,还会创建一个 lannel.1 的隧道端点,主要是对数据包的再次封装,之后传输到目标节点上,也会在每台机器上创建一些路由表

image.png

路由表解释:若数据包的目的 IP 匹配到其中一个 IP 段,则走改条路由表规则,将数据包到达 flannel.1 这里

flannel 和 caclio 网络是相互冲突的,在一个 k8s 集群中一般只有一个 cni 网络组建,所以下面讲解如何将 flannel 切换成 caclio

1.删除 flannel-pod

kubectl delete -f kube-flannel.yaml

上述删除只是将 flannel 的守护进程删除了而已,但是网桥和隧道端点并没有删除,在删除 pod 的时候,pod 之间的网络就已经不通了(若是路由方案的话,还是可以通的)

2.删除 cni0 网桥和 flannel.1 隧道端点

ip link del cni0
ip link del flannel.1

使用以下命令查看网桥,隧道端点和路由表是否删除干净,

ifconfig
ip route

确保网桥,隧道端点和路由表清除干净之后再部署 caclio

3.修改 caclio 网段与当前集群网段一致

下载 caclio.yaml

wget https://docs.projectcalico.org/manifests/calico.yaml

从前面文章可以得出,集群网段为 10.244.0.0/16,所以 calico.yaml 中的网段也需要改成当前网段:
取消前面的注解并将 IP 网段从 192.168 改成 10.244
image.png

在不指定 caclio 工作模式的情况下,默认都是隧道方案,此方案对现有网络的依赖是最小的

image.png

若将 Always 改成 Never,则使用 BGP

保存后执行:

kubectl apply -f caclio.yaml

image.png

使用场景考虑方面

  • 1.集群规模
  • 2.是否需要网络策略(flannel 不支持)
  • 3.现有网络有无限制,包括主机写路由表,bgp 是否可以通信(有限制就用隧道方案)
  • 4.维护成本

flannel:适合小规模集群,维护成本低。集群规模小于 100 台,可以使用 flannel 的 host-gateway
calico:以上相反

注意

当网络模式切换过后,所有的 pod 都需要重新构建才能使用新的网络,故在生产环境切换网络模式代价成本很高,所以需要运维人员在知道产生的后果之后再进行操作。

  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...