一、k8s 网络概述
Kubernetes网络是指在Kubernetes集群中不同组件之间进行通信和交互的网络架构,每个容器都有自己的IP地址,这些容器组成了Pod,Pod是Kubernetes调度的最小单元。
Pod是Kubernetes中最小的部署单元,每个Pod都有一个唯一的IP地址,Pod内的容器共享该IP地址和网络命名空间,pod间通信可以使用多种技术,如Kubernetes默认的CNI插件:Flannel、Calico 等。
二、flannel 网络插件
flannel 网络通信规则
1、 pod 内部容器之间的通信
在Pod内部,容器之间可以通过共享网络命名空间进行通信。所有容器共享Pod的IP地址和网络命名空间,它们可以使用localhost或Pod的IP地址进行通信。可以通过在Pod的配置文件中指定容器之间的端口映射来定义容器之间的通信方式。
例如,在一个Pod中有两个容器A和B,A需要向B发送HTTP请求。可以在Pod的配置文件中为容器A和容器B分别指定端口号,然后在容器A中使用localhost和容器B的端口号进行通信。容器B在接收到请求后可以返回HTTP响应。
2、同一主机不同 pod 之间的通信
Pod A 发送数据到 Pod B
数据包通过Pod A的veth接口到达宿主节点
数据包经由节点的虚拟网桥(如cni0)到达Pod B
3、不同主机上 pod 间通信
Pod A 发送数据到目标Pod(在另一节点上)
数据包经过veth接口到达宿主节点
flanneld对数据包进行VXLAN封装
封装后的数据包通过底层网络传输到目标节点
目标节点的flanneld解封装数据包,并将其路由到目标Pod
优点
结构清晰,易于排查
对系统资源占用较低
缺点
数据包在出节点的情况下,需要发生三次的内核与用户空间拷贝,代价较高
三、calico 网络插件
calico 网络通信规则
Calico的特点就是把每个宿主机当中一个虚拟路由器建立与物理网络对等的虚拟网络,该模式BGP协议在网络中通告路由信息,巧妙的把二层网络转换成三层路由网络,避免报文被二次封装数据转发效率很高,Pod IP可以在物理网络中全局路由
calico 包含组件:
Felix:每个节点都要运行的calico agent,负责配置节点上的路由信息和ACL
ETCD:配置中心,主要负责网络元数据一致性,确保Calico网络状态的准确性
BGP Client(BIRD):主要负责把Felix配置的路由信息分发到当前Calico网络,确保节点间能够进行三层通信
1、 pod 内部容器之间的通信
在Pod内部,容器之间可以通过共享网络命名空间进行通信。所有容器共享Pod的IP地址和网络命名空间,它们可以使用localhost或Pod的IP地址进行通信。可以通过在Pod的配置文件中指定容器之间的端口映射来定义容器之间的通信方式。
例如,在一个Pod中有两个容器A和B,A需要向B发送HTTP请求。可以在Pod的配置文件中为容器A和容器B分别指定端口号,然后在容器A中使用localhost和容器B的端口号进行通信。容器B在接收到请求后可以返回HTTP响应。
2、同一主机不同 pod 之间的通信
Pod A 发送数据到 Pod B(同一节点)
数据包通过veth接口进入宿主机
Felix配置的路由规则直接将数据包路由到Pod B
3、不同主机上 pod 间通信
Pod A 发送数据到目标Pod(另一节点)
数据包到达宿主机,BGP通告的路由规则将数据包直接发送到目标节点
目标节点将数据包路由到目标Pod
优点
高性能:Direct Routing模式避免了封装开销
网络策略控制:支持复杂的安全策略,提供强大的流量控制能力
灵活性:支持多种模式,适配不同的网络需求
稳定性强,效率高
缺点
排查错误困难,安装和管理需要一定经验
参考文档: