下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
基本介绍
在 Kubernetes 中,CNI(Container Network Interface,容器网络接口)是一个标准化的网络模型接口,负责定义容器如何在网络层面进行交互和通信。
CNI 采用一种插件化机制,支持集成不同的网络方案。在容器创建过程中,Kubelet 组件通过调用所需的 CNI 插件,即可使用相应的网络方案完成容器的网络配置,实现灵活的容器网络连接、网络资源释放等功能。常见的 CNI 插件包括 Calico、Flannel、Cilium 等。
由此,CNI 通过标准化接口和插件化机制,为 Container Runtime(容器运行时)和 CNI 插件之间提供了一个通用接口,增强了 Kubernetes 网络的灵活性和可扩展性。
GitHub 地址:https://github.com/containernetworking/cni
CNI 规范文档:https://github.com/containernetworking/cni/blob/main/SPEC.md
基本流程
CNI 与 CRI 协作
在 Kubernetes 中,CRI(Container Runtime Interface,容器运行时接口)是负责管理容器运行时的标准化接口。
CRI 通过调用 CNI 插件来配置或清理容器网络,以确保容器网络配置过程与容器生命周期(主要是容器创建、销毁过程)紧密协调。
以容器创建过程为例,CNI 与 CRI 协作流程大致如下:
其他相关
1、CNI 插件网络模式
2、Bridge 与 veth-pair
Bridge 和 veth-pair 都是 Linux 中的虚拟网络接口。
Pod 通过 veth-pair 将自己的 Network Namespace 与 Node 节点的 Network Namespace 打通,然后使用 Bridge 将所有 veth-pair 连接在一起,实现大量 Pod 之间的互通和管理。
常见的 Bridge 有 docker0(Docker 服务启动时自动创建的网桥)、tunl0(由 Calico 插件的 IPIP 模式创建)、vxlan.calico(由 Calico 插件的 VXLAN 模式创建)。
3、kube-proxy
kube-proxy 作为 Node 节点的一个组件,主要作用是监视 Service 对象和 Endpoint 对象的变化(添加、移除)并刷新负载均衡,即通过 iptables 或 IPVS 配置 Node 节点的 Netfilter,实现网络流量在不同 Pod 间的负载均衡,并为 Service 提供内部服务发现。
kube-proxy 和 CNI 插件本质上都只是为 Linux 内核提供配置,而实际的数据包处理仍由内核完成,因此面临以下问题:
当前,Cilium 等插件通过 eBPF 等技术可以绕过 Linux 内核,直接在用户空间处理数据包,实现了无代理的服务流量转发,完全可以替代 kube-proxy。但需要注意在使用 Istio 的场景下,若出现诸如 Service 对象的 port 与 targetPort 不一致等情况,可能导致 Istio 无法命中对应的路由规则。