【笔记9】K8S的网络
在K8S集群里,多个节点上的Pod相互通信,要通过网络插件来完成,Kubernetes采用了由CoreOS公司提出的CNI模型。CNI的全称是 Container Network Interface,即容器网络的 API 接口。CNI本身并不能提供网络服务,它只是定义了对容器网络进行操作和配置的规范。CNI仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源,这使得CNI规范非常轻巧、易于实
Pod网络
在K8S集群里,多个节点上的Pod相互通信,要通过网络插件来完成,Kubernetes采用了由CoreOS公司提出的CNI模型。
CNI的全称是 Container Network Interface,即容器网络的 API 接口。
CNI本身并不能提供网络服务,它只是定义了对容器网络进行操作和配置的规范。CNI仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源,这使得CNI规范非常轻巧、易于实现,得到了广泛的支持。
而真正实现和落地这些规范的是CNI插件。常见的CNI插件包括Calico、flannel、Terway、Weave Net 以及 Contiv。
容器间通信
Pod是一个共享网络和存储的一组容器的集合,那么可以根据此特性,将多个有通信需求的容器放在同一个Pod中即可。
Pod间通信
Pod间使用虚拟网桥互联,跨主机通过路由规则连通
Service网络
由于Pod的IP会发生变化,所以需要有一个稳定的IP来固定访问端点。这个就是Service。
Service会生成一个IP地址,并提供一个简单的四层代理,后端是Pod的IP。
Service有以下四种类型:
- ClusterIP:用于集群内Pod间通信
- NodePort:用于集群外访问集群内服务
- LoadBalancer:与外部负载均衡联动,对外暴露服务
- ExternalName:将外部域名映射为内部服务
常用网络插件
网络插件Calico
Calico 是一个用于容器、虚拟机和主机的开源网络和网络安全解决方案。它是一个纯三层(L3)解决方案,利用 BGP协议为容器或虚拟机提供 IP 地址,并提供网络安全功能,包括网络策略和加密。
各组件介绍:
- Felix:Calico Agent,跑在K8S集群中的每台节点上,主要负责管理和维护该节点上的网络和安全策略,如网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等;
- Etcd:分布式键值存储,用来存储网络元数据、安全策略以及节点的状态信息,确保Calico网络状态的一致性和准确性,可以和K8S的etcd合用;
- BGP Client(BIRD):跟Felix一样,每一个节点上都会部署BGP Client,主要负责把Felix写入Kernel的路由信息分发到当前Calico网络,确保各节点间的通信的有效性;
- BGP Route Reflector(BIRD): 在大型网络规模中,如果仅仅使用BGP Client形成mesh全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有BGP Client仅与特定RR节点互联并做路由同步,从而大大减少连接数大规模部署时使用。
关键点:
- Felix会定期查询Etcd数据库,从而获取到IP变化信息,比如说用户在这台机器上创建了一个容器,增加了一个IP等。当它发现数据变更后,比如用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
- BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。
calico三种网络工作模式:
- VXLAN
- IPIP
- BGP
网络插件Flannel
Flannel也是一个CNI插件,它的功能跟Calico一样,为K8S集群中的Pod提供网络支撑,目前支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式。
核心关键点:
- 网络配置:Flannel 配置存储在etcd中。Flannel节点会从etcd中读取这些配置信息,并根据配置创建和管理网络。
- 子网分配:Flannel会为每个节点分配一个不重叠的子网,以便在节点上运行的Pod可以使用该子网内的IP。这样,集群内的每个Pod都将具有唯一的IP地址。
- 数据包封装与转发:Flannel使用数据包封装技术(例如 VXLAN、UDP
等)将Pod之间的通信封装为跨节点的通信。当一个节点上的Pod
需要与另一个节点上的Pod通信时,源节点上的Flannel程序会将数据包封装,添加上目标子网信息,并将封装后的数据包发送到目标节点。目标节点上的Flannel程序会解封装数据包,并将其转发给目标Pod。 - 兼容性:Flannel可以与k8s中的其他网络插件(如
Calico)一起使用,以实现更复杂的网络功能。这使得Flannel可以很好地适应不同的集群环境和需求。
Flannel工作模式:
- VxLAN 模式:使用 flannel.1 进行封包解包,内核原生支持,性能较强;
- host-gw 模式:无需 flannel.1 这样的中间设备,直接宿主机当作子网的下一跳地址,性能最强;
更多推荐
所有评论(0)