Kubernetes之网络模型与网络策略
1. K8s网络模型
k8s的网络模型主要用于解决四类通信需求
1. 同一pod内容器之间的通信
pod内的各个容器共享同一网络名称空间,该名称空间由构建Pod对象的基础架构容器所提供。
同一pod内的容器,彼此之间通过lo接口完成交互

Container1和Container2在同一个pod内,它们之间通信使用lo接口
2. pod之间通信
各pod对象需要运行于同一个平面网络中,每个pod对象拥有一个集群全局唯一的地址并可直接用于与其他pod进行通信

3. Service与Pod之间的通信
每个service对象在集群中拥有一个ClusterIP的固定地址
4. 集群外部到Pod对象之间的通信
2. k8s网络插件CNI
k8s网络遇到的问题:
1. 各docker主机在docker0网桥上默认使用同一个子网,不同节点的容器很可能会得到相同的地址,于是跨节点的容器间通信会面临地址冲突的问题
2. 即使人为设定多个节点上的docker0网桥使用不同的子网,其报文也会因为在网络中缺乏路由信息而无法准备到达
1. flannel网络插件
1. 解决上面的两个问题
1. 预留使用一个网络,而后自动为每个节点的Docker容器引擎分配一个子网,并将其分配信息保存于etcd持久存储。
2. flannel使用的后端
1. VxLAN

工作原理:
将虚拟网络的数据帧添加到VxLAN首部后,封装在物理网络的UDP报文中,然后以传统网络的通信方式传送该UDP报文,待其到达目的主机后,去掉物理网络报文的头部信息以及VxLAN首部,然后将报文交付给目的终端。

VxLAN的DirectRouting模式
通过添加必要的路由信息使用节点的二层网络直接发送Pod的通信报文,仅在跨IP网络时,才启用传统的隧道方式转发通信流量。

在各个节点上查看生成的路由信息,ip route show
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink 10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 10.244.3.0/24 via 10.244.3.0 dev flannel.1 onlink 10.244.4.0/24 via 10.244.4.0 dev flannel.1 onlink 10.244.5.0/24 via 10.244.5.0 dev flannel.1 onlink 10.244.6.0/24 dev cni0 proto kernel scope link src 10.244.6.1 172.16.1.0/24 dev ens160 proto kernel scope link src 172.16.1.21 metric 100 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
在各个集群节点上执行iptables -nL可以看到,iptables filter表的FORWARD链上生成量两条转发规则,放行了10.244.0.0/16网络进出的所有报文。
2. host-gw
通过在节点上创建到达目标容器地址的路由直接完成报文转发,这种方式要求各节点本身必须在同一个二层网络中,不适用于较大的网络规模
3. UDP
使用普通UDP报文封装完成隧道转发
2. flannel的配置参数
默认情况下,flannel的配置信息保存于etcd的键名/coreos.com/network/config之下。config的值是一个JSON格式的字典数据结构。
Network flannel全局网络地址
SubnetLen 切割子网的掩码,默认24
SubnetMin 起始子网
SubnetMax 最大的一个子网
Backend 在指定后端类型
2. calico网络插件
3. k8s网络策略

浙公网安备 33010602011771号